本博客为grep记录总结,如果你是新手请从开始阅读,如果是老司机想要回顾grep请直接阅读后面的总结

先说说grep命令能做什么?
grep是Linux中最常用的”文本处理工具”之一,grep与sed、awk合称为Linux中的三剑客。我们可以理解为grep是一个可以利用正则表达式进行全局搜索的一个工具,grep会在文本文件中按照指定的正则进行全局搜索,并将搜索出的行打印出来。不使用正则表达式时也可以使用grep,但是当grep与正则表达式结合在一起时,威力更强大。

好了下面我们开始实操来体验grep
我们准备了下面的一个测试文件,本文没有特殊说明将以这个测试文件来验证我们所提到的操作

[root@localhost grep]# cat testgrep 
zyc test
zyc TEST
zyc123
123zyc123
zyc123zyc
姓名:张三
年龄:18
爱好:K歌,跳舞

姓名:赵六
年龄:25
爱好:喝酒

姓名:李四
年龄:18
爱好:打麻将

1,我们想要找出文件中包含test的所有行

[root@localhost grep]# grep 'test' testgrep 
zyc test

但是我们看到只是输出了zyc test这一行,zyc TEST这行并没有输出,这是因为linux默认是区分大小写的所以只输出了zyc test,如果我们想不区分大小写要怎么办呢,可以使用"-i"参数

[root@localhost grep]# grep -i 'test' testgrep 
zyc test
zyc TEST

有时候为了确认我们查询的是在第几行,还可以加上"-n"参数,来现实行号

[root@localhost grep]# grep -i -n 'test' testgrep 
1:zyc test
2:zyc TEST

上面我们通过匹配关键字会把整行都打印出来,现在我如果不想打印整行,只想打印出我匹配到关键字怎么办呢,我们可以使用"-o"参数

[root@localhost grep]# grep -i -n -o 'test' testgrep 
1:test
2:TEST

这里需要注意,"-o"会把每个匹配到的关键字都单独行显示,意思就是,算了,看下面的例子吧
我想匹配123关键字并输出

[root@localhost grep]# grep -i -n -o '123' testgrep 
3:123
4:123
4:123
5:123
这里123有两个都属于第四行

有时候我们还会有这样的一个需求,就是输出指定行附近的行,下面看个例子
比如我想找到年龄为18的人的姓名

[root@iZbp19obnr01zl0jrho17wZ data]# grep -B1 "年龄:18" testgrep 
姓名:张三
年龄:18
--
姓名:李四
年龄:18

上例中的”-B1″选项表示显示符合条件的行的同时还显示之前的1行,举一反三,”-B5″代表同时显示之前的5行,”-B3″代表同时显示之前的3行,”-B”选项的后面必须有数字,否则会报错。
与”-B”选项对应的选项是”-A”选项,”-B”有Before之意,”-A”有After之意,聪明如你,一定已经猜到了”-A”的含义,没错,”-A”代表显示符合条件的行的同时,还要显示之后的行,”-A3″表示同时显示符合条件的行之后的3行

说了”-A”,说了”-B”,现在说说”-C”,”-C”选项可以理解为”-A与-B”的结合,”-C”选项表示在显示符合条件的行的同时,也会显示其前后的行,如”-C1″,”-C1″表示打印符合条件的行的同时,也打印出之前的一行与之后的一行,”-C”有Context之意(上下文之意),示例如下。

[root@iZbp19obnr01zl0jrho17wZ data]# grep -C1 "年龄:18" testgrep 
姓名:张三
年龄:18
爱好:K歌,跳舞
--
姓名:李四
年龄:18
爱好:打麻将

更多的时候我们需要精确匹配一些字符,意思就是我们需要匹配的字符串在一行里为一个单独的单词的时候才会进行匹配
例如,我想精确匹配zyc这个字符串

[root@iZbp19obnr01zl0jrho17wZ data]# grep "zyc" testgrep 
zyc test
zyc TEST
zyc123
123zyc123
zyc123zyc
[root@iZbp19obnr01zl0jrho17wZ data]# grep -w "zyc" testgrep 
zyc test
zyc TEST

可以看到我们可以使用-w参数来实现这个需求,这个对编写脚本用处很大

有的时候,我们需要反向查找,比如,查找”不包含某个字符串”的行,这个时候,我们需要用到”-v”选项,这里我想要输出不带zyc字符串的行,示例如下。

[root@iZbp19obnr01zl0jrho17wZ data]# grep -v "zyc" testgrep 
姓名:张三
年龄:18
爱好:K歌,跳舞

姓名:赵六
年龄:25
爱好:喝酒

姓名:李四
年龄:18
爱好:打麻将

某些场景下,我们可能想要同时从多个目标中匹配,什么意思呢?看了示例就秒懂,示例如下。

[root@iZbp19obnr01zl0jrho17wZ data]# grep -e "test" -e 123 testgrep 
zyc test
zyc123
123zyc123
zyc123zyc

上例中,我们同时在文本中搜索了”test”字符串与”123”字符串,包含这两个字符串中任意一个的行都会被打印出来,没错,就像上图中的示例一样,使用”-e”选项可以同时匹配多个目标,多个目标之间存在”或”关系,即匹配其中的任意一个都算作匹配成功。

在写脚本时,你可能只是想要利用grep判断文本中是否存在某个字符串,你只关心有没有匹配到,而不关心匹配到的内容,你只关心有,或者没有,这时,我们可以使用grep的静默模式,示例如下。

[root@iZbp19obnr01zl0jrho17wZ data]# cat testgrep 
zyc test
zyc TEST
zyc123
123zyc123
zyc123zyc
姓名:张三
年龄:18
爱好:K歌,跳舞

姓名:赵六
年龄:25
爱好:喝酒

姓名:李四
年龄:18
爱好:打麻将

[root@iZbp19obnr01zl0jrho17wZ data]# grep -q "test" testgrep
[root@iZbp19obnr01zl0jrho17wZ data]# echo $?
0
[root@iZbp19obnr01zl0jrho17wZ data]# grep -q "ttttt" testgrep
[root@iZbp19obnr01zl0jrho17wZ data]# echo $?
1

当使用”-q”选项时,表示grep使用静默模式,静默模式下grep不会输入任何信息,无论是否匹配到指定的字符串,都不会输出任何信息,所以,我们需要配合”echo $?”命令,查看命令的执行状态,如果返回值为0,证明上一条grep命令匹配到了指定的字符串,如果返回值为1,则证明上一条grep命令没有匹配到指定的字符串,就像上图示例中显示的那样,静默模式下,grep没有输出任何信息,当我们在testgrep文本中查找”test”字符串时,可以匹配到结果,当在文本中查找”ttttt”字符串的时候,没有匹配到结果,所以,我们只关心有没有匹配到指定字符时,可以使用”-q”选项,但是需要配合”echo $?”命令查看执行状态。

文章开头说了,grep可以利用正则表达式进行搜索,但是之前的举例中,grep都没有使用正则表达式,只是纯粹的去查找一些字符串,这次,我们使用grep命令,配合正则表达式,来查找我们想要的目标。
正则表达式不理解的可以参考本人以下几篇博客
基础正则-位置匹配
基础正则-连续次数匹配
基础正则常用符号
基础正则分组与后向引用
扩展正则表达式
比如,我们想要查找某个文本中的合法邮箱,示例如下
在这里插入图片描述
眼尖的你肯定发现了,上图中的正则表达式为扩展正则表达式,而不是基础正则表达式,所以,在上述命令中,我使用了”-E”选项。

在使用”-E”选项时,grep才支持”扩展正则表达式”,不使用”-E”选项时,grep默认只支持”基本正则表达式”。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐