grep的使用方法

avatar 2022年8月6日18:11:06 评论 243 次浏览

Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。

grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。

通常的使用结构如:

grep 'test' testfile.txt

假设testfile.txt中的内容为:

te
test
testaaa
aatestbb

输出为:

./testfile.txt:test
./testfile.txt:testaa
./testfile.txt:aatestbb

其中'test'为要匹配的正则表达式,testfile.txt为要搜索的文件。

若没有指定文件,grep也可以在管道中对stdout进行处理

ls | grep 'test'

输出是:

testfile.txt

grep的常用参数

1.命令格式:

grep [option] pattern file

2.命令功能:

用于过滤/搜索的特定字符。可使用正则表达式能多种命令配合使用,使用上十分灵活。

3.命令参数:

-a   --text   #不要忽略二进制的数据。   
-A<显示行数>   --after-context=<显示行数>   #除了显示符合范本样式的那一列之外,并显示该行之后的内容。   
-b   --byte-offset   #在显示符合样式的那一行之前,标示出该行第一个字符的编号。   
-B<显示行数>   --before-context=<显示行数>   #除了显示符合样式的那一行之外,并显示该行之前的内容。   
-c    --count   #计算符合样式的列数。   
-C<显示行数>    --context=<显示行数>或-<显示行数>   #除了显示符合样式的那一行之外,并显示该行之前后的内容。   
-d <动作>      --directories=<动作>   #当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。   
-e<范本样式>  --regexp=<范本样式>   #指定字符串做为查找文件内容的样式。   
-E      --extended-regexp   #将样式为延伸的普通表示法来使用。   
-f<规则文件>  --file=<规则文件>   #指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。   
-F   --fixed-regexp   #将样式视为固定字符串的列表。   
-G   --basic-regexp   #将样式视为普通的表示法来使用。   
-h   --no-filename   #在显示符合样式的那一行之前,不标示该行所属的文件名称。   
-H   --with-filename   #在显示符合样式的那一行之前,表示该行所属的文件名称。   
-i    --ignore-case   #忽略字符大小写的差别。   
-l    --file-with-matches   #列出文件内容符合指定的样式的文件名称。   
-L   --files-without-match   #列出文件内容不符合指定的样式的文件名称。   
-n   --line-number   #在显示符合样式的那一行之前,标示出该行的列数编号。   
-q   --quiet或--silent   #不显示任何信息。   
-r   --recursive   #此参数的效果和指定“-d recurse”参数相同。   
-s   --no-messages   #不显示错误信息。   
-v   --revert-match   #显示不包含匹配文本的所有行。   
-V   --version   #显示版本信息。   
-w   --word-regexp   #只显示全字符合的列。   
-x    --line-regexp   #只显示全列符合的列。   
-y   #此参数的效果和指定“-i”参数相同。

4.规则表达式:

grep的规则表达式:

^  #锚定行的开始 如:'^grep'匹配所有以grep开头的行。    
$  #锚定行的结束 如:'grep$'匹配所有以grep结尾的行。    
.  #匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。    
*  #匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。    
.*   #一起用代表任意字符。   
[]   #匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。    
[^]  #匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。    
\(..\)  #标记匹配字符,如'\(love\)',love被标记为1。    
\<      #锚定单词的开始,如:'\<grep'匹配包含以grep开头的单词的行。    
\>      #锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。    
x\{m\}  #重复字符x,m次,如:'0\{5\}'匹配包含5个o的行。    
x\{m,\}  #重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。    
x\{m,n\}  #重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。   
\w    #匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。   
\W    #\w的反置形式,匹配一个或多个非单词字符,如点号句号等。   
\b    #单词锁定符,如: '\bgrep\b'只匹配grep。

POSIX字符:

为了在不同国家的字符编码中保持一至,POSIX(The Portable Operating System Interface)增加了特殊的字符类,如[:alnum:]是[A-Za-z0-9]的另一个写法。要把它们放到[]号内才能成为正则表达式,如[A- Za-z0-9]或[[:alnum:]]。在linux下的grep除fgrep外,都支持POSIX的字符类。

[:alnum:]    #文字数字字符   
[:alpha:]    #文字字符   
[:digit:]    #数字字符   
[:graph:]    #非空字符(非空格、控制字符)   
[:lower:]    #小写字符   
[:cntrl:]    #控制字符   
[:print:]    #非空字符(包括空格)   
[:punct:]    #标点符号   
[:space:]    #所有空白字符(新行,空格,制表符)   
[:upper:]    #大写字符   
[:xdigit:]   #十六进制数字(0-9,a-f,A-F)

看下面的例子

### -w
匹配整词
即如果执行
grep -w 'test' testfile.txt
将会匹配`test`不会匹配`testaa`
### -l
仅列出符合匹配的文件,而不列出匹配的具体行
例如:
grep -l 'test' testfile.txt
输出为:
./testfile.txt
### -L
列出不匹配的文件名,与-l正好相反。
### -r
不仅匹配当前目录,还匹配其子目录
-r选项在很多命令中都有涉及,这里就不赘述了。
### -n
列出行并显示行号
即按照上述的文件,执行命令
grep -n 'test' testfile.txt
得到的输出会是:
2:test
3:testaaa
4:aatestbb
### -v(--invert-match)
显示所有不匹配的行
顾名思义
### -c(--count)
显示匹配到的行数,而不会列出具体的匹配
所以执行:
grep -c 'test' testfile.txt
会得到
./testfile.txt:2
### -E或者使用egrep(mac中没有)
使用扩展的正则表达式。
grep只会使用基本的正则表达式。因此我们需要-E选项来对正则表达式进行扩展。
例如上述文件,可以执行:
grep -E 'testa|testb' testfile.txt
来匹配:
./testfile.txt:testaaa
./testfile.txt:aatestbb
其中或(|)是扩展的正则表达式中的内容。
### -F
快速的grep,只按照字符串字面上的意思进行搜索。不允许使用正则表达式。有时候这会更加方便
### -h
不显示匹配的文件名
### -s
静默执行。只输出错误信息,不输出其他信息。
### -Ax
在匹配行打印完毕后再打印x行
例如执行:
grep -A1 'testa' testfile.txt
输出:
./testfile.txt:testaaa
./testfile.txt:aatestbb
### -By
在匹配行前打印y行
执行:
grep -B1 'testa' testfile.txt
输出:
./testfile.txt:test
./testfile.txt:testaaa
### -Cz
在前后各自打印z行。
例如:
grep -C1 'testa' testfile.txt
输出为:
./testfile.txt:test
./testfile.txt:testaaa
./testfile.txt:aatestbb
### -b
在每一行前面打印字符的偏移量
### -f
`-f file`从文件file中提取模板。空文件包含0个模板。
例如我们可以新建一个patternfile文件用于储存模板。
内容为:
test
testa
 执行:
grep -f patternfile testfile.txt
匹配结果为:
./testfile.txt:test
./testfile.txt:testaa
./testfile.txt:aatestbb
### -x
只打印整行匹配的行

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: