grep 指令

警告
本文最后更新于 2023-10-22,文中内容可能已过时。

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 的模式拓展》

1
grep [options] [-e PATTERN | -f FILE] [FILE...]

另外,也可以使用两个变种程序 egrepfgrepegrepgrep -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

0%