grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
1)grep语法:
Usage: grep [OPTION]... PATTERN [FILE]...
2)grep常用选项:
-c: 取消默认输出,输出匹配到字符串的行数
--color:匹配到的字符串高亮显示,选项有--color=auto,never,always
-i : 字符串忽略大小写
-n:显示行号
-v: 反向选择,即显示不匹配字符串的行
-a :将 binary 文件以 text 文件的方式搜寻数据
3)实例演示:
cat a.log
[root@B ~]# cat a.log
print out the line
print out the line2
i am here
i am not here
hello
将包含“print”的行打印出来,并显示行号
[root@B ~]# grep -n "print" a.log
1:print out the line
2:print out the line2
在关键字的显示方面,grep 可以使用 --color=auto 来将关键字部分使用颜色显示。 这可是个很不错的功能啊!但是如果每次使用 grep 都得要自行加上 --color=auto 又显的很麻烦~ 此时那个好用的 alias 就得来处理一下啦!你可以在 ~/.bashrc 内加上这行:『alias grep='grep --color=auto'』再以『 source ~/.bashrc 』来立即生效即可喔! 这样每次运行 grep 他都会自动帮你加上颜色显示啦
将不包含print的行打印出来
[root@B ~]# grep -v "print" a.log
i am here
i am not here
hello
hi
将包含am的行以及包含am的行的前一行,后两行一并打印出来
[root@B ~]# grep "am" a.log -A2 -B1
print out the line2
i am here
i am not here
hello
hi
在当前目录查找"config“行的文件
[root@B ~]# grep "config" *
anaconda-ks.cfg:authconfig --enableshadow --passalgo=sha512
install.log:Installing chkconfig-1.3.49.3-2.el6_4.1.x86_64
install.log:Installing pkgconfig-0.23-9.1.el6.x86_64
install.log:Installing system-config-firewall-base-1.2.27-5.el6.noarch
install.log:Installing authconfig-6.1.12-13.el6.x86_64
在当前目录及子目录递归查找包含"config"行的文件,递归查找可能会查找出很多文件
grep -r "config" *
在当前目录及其子目录下搜索'energywise'行的文件,但是不显示匹配的行,只显示匹配的文件
grep -l "config" *
[root@B ~]# grep -l "config" *
anaconda-ks.cfg
install.log
这几个命令很常用,是查找文件的利器
grep "config" *
grep -r "config" *
grep -l "config" *
4.grep和正则表达式的搭配使用
关于linux正则表达式的介绍可参考,这里不做过多介绍
当我想搜索包含line和long的行时,发现他们有共同的特点l[0i]n,则可以这样查找:
[ ] 表示匹配[ ]里的任意一个字符
[root@B ~]# grep "l[oi]n" a.log
print out the line
print out the line2
this is a long long arrow!
[root@B ~]# grep ".*" a.log
poo!
goo is not goo!
goooo is not poo!
[root@B ~]# grep -n "[^g]oo" a.log
1:poo!
3:goooo is not poo!
搜索oo前不是g的行并打印出来,注意grep默认是开启贪婪模式的,因此第三行的poo被匹配到并打印出来了
如果想匹配包含任意数字或者字母的行,可用[0-9][a-z][A-Z]表示
[root@B ~]# grep -n "[0-9]" a.log
1:poo123!
2:goo is not goo22!
[root@B ~]# grep -n "[a-z]" a.log
1:poo123!
2:goo is not goo22!
3:goooo is not poo!
如果仅想列出goo作为行首出现的行,可用
[root@B ~]# grep -ne "^goo" a.log
2:goo is not goo22!
3:goooo is not poo
如果仅想列出!在行尾的行,可用以下命令,但需要用转义字符\将!转义
[root@B ~]# grep -n "\!$" a.log
1:poo123!
2:goo is not goo22!
3:goooo is not poo!
如果我不想要开头是英文字母,则可以是这样:
grep "^[^a-zA-Z]"a.log
^ 符号,在字符类符号(括号[])之内与之外是不同的! 在 [] 内代表『反向选择』,在 [] 之外则代表定位在行首的意义!
grep -v "^$" a.log > a.log
找出非空白行
{}可以限定范围,例如找出oo重复1到3次的行
[root@B ~]# grep "o\{1,3\}" a.log
poo!
goo is not poo!
poo!
{2}表示两次
{1,3}表示1到3次
{3,} 表示3次和3次以上
通配符
. 表示任意一个字符
*表示重复前面的字符0次到多次
+表示重复前面的字符1次到多次
?表示重复前面的字符0次到1次
4)扩展egrep
egrep == grep -E
egrep可以匹配多个字符串
egrep "goo|foo" a.log
[root@B ~]# egrep "poo|goo" a.log
poo!
goo is not poo!
poo!