linux查询筛选命令grep、xargs
grep命令
# grep参数
1.  *: 表⽰当前⽬录所有⽂件,也可以是某个⽂件名
2.  -r 是递归查
3.  -n 是显⽰⾏号
4.  -R 查所有⽂件包含⼦⽬录(递归查询)
5.  -i 忽略⼤⼩写
有意思的命令⾏参数:
grep -i '关键字' ⽂件名(*是查询全部⽂件):不区分⼤⼩写地搜索。默认情况区分⼤⼩写
grep -l  '关键字' ⽂件名:只列出匹配的⽂件名,不列出路径
grep -L  '关键字' ⽂件名:列出不匹配的⽂件名
grep -w  '关键字' ⽂件名:只匹配整个单词,⽽不是字符串的⼀部分(如匹配‘magic’,⽽不是‘magical’)
grep -C number  '关键字' ⽂件名:匹配的上下⽂分别显⽰[number]⾏
grep pattern1 | pattern2 files :显⽰匹配 pattern1(关键字)或 pattern2 的⾏
grep pattern1 files | grep pattern2 :显⽰既匹配 pattern1 ⼜匹配 pattern2 的⾏
有些⽤于搜索的特殊符号:
\< 和 \> 分别标注单词的开始与结尾。
例如:
grep man * 会匹配 ‘Batman’、‘manic’、‘man’等
grep '\<man' * 匹配‘manic’和‘man’,但不是‘Batman’
grep '\<man\>' 只匹配‘man’,⽽不是‘Batman’或‘manic’等其他的字符串。
'^':指匹配的字符串在⾏⾸
'$':指匹配的字符串在⾏尾
多个linux命令配合使⽤
查询不包含match的⽂件列表
ls | xargs grep -L "match"
会把包含aaa的同时不包含bbb的⽂件移动到test⽬录
mv `grep -rl 'aaa' *.php | grep -L 'bbb' *.php` ./test
mv `grep 'aaa' . -r -l| grep 'bbb' . -r -L` ./test
xargs
xargs 是给命令传递参数的⼀个过滤器,也是组合多个命令的⼀个⼯具。它把⼀个数据流分割为⼀些⾜够⼩的块,以⽅便过滤器和命令进⾏处理。
删除数量⽐较多的⽂件
[root@eccs_web client]# ls | xargs -n 20 -t rm -rf
rm -rf abc.doc.bak
ls当然是输出所有的⽂件名(⽤空格分割)
xargs就是将ls的输出,每20个为⼀组(以空格为分隔符),作为rm -rf的参数
也就是说将所有⽂件名20个为⼀组,由rm -rf删除,这样就不会超过命令⾏的长度了
删除某个⽬录下,所有.bak后缀的⽂件:
# find . -name '*.bak' | xargs rm -f
备注:find命令查出符合条件的⽂件,xargs命令,将find到的每⼀个⽂件,作为参数,传给rm命令进⾏处理。
查所有有引⽤SimpleDateFormat这个类的java⽂件:
# find . -name '*.java'  | xargs grep SimpleDateFormat
通常ls列出的⽂件,想直接管道通过rm -rf删除是⽆效的.这时就要配合命令xargs使⽤了:
例如: 按时间排序,删除最后的10个⽂件
ls -t | tail -10 | xargs rm -rf
当然,也可以⽤
ls -lt | tail -100 | awk '{ print $9 }' | xargs rm -rf
两者效果是相同的同理,如果想按时间倒序排列,也就是说离现在最近的时间越排在最后显⽰,就⽤ls -rt当然,也可以使⽤find 配合rm删除。
也可以⽤下⾯的语句清空内容
#!/bin/bash
for i in `ls test.log.??` ;do
echo "">$i
done
当然,如果是多个⽬录下⾯,再清除⽂件,也是可以的。只不过多了⼀层嵌套⽽忆。我的⽬录结构如下:
[root@web tomcat]# ll
总计 260
drwxr-xr-x 2 www www 20480 12-28 09:23 bbs
drwxr-xr-x 2 www www 16384 12-28 00:00 comment
drwxr-xr-x 2 www www 36864 12-28 03:50 enterprise
drwxr-xr-x 2 www www 24576 12-28 00:00 expert
find查命令的使用drwxr-xr-x 2 www www 36864 12-28 00:02 feedback
drwxr-xr-x 2 www www 36864 11-15 12:30 generator
drwxr-xr-x 2 www www 24576 12-28 00:02 passport
drwxr-xr-x 2 www www 20480 12-28 00:00 search
drwxr-xr-x 2 www www 20480 12-28 09:35 usercenter
[root@web comment]# ll
总计 936
-rw-rw-r-- 1 www www      2 12-28 09:57 catalina.2012-12-24.log
-rw-rw-r-- 1 www www      2 12-28 09:57 catalina.2012-12-25.log
-rw-rw-r-- 1 www www      2 12-28 09:57 catalina.2012-12-26.log
-rw-rw-r-- 1 www www      2 12-28 09:57 catalina.2012-12-27.log
-rw-r--r-- 1 www www  34155 12-28 10:01 catalina.out
-rw-rw-r-- 1 www www      2 12-28 09:57 localhost.2012-12-14.log
-rw-rw-r-- 1 www www      2 12-28 09:57 localhost.2012-12-17.log
-rw-rw-r-- 1 www www      2 12-28 09:57 localhost_access_
-
rw-rw-r-- 1 www www      2 12-28 09:57 localhost_access_
-rw-rw-r-- 1 www www  629729 12-28 09:57 localhost_access_
如果想清空以上所有⽬录⾥的所有⽂件,就可以这样做:
for i in `ls`;do (cd $i ;for m in `ls`;do echo " ">$m;done);done
注:上⾯的圆括号是不能少的。
⽽如果想要清空⼀个⽂件的内容,再使⽤xargs配合echo "">file,发现确不能正常⽣效。如:
find . -name "test.*" |xargs echo "">
因为,find和echo的不是这样配合使⽤的。其两者简单配合有另外⼀个妙⽤:
find . -name "file*" -print | xargs echo "" > /tmp/find.log
该语句的作⽤,是将当前⽬录下,所有以file开头的⽂件查到,并将其相对路径及名称输⼊到find.log⽂件中,输⼊⽅式为每⾏⼀个。对符合条件的原⽂件不会做任何改变。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。