NoteDeep
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与正则表达式结合在一起时,威力更强大

为以下实验方便,准备了一个测试文件,名为testgrep,如下所示:
在testgrep文件中搜索包含test字符串的行
从上图示例中可以看出,包含TEST字符串的行没有被打印出来,说明默认情况下,grep是区分大小写的
如果在搜索字符串时,不区分大小写,可以使用选项 -i ,如下图
如果在搜索时想要知道,哪些行文本包含搜索的字符串,可以使用 -n 选项,如下图:
可以看出,在加了 -n 选项后,包含test字符串的行是第一和第二行,即 -n 选项可以在搜索时显示行号
如果只是想要知道有多少行包含指定的字符串,而不在乎哪些行包含这些字符串,可以使用 -c 选项,如下图:
可以看出,符合条件的只有两行,使用 -c 选项即可只统计符合条件的总行数,而不会打印出整行

注:Centos6中要高亮显示打印结果,需要添加 --color 选项,Centos7中因为设置了别名,默认是高亮显示结果的

如果只想打印匹配的的关键字,而不是打印整行,可以使用 -o 选项,如下图:
但是需要注意, -o 选项会把每个匹配到的关键字都单独显示在一行中进行输出,如下图:
可以看到第二和第三个123 都是属于 第三行的文本,但它们仍然各自独占一行的输出了

如果在一个搜索文本中,打印出与匹配结果相同的行和改行的前一行或者前两行时,可以使用 -B 选项,B有before之意,选项 -A 是打印后面的行数,A有after之意,选项 -C 是打印上下行数,C有context之意,上下文。用法如下:
-B/-A/-C后面必须有数字,后面的数字表示行数,-B1 前一行,-B3 前面三行,以此类推

如果想要精确匹配搜索的字符串,可以使用 -w 选项,所谓精确匹配就是讲指定的字符串作为一个独立的单词存在,而不是包含于某个字符串中
如果想要同时匹配多个字符,可以使用 -e 选项,-e 选项可以同时匹配多个目标,多个目标之间存在“或”关系,即匹配其中任意一个都算匹配成功,如下图:
如果想要查找不包含某个字符串,即反选,可以使用选项 -v 即不包含指定字符串,如下图:
在写脚本时,有时只是想要利用grep判断文本中是否存在某个字符串,即只关心有没有匹配到,而不关心匹配到的内容,此时,可以使用grep的静默模式,如下图:
从上图可以看出,当使用 -q 选项时,表示grep使用静默模式,该模式下grep不会输出任何信息,无论匹配成功,都不会输出任何信息,此时要结合 echo $? 命令,查看grep的执行状态,如果返回值为0,表示匹配成功,如果返回值为1,表示匹配失败

就像笔记开头说的那样,grep结合正则表达式,威力很大,对于正则表达式,可以见正则表达式页面树

总结:为了方便回顾,将grep常用的选项总结如下
--color=auto或者--color:表示对匹配到的文本高亮显示(Centos6)
-i:搜索时不区分大小写
-n:显示匹配结果所在行号
-c:统计匹配到的行数,注意,是匹配到的总行数,不是匹配到的次数
-o:只显示符合条件的字符串,但不是整行显示,每个符合条件的字符串单独显示一行
-v:反向查询
-w:匹配整个单词,即精确匹配
-Ax:在输出时包含结果所在行之后的指定行数
-Bx:在输出时包含结果所在行之前的指定行数
-Cx:在输出时包含结果所在行之前和之后的指定行数
-e:实现多个选项的匹配,逻辑or关系
-q:静默模式,需要与echo $?联合用
-P:表示使用兼容perl的正则引擎
-E:使用扩展正则表达式,而不是基本正则表达式

评论列表