先说说grep命令能做什么?
我们可以使用grep命令在文本中查找指定的字符串,就像你在windows中打开txt文件,使用快捷键 “Ctrl+F” 在文本中查找某个字符串一样,说白了,可以把grep理解成字符查找工具。
grep是Linux中最常用的”文本处理工具”之一,grep与sed、awk合称为Linux中的三剑客。
grep的全称为: Global search Regular Expression and Print out the line
全称中的”Global search”为全局搜索之意。
全称中的”Regular Expression”表示正则表达式。
所以,从grep的全称中可以了解到,grep是一个可以利用”正则表达式”进行”全局搜索”的工具,grep会在文本文件中按照指定的正则进行全局搜索,并将搜索出的行打印出来。
当然,不使用正则表达式时也可以使用grep,但是当grep与正则表达式结合在一起时,威力更强大。
我们先来看一个最简单的使用示例,从最简单的示例开始认识grep。
于是,testgrep文件中的第一行被打印了出来,默认情况下,grep是区分大小写的,所以,文件中包含大写”TEST”的行没有被打印出来。
grep的使用是不是很简单,我们继续聊。
在centos6中,我们使用grep在文本中搜索出的行虽然会被打印了出来,但是在打印这些行时,被匹配到的关键字没有高亮显示,如果我们想要高亮显示行中的关键字,该怎么办呢?我们可以使用”–color”选项,高亮显示行中的关键字,示例如下
如上图所示,当没有使用”-o”选项时,包含”123″字符串的行都会被打印出来,当同一行中包含多个”123″时,所在行会被打印出来,对应的关键字也会高亮显示,当使用了”-o”选项时,每个被匹配到的关键字都会被单独打印在一行中,如上图所示,第三个”123″与第四个”123″都属于第10行的文本,但是它们仍然各自独占一行的输出了。
其实,我们在使用grep命令搜索文本时,往往有这种需求:在找到对应的关键字时,同时需要显示关键字附近的信息,什么意思呢?
我们来看一个场景,就能明白,我们新建了一个测试文件:testgrep1,测试文件内容如下

假设,我们想从testgrep1文件中找出”年龄为18″的人,我们该怎么找呢?你可能会尝试使用如下命令。

如上图所示,我们是匹配到了”年龄:18″的行,但是我们并不能从结果中得知年龄为18的人的姓名,因为姓名与年龄并不在一行中,那么我们该怎么办呢?
如上图所示,包含字符串”年龄:18″的行被高亮输出了,同时,符合条件的行”之前的一行”也被打印了出来,这时,我们就能从结果中得知,朱双印今年18岁,王尼美今年18岁。
没错,上例中的”-B1″选项表示显示符合条件的行的同时还显示之前的1行,举一反三,”-B5″代表同时显示之前的5行,”-B3″代表同时显示之前的3行,”-B”选项的后面必须有数字,否则会报错。
与”-B”选项对应的选项是”-A”选项,”-B”有Before之意,”-A”有After之意,聪明如你,一定已经猜到了”-A”的含义,没错,”-A”代表显示符合条件的行的同时,还要显示之后的行,”-A3″表示同时显示符合条件的行之后的3行,我就不再赘述了。
这样我们就能看到”年龄是18岁”的人的所有信息了。
上图中,当我们在文本中搜索”zsy”字符串的时候,”zsy”、”zsythink”、”123zsy123″所在的行都被匹配到了,因为”zsythink”中也包含了”zsy”,所以也被匹配到了,但是当我们想要”精确匹配”zsy字符串的时候,按照上例中的方法就无法做到了,所谓的精确匹配,就是”zsy”作为一个独立的单词存在,而不是包含于某个字符串中,那么,如果有这种需求,我们怎么办呢?使用”-w”选项可以实现我们的需求,示例如下。

如上图所示,只有”zsy”作为一个独立的单词存在的时候,才会被匹配到,”zsy”包含于某个字符串的时候,则不会被匹配到,这就是所谓的精确匹配,”-w”有word之意,表示搜索的字符串作为一个独立的单词时才会被匹配到。
有的时候,我们需要反向查找,比如,查找”不包含某个字符串”的行,这个时候,我们需要用到”-v”选项,示例如下。

上例表示查找出文本中不包含”zsy”字符串的行。
某些场景下,我们可能想要同时从多个目标中匹配,什么意思呢?看了示例就秒懂,示例如下。

上例中,我们同时在文本中搜索了”abc”字符串与”test”字符串,包含这两个字符串中任意一个的行都会被打印出来,没错,就像上图中的示例一样,使用”-e”选项可以同时匹配多个目标,多个目标之间存在”或”关系,即匹配其中的任意一个都算作匹配成功。
当使用”-q”选项时,表示grep使用静默模式,静默模式下grep不会输入任何信息,无论是否匹配到指定的字符串,都不会输出任何信息,所以,我们需要配合”echo $?”命令,查看命令的执行状态,如果返回值为0,证明上一条grep命令匹配到了指定的字符串,如果返回值为1,则证明上一条grep命令没有匹配到指定的字符串,就像上图示例中显示的那样,静默模式下,grep没有输出任何信息,当我们在testgrep文本中查找”test”字符串时,可以匹配到结果,当在文本中查找”ttttttttttttt”字符串的时候,没有匹配到结果,所以,我们只关心有没有匹配到指定字符时,可以使用”-q”选项,但是需要配合”echo $?”命令查看执行状态。
注:如果你对正则表达式还不熟悉,可以先跳过下面的示例,本博客中会对”正则表达式”进行详细总结。
正则表达式系列文章直达链接:正则表达式详解
文章开头说了,grep可以利用正则表达式进行搜索,但是之前的举例中,grep都没有使用正则表达式,只是纯粹的去查找一些字符串,这次,我们使用grep命令,配合正则表达式,来查找我们想要的目标。
眼尖的你肯定发现了,上图中的正则表达式为扩展正则表达式,而不是基础正则表达式,所以,在上述命令中,我使用了”-E”选项。
在使用”-E”选项时,grep才支持”扩展正则表达式”,不使用”-E”选项时,grep默认只支持”基本正则表达式”。
不同的开发语言中,正则表达式的规则可能略有不同,我们在使用grep时,可以使用”-P”选项,指明使用perl兼容的正则表达式。
示例如下:

好了,grep的常用选项我们已经总结完毕,剩下需要做的就是不断的练习了。
其实,除了grep命令,其实还有egrep命令,还有fgrep命令(fast grep),它们有各自的特点。
grep:支持基本正则表达式
egrep:支持扩展正则表达式,相当于grep -E
fgrep:不支持正则表达式,只能匹配写死的字符串,但是速度奇快,效率高,fastgrep
–color=auto 或者 –color:表示对匹配到的文本着色显示
-i:在搜索的时候忽略大小写
-n:显示结果所在行号
-c:统计匹配到的行数,注意,是匹配到的总行数,不是匹配到的次数
-o:只显示符合条件的字符串,但是不整行显示,每个符合条件的字符串单独显示一行
-v:输出不带关键字的行(反向查询,反向匹配)
-w:匹配整个单词,如果是字符串中包含这个单词,则不作匹配
-Ax:在输出的时候包含结果所在行之后的指定行数,这里指之后的x行,A:after
-Bx:在输出的时候包含结果所在行之前的指定行数,这里指之前的x行,B:before
-Cx:在输出的时候包含结果所在行之前和之后的指定行数,这里指之前和之后的x行,C:context
-e:实现多个选项的匹配,逻辑or关系
-q:静默模式,不输出任何信息,当我们只关心有没有匹配到,却不关心匹配到什么内容时,我们可以使用此命令,然后,使用”echo $?”查看是否匹配到,0表示匹配到,1表示没有匹配到。
-P:表示使用兼容perl的正则引擎。
-E:使用扩展正则表达式,而不是基本正则表达式,在使用”-E”选项时,相当于使用egrep。
希望这篇文章能对你有所帮助~~
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/178424.html原文链接:https://javaforall.net
