grep:global search regular expression and print out the line.全面搜索正则表达式并把行打印出来

是一种强大的文本搜索工具,能够使用正则表达式搜索文本,并把匹配的行打印出来。

linux系统能够使用GNU版本的grep,功能强大。并且可以通过-G/-E/-F命令行选项调用egrep和fgrep。


grep常用用法:

#grep 参数选项 搜索字符串 filename

常用参数:

-a    将bianary文件以text文件方式搜索数据

-c    计算找到‘搜索字符串’的次数

-i    忽略大小写

-n    顺便输出行号

-v    反向选择。即显示出没有‘搜索字符串’内容的行

--color=auto    将找到的关键词部分加上颜色显示


实例:

grep root /etc/passwd

cat /etc/passwd |grep root        都是搜索包含root的行

grep -n root /etc/passwd    搜索包含root的行,并且显示对应行号

grep -v root /etc/passwd    将不包含root的行显示,反向选择

grep -v root /etc/passwd |grep -v transfor    将同时不包含root和transfor的行显示

dmesg |grep -n 'em1'    搜索系统开机信息中包含em1字段的行

dmest |grep -n -A3 -B2 'em1'    在系统开机信息中搜索包含em1字段的行,并且显示前2行和后3行


根据文件内容递归查找目录:

grep 'youandme' *    在当前目录搜索包含‘youandme’行的文件

grep -r 'youandme' *    在当前目录以及其子目录下搜索包含‘youandme’行的文件

grep -l -r 'youandme' *  在当前目录以及其子目录下搜索包含‘youandme’行的文件,但不显示匹配的行,只显示匹配的文件。

这几个命令很有用,查找文件的利器


grep与正则表达式

字符类:

字符类搜索:如果我们想搜索test或tast两个单字时,发现共同的‘t?st’,可以这样搜索:

grep -n 't[ae]st' test.txt

其实[]里面有多少个字节,都只代表其中某一个字节。


字符类反向搜索[^]:如果想搜索包含oo的行,但不想oo前面有g

grep -n '[^g]oo' test.txt


字符类连续字符搜索:如果oo前面不想/想要小写英文字母,或者大写英文,或者数字,或者都有

grep -n '[^a-z]oo' test.txt    

grep -n '[A-Z]oo' test.txt

grep -n '[^0-9]oo' test.txt

grep -n '[a-zA-Z0-9]' test.txt


行首与行尾字符搜索:^$

行首字符:如果想搜索the只在行首出现的行,则需要使用定位字节。

grep -n '^the' test.txt

grep -n '^[a-z]' test.txt    列出行首是小写字母开头的行

grep -n '^[^a-z]' test.txt    列出行首不是小写字母的行

'^'符号,在[]之内和之外的作用是不相同的,在[]之内,代表反向选择;在[]之外,代表定位在行首。


行尾字符:如果想搜索行尾结束为(.)的行

grep -n '\.$' test.txt

PS:因为小数点有其他特殊意义,所以必须用转义字符(\)接触特殊意义。

grep -n '^$' test.txt    找出空白行



任意一个字节(.)和重复字节(*)

(.)    表示一定有一个任意字节的意思

(*)    表示重复前一个字符,0-无穷多次,

如果我们找出 g??d 字符串,即共有4个字节,起头是g,结尾是d

grep -n 'g..d' test.txt    即g和d之间一定存在两个字节

如果搜索出含有oo,ooo,oooo...等数据时,即至少含有两个oo至无数个重复o的行

grep -n 'ooo*' test.txt

PS:(o*) 表示拥有空或1个o以上的字节,包含0个。所以需要搜索至少需要2个o以上字符串时,就需要(ooo*)表示。


如果搜索开头是g和结尾是g,但两者之间仅能存在至少一个o,即gog,goog,gooog,goooog...

grep -n 'goo*g' test.txt

如果搜索开头是g,结尾是g,中间字符可有可无。

grep -n 'g.*g' test.txt

PS:(.*)的RE表示任意字符是很常见的

如果想搜索包含任意数字的行

grep -n '[0-9][0-9]*' test.txt    


限定连续RE(正则表达式regular express)字符范围{}

可以利用(.)和(*)组合,来表示0-无限多个重复字节,那如果限制一个范围区间内的重复字节数

如果想搜索2个到5个连续o,就要使用{},但因为{}在shell中具有特殊意义,所以需要 \ 去意符,使其失去特殊意义。

grep -n 'go\{2,5\}' test.txt

如果需要搜索2个以上连续o,goog,gooog,goo..g

grep -n go\{2,\} test.txt


 grep扩展egrep使用

打印所有包含NW或EA的行。如果不是使用egrep,而是grep,将不会有结果查出。

 # egrep 'NW|EA' testfile     
 northwest       NW      Charles Main        3.0     .98     3       
 eastern         EA      TB Savage           4.4     .84     5
搜索所有包含一个或多个3的行。
# egrep '3+' testfile
# grep -E '3+' testfile
# grep '3\+' testfile        
#这3条命令将会
northwest     NW    Charles Main      3.0     .98     3       34
western       WE   Sharon Gray        5.3     .97     5       23
northeast     NE    AM Main Jr.       5.1     .94     3       13
central       CT    Ann Stephens      5.7     .94     5       13