grep命令实战详解

来源:互联网 发布:linux查看网卡配置 编辑:程序博客网 时间:2024/06/03 16:44

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正则表达式的介绍可参考http://blog.csdn.net/renwotao2009/article/details/50937038,这里不做过多介绍
当我想搜索包含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!