Linux命令(32)——grep命令

来源:互联网 发布:墨仓式打印机 知乎 编辑:程序博客网 时间:2024/06/07 18:29

1.简介:

grep(Globally search a Regular Expression and Print)是GNU开发的一款免费开源的文本搜索工具。grep家族包括grep、egrep和fgrep。其功能是在指定的文件中查找一个指定格式或者内容的字符串,并将匹配的字符串所在行打印出来。如果不指定任何文件名称,或给定的文件名为“-”,则从标准输入设备读取数据。grep支持正则表达式搜索文本。

2.命令格式

grep [OPTIONS] PATTERN [FILE...]grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

3.选项说明

-a,--text:将binary文件以text文件的方式处理,等同于--binary-files=text选项。-A [行数]:后紧跟数字,为after之意,除了列出匹配字符串所在行之外,后续的n行也列出来。-b,--byte-offset:在匹配的行之前,标示出该行第一个字符的位编号,即字符在文本中的字节偏移下标,包括换行符。-B [行数],--before-context=[行数]:后紧跟数字,为befor之意,显示匹配行以及该行之前指定行数的内容。-c,--count:只输出匹配的行数,不是匹配字符串的个数。-C [行数],-[NUM],--context=[NUM]:显示匹配的行以及改行上下指定行数的内容。--color=auto:可以将找到的关键词部分加上颜色的显示。-d [动作],--directories=[ACTION]:当指定要查找的是目录而非文件时,使用指定的操作处理。动作有:read(默认)像普通文件一样读取目录;skip:忽略指定目录;recurse:递归读取指定目录下的所有文件,此操作等同于-r选项。-D [ACTION], --devices=[ACTION]:如果输入文件是设备,命名管道(FIFO)或套接字,则使用指定动作处理它。默认情况下,为读取操作(read),这意味着读取设备就像它们是普通文件。如果操作是跳过(skip),设备将被悄悄跳过。-e <匹配模式>:设置查找文件内容的匹配模式。-E,--extended-regexp:使用扩展正则表达式解释匹配模式。-f [文件], --file=[FILE]:将匹配模式写在文件中,文件中一行内容对应一个匹配模式。-F,--fixed-strings:将匹配模式看作固定字符串。-G,--basic-regexp:使用基本正则表达式解释匹配模式。-h,--no-filename:查询多文件时不显示文件名。-H,--with-filename:查询多文件时显示文件名(默认选项)。-i,--ignore-case:忽略字符大小写。-I:忽略二进制文件。-l,--files-with-matches:只输出包含匹配字符的文件名。-L,--files-without-match:不显示内容符合指定的匹配模式的文件名。-n,--line-number:显示匹配行及行号。-o,--only-matching:只显示匹配的字符串,并以单独行输出。-q,--quiet, --silent:静默模式,不显示任何信息到标准输出。-s,--no-messages:不显示不存在或无匹配文本的错误信息。-T, --initial-tab:使用tab使匹配行对齐;-u, --unix-byte-offsets:UNIX样式字节偏移。使用该选项,是grep产生的结果与在Unix机器上相同,此选项必须与-b同时使用,否则没有效果,也必须要在 MS-DOSMS-Windows平台上使用。-Z, --null:文件名与匹配行之间使用空字符。grep默认会在每个输出前打印文件名,文件名与匹配行之间会有一个冒号隔开,-Z选项告诉grep不要使用冒号了,使用一个NUL字符;-v,--invert-match:反向选择,显示不包含匹配文本的所有行。-V,--version:显示版本信息。-w,--word-regexp:只显示包含模式字符串的单词(word)的行。--help:显示帮助信息。-V, --version:显示版本信息。

4.常用示例

(1)统计字段出现次数。

grep -o [pattern] [finename...]|wc -l

命令解释:
(a)grep -o
-o是only-matching缩写。Print only the matched(non-empty) parts of a matching line, with each such part on a separate output line。以单独的行输出匹配的每一个模式字符串。

(b)wc -l
统一输入的行数。就可以知道这个要统计的字段出现的次数了。

(c)搜索指定范围的数字。比如查询包包含540-600的行。

grep '5[4-9][0-9]\|600' [filename...] 

之所以竖杠|需要加上反斜杠进行转义,是因为竖杠|在shell中是特殊字符,表示管道命令。可以使用-e选项显示指明为正则表达式,则不需要对|进行转义。

(2)默认在当前目录搜索lvlv,明确要求搜索子目录。

grep -r "lvlv" ./

(3)显示所有以d开头的文件中包含test的行。

grep 'test' d*

(4)打印在aa,bb,cc文件中匹配test的行,并显式行号。

grep -n 'test' aa bb cc

(5)打印aa中包含有至少5个连续小写字符的字符串的所有行

grep '[a-z]\{5\}' aa

注意,这里必须使用双引号或者单引号将查找pattern包围。单引号与双引号的区别主要有:
(1)单引号”是全引用,被单引号括起的内容不管是常量还是变量都不会发生替换;
(2)双引号”“是部分引用,被双引号括起的内容常量还是常量,变量则会发生替换,替换成变量的内容。一般常量用单引号”括起,如果含有变量则用双引号”“括起来。但是也有意外,比如说查找特殊字符反斜杠\使用:grep '\' ./*则会报grep: Trailing backslash错误,需要使用grep '\\' ./*才可以。

(6)统计文件file中含有指定字符串aaa的的行数。

grep aaa file | wc -l

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


参考文献

[1]man grep
[2][Linux]知其然且知所以然之grep命令