linux命令grep、egrep、fgrep、xargs

2018-07-04 16:48:32

grep 命令是用来匹配标准输入或指定文件里的内容。

egrep 等同于 grep -E,开启扩展正则表达式支持,也就是对正则支持的更完善。

fgrep 等同于 grep -F,解析 PATTERN为固定的字符串而不是正则表达式,以行为单位匹配。

但一般前者都已经被废弃,平常使用建议用 grep 加上不同选项即可。

grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
-q	安静模式,主要用来判断	
-i	忽略大小写
-v	反向选择
-r	recursive递归,FILE应该指定为目录

-E	扩展正则表达式(对正则支持的更好)
-F      等同于fgrep,会把

--color=auto	   可以将找到的关键字部分加上颜色的显示喔!
--line-buffered    开启行缓冲,会降低性能,为了嵌套grep

-e pattern    一般用来指定多个 PATTERN 和 保证连字符-开头的PATTERN

-a	将binary 文件以 text 文件的方式搜寻数据
-c	计算找到 '搜寻字串' 的次数
-n	顺便输出行号

-l    只列出匹配的文件名称。
-o    只输出文件中匹配到的部分。
-L    只列出不匹配的文件名称。

-Z    用\0字节来分隔文件名,一般与find -print0, perl -0, sort -z, xargs -0 配合
#从tmp.lua里搜寻 sleep 字符串
[root@localhost tmp]# grep 'sleep' tmp.lua
    posix.sleep(2)

#搜寻多个文件
[root@localhost tmp]# grep 'sleep' tmp.lua tmp.txt
tmp.lua:    posix.sleep(2)

#递归搜索当前目录
[root@localhost tmp]# grep -r sleep ./
./tmp.lua:    posix.sleep(2)
./top.txt:Tasks: 108 total,   1 running, 107 sleeping,   0 stopped,   0 zombie
./top.txt:Tasks: 108 total,   1 running, 107 sleeping,   0 stopped,   0 zombie

#多个 PATTERN
[root@localhost tmp]# cat /etc/passwd | grep -e root -e tcpdump
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
#只在.lua和.txt文件中递归搜索字符"freecls"
grep "freecls" ./ -r --include *.{lua,txt}

#在搜索结果中排除freecls文件
grep "abcd" ./ -r --exclude "freecls"

#在搜索结果中排除filelist文件列表里的文件
grep "freecls" ./ -r --exclude-from filelist
#\0(null)字节分割文件名而不是用换行符
[root@localhost tmp]# grep -r sleep ./ -lZ
./tmp.lua./top.txt

#然后利用xargs来处理
[root@localhost tmp]# grep -r sleep ./ -lZ | xargs -0 ls
./tmp.lua  ./top.txt
#不输出任何,成功返回0,失败返回非0
#一般用来当测试条件
grep -q "freecls" filename

#0代表成功,非0代表失败
echo $?

#也可以利用一句话
grep -q 'root' /etc/group || echo 'no root'
#监控mysql查询语句例子
tail -f /var/log/mysql.log | grep -vE 'count\(\*\)|Prepare'

#嵌套 grep
#包含 Execute 而不包含 count(*)
tail -f /var/log/mysql.log | grep --line-buffered Execute | grep -vE 'count\(\*\)'

#简单排除多个
tail -f /var/log/mysql.log | grep --line-buffered -v 'Prepare\|Close\|SHOW COLUMNS\|Connect'


xargs 可以连接组合多个命令。可以将标准输入数据转换成命令行参数,xargs 能够处理管道或者stdin并将其转换成命令参数。xargs也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。

xargs 不带命令默认为 echo命令。

-0  以\0空字符作为分隔符
-d  指定分隔符
-n  指定最大参数个数

-I  替换字符串

-a file    从文件里读取内容
[root@localhost tmp]# cat tmp.txt 
aaaa cccc
bbbb
freecls

沧浪水

http://www.freecls.com
[root@localhost tmp]# cat tmp.txt | xargs
aaaa cccc bbbb freecls 沧浪水 http://www.freecls.com

[root@localhost tmp]# cat tmp.txt | xargs -d '\n'
aaaa cccc bbbb freecls  沧浪水  http://www.freecls.com

[root@localhost tmp]# cat tmp.txt | xargs echo
aaaa cccc bbbb freecls 沧浪水 http://www.freecls.com

[root@localhost tmp]# cat tmp.txt | xargs -n1
aaaa
cccc
bbbb
freecls
沧浪水
http://www.freecls.com
#利用-I来占位
[root@localhost tmp]# cat tmp.txt | xargs -I {} ls {} -l
ls: cannot access aaaa cccc: No such file or directory
ls: cannot access bbbb: No such file or directory
ls: cannot access freecls: No such file or directory
ls: cannot access 沧浪水: No such file or directory
ls: cannot access http://www.freecls.com: No such file or directory

#就相当于执行
ls aaaa cccc -l
ls bbbb -l
...

#复制文件
[root@localhost tmp]# mkdir iii
[root@localhost tmp]# ls *.txt
tmp.txt  top.txt

#相当于执行 cp tmp.txt iii/,cp top.txt iii/
[root@localhost tmp]# ls *.txt | xargs -n1 -I {} cp {} iii/
[root@localhost tmp]# ll iii
-rw-r--r--. 1 root root    58 Jul  4 05:56 tmp.txt
-rw-r--r--. 1 root root 17925 Jul  4 05:56 top.txt

结合 find

[root@localhost tmp]# ll
total 28
-rw-r--r--. 1 root root     0 Jul  4 06:05 freecls 沧浪水
-rw-r--r--. 1 root root   152 Jul  3 10:19 tmp.lua
-rw-r--r--. 1 root root    58 Jul  4 05:49 tmp.txt
-rw-r--r--. 1 root root 17925 Jul  3 21:58 top.txt
[root@localhost tmp]# find . -type f | xargs -n1 ls
./tmp.lua
./top.txt
./tmp.txt
ls: cannot access ./freecls: No such file or directory
ls: cannot access 沧浪水: No such file or directory
[root@localhost tmp]# find . -type f -print0 | xargs -n1 -0 ls
./tmp.lua
./top.txt
./tmp.txt
./freecls 沧浪水

[root@localhost tmp]# find . -type f -print0 | xargs -0 ls
./freecls 沧浪水  ./tmp.lua  ./tmp.txt	./top.txt

#打包压缩
[root@localhost tmp]# find . -type f -print0 | xargs -0 tar -cvjf freecls.tar.bz2


备注:
1.本系列命令都在centos7里测试,其他发行版如ubuntu、debian、fedora、opensuse等可能略微不同
2.本文只讲解常用用法,详细用法请自行利用 man 命令查看
3.原文地址http://www.freecls.com/a/2712/81

 

©著作权归作者所有
收藏
推荐阅读
简介
天降大任于斯人也,必先苦其心志。