grep 指令
grep 指令
grep global search regular expression(RE) and print out the line
Linux grep 命令用于查找文件里符合条件的字符串,如果发现某文件的内容符合所指定的正则模板(grep 默认使用的是 POSIX BRE 字符集),预设 grep 指令会把匹配正则模板的那一列显示出来(注意,在 grep 中,不需要整行都匹配上,只需要有部分匹配上就算匹配上)。若不指定任何文件名称,或是所给予的文件名为 -
,则 grep 指令会从标准输入设备读取数据。 PATTERN 部分如果有 POSIX 元字符,一定要带上引号,这一点至关重要(这样可以阻止 shell 试图展开它们),如果只是普通文本,可以不带引号。
关于 shell 展开通配符,请看《Bash 的模式拓展》
|
|
另外,也可以使用两个变种程序 egrep
和 fgrep
。 egrep
与 grep -E
相同。fgrep 与 grep -F
相同。在 alias 中可以看到:
find
是根据文件信息(文件名,文件类型,权限,修改时间等)来查询文件。grep
则是查找文件内容
参数解析:
-
-A <显示行数>
或--after-context=<显示行数>
:除了显示符合正则模板的那一行之外,并显示该行之后的内容。 -
-B <显示行数>
或--before-context=<显示行数>
:除了显示符合正则模板的那一行之外,并显示该行之前的内容。 -
-C <显示行数>
或--context=<显示行数>
或-<显示行数>
:除了显示符合正则模板的那一行之外,并显示该行之前后的内容。-C <显示行数>
就相当于是-A <显示行数>
-B <显示行数>
-
-b
或--byte-offset
:在显示符合正则模板的那一行之前,标示出该行第一个匹配到的字符的编号,注意,这个编号是从第一行第一列开始算起的,这个数字没啥意义。 -
-c
或--count
:计算符合正则模板的行数。注意,配置了这个参数之后,就只会输出匹配的行数的总和。 -
-d <动作>
或--directories=<动作>
:当指定要查找的是目录而非文件时,必须使用这项参数,否则 grep 指令将回报信息并停止动作。不常用 -
-e <正则模板>
或--regexp=<正则模板>
:指定字符串做为查找文件内容的正则模板。使用的是 POSIX BRE,grep 默认就是用正则匹配,所以这个参数可以省略 -
-E
或--extended-regexp
:将正则模板为延伸的正则表达式来使用。使用的是 POSIX ERE,通常直接用 egrep -
-f <规则文件>
或--file=<规则文件>
:指定规则文件,其内容含有一个或多个正则模板,让grep
查找符合则模板的文件内容,格式为每行一个正则模板。注意,这里默认还是使用POSIX BRE,如果想要使用 POSIX ERE,还是要带上-E
,比如,grep -E -f rule.txt targetFile.xt
-
-F
或--fixed-regexp
:将正则模板视为固定字符串的列表。也就是说它只能找固定的文本,而不是规则表达式,当然,这样会更快,也就是说,就算你给的正则字符串,它也会当成普通文本字符串来处理,这个跟-G
有点像。所以,-F
和-E
没有办法同时使用。 -
-G
或--basic-regexp
:将正则模板视为普通的表示法来使用。 不使用正则引擎,把正则模板当成普通文本字符串去匹配,相当于强制用文本字符匹配的方式进行匹配。 -
-h
或--no-filename
:在显示符合正则模板的那一行之前,不标示该行所属的文件名称。匹配一个和多个文件的时候,匹配内容前会显示这一行属于哪个文件,用这个参数可以隐藏 -
-H
或--with-filename
:在显示符合正则模板的那一行之前,表示该行所属的文件名称。 -
-i
或--ignore-case
:忽略字符大小写的差别。老参数了 -
-l
或--file-with-matches
:列出文件内容符合指定的正则模板的文件名称。例如:grep -l '111' ./*
当存在多个目标文件的时候有用,会输出存在匹配行的文件名 -
-L
或--files-without-match
:列出文件内容不符合指定的正则模板的文件名称。例如:grep -L '111' targetFile.xt 1111.txt
,跟-l
相反 -
-n
或--line-number
:在显示符合正则模板的那一行之前,标示出该行的行数编号。 实用,老参数了。 -
-o
或--only-matching
:只显示匹配 PATTERN 部分。 -
-q
或--quiet
或--silent
:不显示任何信息。 -
-r
或--recursive
:此参数的效果和指定-d recurse
参数相同。eg:递归在当前目录下的所有文件中查找 1,如果是文件夹则递归:grep -nr 1 ./*
-
-s
或--no-messages
:不显示错误信息。 -
-v
或--invert-match
:显示不包含匹配文本的所有行。 很实用,反向匹配,一般用于不显示文件中的注释行和空行,cat xxx | grep -v '^#' | grep -v '^$'
-
-V
或--version
:显示版本信息。 -
-w
或--word-regexp
:只显示全字符匹配的行。 -
-x
--line-regexp
:只显示全行符合的行。整行匹配正则模式这样要求很严格 -
-y
:此参数的效果和指定-i
参数相同。
常用配置: -C -c -e -E -f -G -F -i -l -n -r -v -x
简单实践:
find / -type f -name "*.log" | xargs grep "ERROR"
:从根目录开始查找所有扩展名为 .log 的文本文件,并找出包含 “ERROR” 的行
find xargs grep
三个命令经常相互配合使用
grep -nr 111 ./
在当前目录下查找 111