一、综述
grep是一个强大的文本检索工具。
其基本语法格式简写如下:
grep options string file
即:从特定file中,检索string。当然也不限定是file,grep接收标准输入,所以,grep可以用于管道符,和标准输入重定向。
二、使用介绍
2.1 基本选项
-i:--ignore-case
表示在进行比较时忽略字母的大小写。
[ex] grep -i az * 意思是在当前目录下,检索所有文件中含有内容为az的文件
-v:--invert-match
表示检索不包含给定字符串或模式的所有文本行。
[ex0]: 检索文本中,包含module关键字的行,但是要去掉包含endmodule关键字的行。
grep -rni module file.v | grep -v endmodule #先检索所有的信息,然后剔除其中包含endmodule关键字的行
grep -rni '^module' file.v #这种用了正则表达式,因为module只出现在行首;而恰恰endmodule不具这种特性
-f FILE:
从一个文件中,取string,比如file文件中去放要检索的字符串string,在string的地方可以直接用-f file
-e:
可以用于同时检索多个字符串,string的位置可以用-e string1 -e string2
同时,可以与-f进行组合使用,string的位置替换为-e pattern -f file,作用等同于同时检索了两个pattern
-c:--count
统计行数。用于统计有多少匹配的项有多少行。count
--color:
高亮标示匹配的字符串
-r:
目录递归。
[ex1]:
grep -r "待查找内容" ./ #意思是检索当前目录下的,所有文件;及当前目录下的所有子目录的文件。
输出信息控制选项:
-H:--with-filename
输出每一个匹配项,所在的文件的文件名
如何一次检索多个文本文件中的文本?
grep string file1 file2……
-n:--line-number
输出的项,显示其在源文件中,是第几行
[ex2]:
grep -rn string ./ #表示检索当前目录下所有文件(-r),看是否包含"string"字符串;并显示该string在第几行(-n)
-A NUM:
不同组别输出信息之间插入一行“—”符号,个数按照NUM来进行。
[ex3]: 如果想准备检索一个string,比如就想检索chen,而不想检索chen_H, H_chen, chenH, Hchen等等。
grep -rn \ chen\ ./ #两个反斜杠后面有两个空格,这两个空格后面会被shell解析后,加到chen前后,变为“ chen ”, 然后再在文件中检索" chen "
2.2 同时从多个文件中检索文本:
前面也提到grep可以支持同时检索多个文件。
① 可以直接把文件一个个地接在grep最后
② 如果是具有相同特性的一类文件,也可以用通配符来匹配这些文件。利用shell来解析这些通配符,并扩展得到这些文件。
比如:grep string *
在提交给grep工具之前,shell会自动扩展这些文件名,替换为当前目录下的所有文件名。
需要注意的是,这些是通配符,通过shell来解析的:点击查看通配符的使用
注意:如果string中包含的有正则表达式,两边需要要单引号,表达是提交给grep工具进行解析的。
[ex4]:
grep -i '^chen' *
表示在当前目录下的所有文件中(“*”通配符的作用,shell解析,不加单引号),进行行首chen字符串匹配,string的正则表达式是提交给grep工具的,所以要加单引号。
三、支持的正则表达式
grep工具支持正则表达式的检索,在提交给grep工具的string参数中,可以使用正则表达式来使检索更加方便。
如果grep想要支持扩展的正则表达式,需要使用-E选项,或者是egrep
如果想支持Perl规范正则表达式,可以用-P选项。
需要注意的是,如果使用的是正则表达式,在string两端需要打上单引号,表示是提交给grep工具,而非shell来解析。
POSIX标准下的正则表达式:点击打开链接