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’,而不是‘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 imag2e.tgz.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
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_log.2012-12-25.txt
-rw-rw-r-- 1 www www       2 12-28 09:57 localhost_access_log.2012-12-26.txt
-rw-rw-r-- 1 www www  629729 12-28 09:57 localhost_access_log.2012-12-27.txt
如果想清空以上所有目录里的所有文件,就可以这样做:

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文件中,输入方式为每行一个。对符合条件的原文件不会做任何改变。

你可能感兴趣的:(linux,笔记,linux,服务器)