grep 命令基本用法

时间:2020-12-03 10:35:14

1、grep 命令基本用法(1)

grep命令是支持正则表达式的一个多用途文本搜索工具,grep的一般格式为:

 
  1. grep [选项][模式][文件…] 

grep命令由选项、模式和文件三部分组成,它在一个或多个文件中搜索满足模式的文本行,模板后的所有字符串被看做文件名,文件名可以有多个,搜索的结果被打印到屏幕,不影响原文件的内容。grep命令的选项用于对搜索过程进行补充说明,grep命令的选项及其意义如表3-3 所示。

表3-3 grep命令选项及其意义

grep 命令基本用法 
grep命令的模式十分灵活,可以是字符串,也可以是变量,还可以是正则表达式。需要说明的是,无论模式是何种形式,只要模式中包含空格,就需要使用双引号将模式引起来,如果不加双引号,空格后的单词容易被误认为是文件名,如普通字符串为"hello world",grep hello world命令就将world认为是文件名,因此,grep"hello world"filename才是正确的写法。大部分情况下,使用单引号将模式引起来也是可以的,第6 章将详细讨论双引号和单引号的区别,在此,我们只简单告诉读者:一旦模式中包含空格,就需要使用双引号或单引号将模式引起来。下面的例3-24 可以充分验证这个观点。
 
  1. #例3-24:模式包含空格时,是否使用双引号的区别  
  2. #搜索00.pem 文件中包含certificate字符串的行,不需要引号引起模式  
  3. [root@zawu globus]# grep certificate 00.pem  
  4. The above string is known as your user certificate subject, and it  
  5. To install this user certificate, please save this e-mail message  
  6. If you have any questions about the certificate contact  
  7. #若需要搜索00.pem 文件中包含user certificate字符串的行  
  8. #我们看一看不用引号将user certificate引起来的结果  
  9. [root@zawu globus]# grep user certificate 00.pem  
  10. grep: certificate: 没有那个文件或目录  
  11. #Shell将certificate 解析为文件名,提示没有此文件的错误  
  12. #下面给出00.pem文件中包含user 字符串的行  
  13. 00.pem:The above string is known as your user certificate subject, and it  
  14. 00.pem:uniquely identifies this user.  
  15. 00.pem:To install this user certificate, please save this e-mail message  
  16. 00.pem:/home/globus/.globus/usercert.pem  
  17. #用引号将user certificate引起来后得到正确的结果  
  18. [root@zawu globus]# grep "user certificate" 00.pem  
  19. The above string is known as your user certificate subject, and it  
  20. To install this user certificate, please save this e-mail message  
  21. [root@zawu globus]# 

例3-24 首先搜索00.pem文件中包含certificate 字符串的行,由于模式certificate 中不包含空格,因此,是否用引号引起模式对grep 命令不产生影响。当我们要搜索00.pem 文件中包含user certificate 字符串的行时,不用双引号将user certificate 括起来时,Shell 提示没有certificate 这个文件或目录,然后,给出00.pem 文件中包含user 字符串的行,这说明Shell将grep user certificate 00.pem这条命令解释为在certificate和00.pem两个文件中搜索包含user字符串的行,这显然与我们的初衷不符。而当我们用双引号将user certificate括起来后,就得到了正确的结果。

grep支持多文件查询,请看下面的例3-25。

 
  1. #例3-25:演示grep 的多文件查询  
  2. [root@zawu globus]# grep Certificate 00.pem 08.pem  
  3. 00.pem:This is a Certificate Request file:  
  4. 00.pem:Certificate Subject:  
  5. 08.pem:Certificate:  
  6. [root@zawu globus]# 

上例搜索00.pem 和08.pem 两个文件中包含Certificate 字符串的行,命令逐个给出待搜索的文件,结果打印出所有包含Certificate字符串的行,并以文件名开头。

2、grep 命令基本用法(2)

grep命令指定多个文件时可以使用通配,这样就不必逐个给出待搜索的文件了,例3-25的命令可以改成如例3-26所示的等价命令。

 
  1. #例3-26:用通配表示多文件  
  2. [root@zawu globus]# grep Certificate 0?.pem  
  3. 00.pem:This is a Certificate Request file:  
  4. 00.pem:Certificate Subject:  
  5. 08.pem:Certificate:  
  6. [root@zawu globus]# 

上例利用0?.pem代替了00.pem和08.pem两个文件,显得十分简洁。

表 3-3已经列出了grep命令的选项,下面我们结合具体例子逐个说明grep选项的含义和用法。

1.-c 选项

-c选项表示输出匹配字符串行的数量,默认情况下,grep命令打印出包含模式的所有行,一旦加上-c选项,就只显示包含模式行的数量,下面给出一个使用-c选项的例子。

 
  1. #例3-27:grep -c 的用法  
  2. [root@zawu globus]# grep -c Certificate *.pem  
  3. 00.pem:2 #00.pem文件中有2 行包含Certificate  
  4. 08.pem:1  
  5. 11.pem:1  
  6. [root@zawu globus]# 

例3-27 对当前目录下所有.pem的文件查找Certificate 关键字,指定文件使用了通配,结果00.pem:2 表示00.pem中有2 行包含关键字Certificate,08.pem和11.pem各有1 行包含关键字Certificate。

2.-n选项

-n选项列出所有的匹配行,并显示行号。默认情况下,grep搜索单个文件时,只显示每行的内容,搜索多个文件时,显示文件名及每行的内容,加上-n选项后,将在行内容前附加显示行号,下面给出一个使用-n选项的例子。

 
  1. #例3-28:grep -n 的用法  
  2. [root@zawu globus]# grep -n Certificate *.pem  
  3. 00.pem:1:This is a Certificate Request file: #00.pem文件的第1 行  
  4. 00.pem:7:Certificate Subject:  
  5. 08.pem:1:Certificate:  
  6. 11.pem:1:Certificate:  
  7. [root@zawu globus]# 

例3-28 仍然对当前目录下所有.pem 的文件查找Certificate 关键字,结果00.pem:1:表示00.pem文件的第1 行包含Certificate关键字,并列出00.pem的第1行具体内容。对于08.pem和11.pem的搜索也同样显示了行号。

3.-v 选项

-v选项显示不包含模式的所有行,下面给出一个使用-v选项的例子。

 
  1. #例3-29:grep -v 的用法  
  2. [root@zawu globus]# grep -vc Certificate *.pem #同时使用-v和-c选项  
  3. 00.pem:39 #00.pem文件中有39行不包含Certificate字符串  
  4. 08.pem:50  
  5. 11.pem:50  
  6. [root@zawu globus]# 

例3-29 结合使用-v 和-c 参数列出00.pem文件中不包含Certificate 关键字的行数,结果00.pem:39 表示00.pem文件中有39 行不包含Certificate 字符串。例3-29 还说明grep 命令可同时使用多个选项。

4.-i 选项

默认情况下,grep命令对大小写是敏感的,如果加上-i选项就表示grep命令不区分大小写,下面给出一个使用-i选项的例子。

 
  1. #例3-30:grep -i 的用法  
  2. [root@zawu globus]# grep -i certificate 00.pem  
  3. This is a Certificate Request file:  
  4. Certificate Subject:  
  5. The above string is known as your user certificate subject, and it  
  6. To install this user certificate, please save this e-mail message  
  7. If you have any questions about the certificate contact  
  8. -----BEGIN CERTIFICATE REQUEST-----  
  9. -----END CERTIFICATE REQUEST-----  
  10. [root@zawu globus]# 

上例在00.pem文件中搜索不区分大小写的certificate 字符串的所有行,可以看出,结果匹配到Certificate、CERTIFICATE 等关键字。

5.-h选项

-h选项表示查询多文件时不显示文件名,默认情况下,grep命令查询多个文件时,在匹配行之前显示文件名,加上-h选项后,grep命令将不再显示文件名。下面给出一个使用-h选项的例子。

 
  1. #例3-31:grep -h 的用法  
  2. [root@zawu globus]# grep -h Certificate *.pem  
  3. This is a Certificate Request file: #在匹配行前不再显示文件名了  
  4. Certificate Subject:  
  5. Certificate:  
  6. Certificate:  
  7. [root@zawu globus]# 

例3-31 仍然是在当前目录下所有.pem的文件中查找{Certificate字符串,加上-h后,结果就只显示匹配行的内容,而不显示文件名。注意例3-31 与例3-28 中grep打印结果的区别。

6.-l 选项

-l 选项表示只列出符合匹配的文件名,而不列出具体匹配行,下面给出一个使用-l 选项的例子。

 
  1. #例3-32:grep -l 的用法  
  2. [root@zawu globus]# grep -l Certificate *  
  3. 00.pem #只显示包含Certificate 字符串的文件名  
  4. 08.pem  
  5. 11.pem  
  6. [root@zawu globus]# 

例3-32 的命令用于搜索当前目录下所有的文件中包含Certificate字符串的文本行,加上-l选项后,在结果中不再显示具体的匹配行,只列出包含Certificate字符串的文件名。

7.-s 选项

-s 选项表示不显示不存在或无匹配文本的错误信息,默认情况下,grep 在待搜索文件不存在或搜索不到符合模式的文本行时将打印错误信息。下面给出一个使用-s选项前后比较的例子。

 
  1. #例3-33:grep -s 的用法  
  2. [root@zawu globus]# grep user certificate 00.pem #未使用-s 选项  
  3. grep: certificate: 没有那个文件或目录#打印了错误信息  
  4. 00.pem:The above string is known as your user certificate subject, and it  
  5. 00.pem:uniquely identifies this user.  
  6. 00.pem:To install this user certificate, please save this e-mail message  
  7. 00.pem:/home/globus/.globus/usercert.pem  
  8. [root@zawu globus]# grep -s user certificate 00.pem #使用-s选项后,不打印错误信息  
  9. 00.pem:The above string is known as your user certificate subject, and it  
  10. 00.pem:uniquely identifies this user.  
  11. 00.pem:To install this user certificate, please save this e-mail message  
  12. 00.pem:/home/globus/.globus/usercert.pem  
  13. [root@zawu globus]# 
例3-33 给出同样的命令使用-s 选项前后的结果,两条命令都是在certificate和00.pem两个文件中搜索user 字符串,当未使用-s 选项时,提示certificate 文件不存在的错误信息,但是,在grep后加上-s选项后,就不再打印错误信息了。

8.-r 选项

默认情况下,grep命令只对当前目录下的文件进行搜索,而不对子目录中的文件进行搜索。-r 选项表示递归搜索,不仅搜索当前目录,而且搜索子目录。下面举一个-r选项的例子。

 
  1. #例3-34:grep -r 的用法  
  2. [root@zawu globus]# grep -r CERTIFICATE *  
  3. 00.pem:-----BEGIN CERTIFICATE REQUEST-----  
  4. 00.pem:-----END CERTIFICATE REQUEST-----  
  5. 08.pem:-----BEGIN CERTIFICATE-----  
  6. 08.pem:-----END CERTIFICATE-----  
  7. 11.pem:-----BEGIN CERTIFICATE-----  
  8. 11.pem:-----END CERTIFICATE-----  
  9. #以下是对子目录BUILD中文件的搜索结果  
  10. BUILD/globus_simple_ca_1c5c054a_setup-0.19/1c5c054a.0:-----BEGIN CERTIFICATE-----  
  11. BUILD/globus_simple_ca_1c5c054a_setup-0.19/1c5c054a.0:-----END CERTIFICATE-----  
  12. BUILD/66.pem:-----BEGIN CERTIFICATE REQUEST-----  
  13. BUILD/66.pem:-----END CERTIFICATE REQUEST-----  
  14. [root@zawu globus]# 

例3-34 对当前目录递归搜索CERTIFICATE 字符串,不仅列出当前目录下文件的搜索结果,还列出了子目录BUILD 下文件包含CERTIFICATE 字符串的文本行。

9.-w 和-x 选项

grep命令的模式是支持正则表达式的,正则表达式的元字符将被解释成特殊的含义,-w选项表示匹配整词,即以模式的字面含义去解析它。因此,grep命令使用-w选项后,元字符不再被解释为特殊含义  ,下面的例子说明了-w选项的功能:

 
  1. #例3-35:grep -w 的用法  
  2. [root@zawu globus]# grep cer* 00.pem #搜索包含以cer开头字符串的文本行  
  3. #有4行文本满足条件  
  4. The above string is known as your user certificate subject, and it  
  5. To install this user certificate, please save this e-mail message  
  6. /home/globus/.globus/usercert.pem  
  7. If you have any questions about the certificate contact  
  8. #加上-w选项后,表示搜索包含cer*字符串的文本行  
  9. [root@zawu globus]# grep -w cer* 00.pem  
  10. [root@zawu globus]# #没有满足该条件的文本行 

上例两条命令的模式都为cer*,当未用-w 选项时,模式中的*被解析为任意字符,即搜索包含以cer 开头字符串的文本行,00.pem文件共有4 行文本满足该条件;加上-w选项后,*被解析为字面含义,表示搜索包含cer*字符串的文本行,00.pem 文件不包含cer*这一完整的字符串。因此,无任何结果输出。

-x 选项是匹配整行,即只有当文件中有整行内容与模式匹配时,grep命令才输出该行结果,下面的例3-36说明grep命令的-w和-x 选项的区别。

 
  1. #例3-36:说明grep 命令的-w和-x 选项的区别  
  2. [root@jselab shell-book]# cat world.txt #第1 条命令:查看world.txt内容  
  3. Hello World  
  4. World  
  5. World Cup  
  6. African  
  7. One One World  
  8. #第2条命令:搜索包含单词"World"的文本行  
  9. [root@jselab shell-book]# grep -w 'World' world.txt  
  10. Hello World #所有包含单词"World"的文本行都被输出  
  11. World  
  12. World Cup  
  13. One One World  
  14. #第3条命令:搜索整行文本是单词"World"的行  
  15. [root@jselab shell-book]# grep -x 'World' world.txt  
  16. World #只有此行满足条件  
  17. [root@jselab shell-book]# 

例3-36 中,world.txt有5 行文本,第2条命令在world.txt文件中搜索包含单词"World"的文本行,结果列出4 行满足条件的文本行。但是,第3 条命令在world.txt文件中搜索整行文本是单词"World"的行时,只有一行满足条件。可以看出,-w 选项搜索的是整词匹配,而-x 选项搜索的是整行匹配。

10.-q 选项

从上面的讲解中知道,grep命令默认情况下是输出结果的,但是,grep命令后一旦加上-q 选项,grep将不再输出任何结果,而是以退出状态表示搜索是否成功,退出状态0 表示搜索成功,退出状态1 表示未搜索到满足模式的文本行,退出状态2表示命令或程序由于错误而未能执行。有关退出状态的内容将在第7 章介绍,读者将grep -q 选项与退出状态结合起来阅读,能更深入地理解-q 选项。下面我们举一个例子说明grep -q 选项的含义。

 
  1. #例3-37:演示grep -q 选项  
  2. #第1条命令:grep命令搜索成功  
  3. [root@jselab shell-book]# grep -q -x 'World' world.txt  
  4. [root@jselab shell-book]# echo $?  
  5. 0 #退出状态是0  
  6. #第3条命令:grep命令未搜索到满足模式的文本行  
  7. [root@jselab shell-book]# grep -q -x 'World African' world.txt  
  8. [root@jselab shell-book]# echo $?  
  9. 1 #退出状态是1  
  10. #第5条命令:grep命令执行失败  
  11. [root@jselab shell-book]# grep -q -x 'World African' world  
  12. grep: world: 没有那个文件或目录  
  13. [root@jselab shell-book]# echo $?  
  14. 2 #退出状态是2  
  15. [root@jselab shell-book]# 

例3-37列举了三种场景,第1条命令grep在world.txt文件中搜索整行文本是单词"World"的行,由例3-36 能找到满足模式的行,因而,退出状态是0(echo $?命令用于输出上条命令的退出状态,第7 章将会讲述);第3 条命令grep 在world.txt 文件中搜索整行文本"WorldAfrican"的行,由于此时grep命令未搜索到满足模式的文本行,因而退出状态是1;第5 条命令中的world文件不存在,grep发生语法错误,因而退出状态是2。

11.-b 和-o选项

grep -b选项打印匹配行距文件头部的偏移量,以字节为单位。如果在-b选项后再加上-o选项,grep命令将打印匹配的词距文件头部的偏移量。下面的例3-38演示了grep的-b和-o选项。

 
  1. #例3-38:演示grep 命令的-b和-o 选项  
  2. #第1条命令:打印匹配行距文件头部的偏移量  
  3. [root@jselab shell-book]# grep -b -w 'World' world.txt  
  4. 0:Hello World  
  5. 12:World  
  6. 18:World Cup  
  7. 36:One One World  
  8. #第2条命令:打印匹配词距文件头部的偏移量  
  9. [root@jselab shell-book]# grep -b -o -w 'World' world.txt  
  10. 6:World  
  11. 12:World  
  12. 18:World  
  13. 44:World  
  14. [root@jselab shell-book]# 

例3-38 中的第1 条命令打印匹配行距文件头部的偏移量,由于"Hello World"是world.txt的第一行,因而,该行距离文件头部的偏移量是0字节;然而,当第2 条命令加上-o选项打印匹配词距文件头部的偏移量时,第一行"Hello World"的词World距离文件头部是6 字节。

grep命令的-E 和-F选项分别等价于grep命令族中的egrep和fgrep命令,我们将在3.4.3节介绍,有关grep 命令选项、模式和文件的介绍到此为止,下一节将举例介绍grep 和正则表达式的结合使用。