跳到内容

Grep

100% developed
来自维基教科书,开放书籍,开放世界
(重定向自 How To Search/grep)

Grep 是一个 Unix 实用程序,用于搜索管道到它的信息或当前目录中的文件。 一个例子应该有助于澄清事情。

假设我们想搜索一个目录,并且想找到所有名称中包含字符串“hello”的文件。 你可能会在 shell 中发出 'ls' 命令来列出目录的内容,然后

$ ls
DumpSite.sh  crontab.txt  nagios-3.0.6  xmpppy  xymon-4.3.0-beta2

并手动查看所有内容,或者你可以使用 'ls' 命令并将 ls 的输出管道到 grep

$ ls |grep crontab
crontab.txt

相反,如果你想过滤一个列表,除非某些条目,把它放在参数 -v 中

$ ls |grep -v crontab
DumpSite.sh
nagios-3.0.6
xmpppy
xymon-4.3.0-beta2

'|' 字符是管道的表示,基本上将 'ls' 命令的输出作为 grep 的输入。 你应该得到一个不错的(可能是空的)列表,其中包含所有名称中包含“hello”的文件。

对于搜索词,grep 可以接受正则表达式而不是普通字符串。 一个简单的例子可能是查找目录中的所有 .txt 或 .jpg 文件

$ ls | grep '.*\(txt\|jpg\)'

这里的正则表达式由 .* 组成,它可以代表文件名中的任何内容,以及 \(txt\|jpg\),它产生 txt 或 jpg 作为文件结尾。

命令行选项,也称为 grep 的开关

  • -e pattern
  • -i: 忽略大小写。
  • -v: 反转匹配。
  • -c: 仅输出匹配行的计数。
  • -l: 仅输出匹配文件。
  • -n: 在每行匹配行之前加上行号。
  • -b: 一个历史上的好奇:在每行匹配行之前加上块号。
  • -h: 输出匹配行,不以文件名作为前缀。
  • -s: 抑制有关不存在或不可读文件的错误消息。
  • -x
  • -f file: 从文件获取正则表达式。
  • -o: 输出匹配行的匹配部分。

命令行选项,也称为 GNU grep 的开关,超越了基本的 grep

  • --help
  • -V, --version
  • --regexp=pattern,除了 -e pattern
  • --invert-match,除了 -v
  • --word-regexp,除了 -w
  • --line-regexp,除了 -x
  • -A num, --after-context=num
  • -B num, --before-context=num
  • -C num, -num, --context=num
  • 等等...

链接

正则表达式

[编辑 | 编辑源代码]

Grep 使用特定版本的正则表达式,不同于 sed 和 Perl。 Grep 涵盖 POSIX 基本正则表达式(另请参见 正则表达式/Posix 基本正则表达式)。

grep 中可用的正则表达式功能包括 *、.、^、$、[ ]、[^ ]、\( \)、\n、\{i\}、\{i,j\}、\{i,\}。

GNU grep 中作为 GNU 扩展可用的正则表达式功能包括 \?、\+、\b、\B、\<、\>、\w、\W、\s、\S。

使用 -E 开关在 grep 中可用的正则表达式功能包括 ?、+、|、( )、{i}、{i,j}、{i,}

grep 支持的预定义字符类包括 [:alpha:]、[:blank:]、[:cntrl:]、[:digit:]、[:graph:]、[:lower:]、[:print:]、[:punct:]、[:space:]、[:upper:] 和 [:xdigit:]。

grep 中不可用的正则表达式功能包括 Perl 的 \d、\D、\A 和 \Z。

链接

当使用从 find 调用的 grep 时,让 grep 输出文件的完整路径,然后输出匹配的内容非常有用。 为了能够做到这一点,让 grep 认为它是用多个文件调用的,在 {} 之后添加 /dev/null,如下所示

 find /var/www -exec grep php {} /dev/null \;

grep 使用的示例

  • echo file.txt | grep ".*\(txt\|doc\)"
    • 匹配。 "\(" 和 "\)" 创建一个组,而 "\|" 分隔组中的项目。 如果组的至少一个项目匹配,则组匹配。
  • echo a456 | grep "[a-zA-Z][0-9][0-9]*"
    • 匹配。 "[" 和 "]" 是字符组的定界符。 "*" 代表零、一个或任何其他数量的先前内容。
  • echo a456 | grep -i "[A-Z][0-9]\+"
    • 匹配。 "\+" 代表一个或多个先前内容的出现。 与 "*" 不同,"+" 必须以 "\" 为前缀。 "-i" 使搜索不区分大小写。
  • echo file.txt | grep -E ".*(txt|doc)"
    • 匹配。 "-E" 代表扩展正则表达式。 在扩展正则表达式中,"(" 和 "|" 不需要 "\" 充当特殊字符;它们需要 "\" 充当字面量,即代表它们自身。
  • echo abbc | grep -E "abb?c"
    • 在由 -E 开关启用的扩展正则表达式中,问号匹配零个或一个先前内容的出现。
  • echo abbc | grep "abb\?c"
    • 在 GNU Grep 中,\?(反斜杠前缀的问号)匹配零个或一个先前内容的出现。
  • echo a4c | grep -P "a\dc"
    • 在某些版本的 GNU Grep 中,匹配。 "-P" 代表 Perl 正则表达式;正则表达式中的 "\d" 代表一个数字。
  • grep -P "\x22hello\x22" file.txt
    • 在某些版本的 GNU Grep 中,搜索以引号开头的字符串,后跟“hello”,后跟另一个引号。 利用 -P,它打开 Perl 正则表达式。 在 Perl 正则表达式中,"\x22" 代表引号,通过代表 ASCII 十六进制值为 22 的字符。
  • grep -P "a\t+b" file.txt
    • 在某些版本的 GNU Grep 中,通过 "\t" 指代制表符(制表符)。 由 -P 启用。
  • grep -r "soughtPattern" . --include=*.java
    • 在某些版本的 GNU Grep 中,递归搜索文件。 注意代表当前目录的句点。
  • grep -Fxv -f file2.txt file1.txt
    • 输出集合差集:file1.txt - file2.txt。 使用 -F 将搜索词解释为字面意义,也称为非正则表达式,-x 仅匹配整行,-v 反转匹配,-f 从文件获取搜索词。
  • grep -Fx -f file1.txt file2.txt
    • 输出集合交集:file1.txt 中也存在于 file2.txt 中的那些行。
  • grep -P "Sch\xc3\xb6nheit" *
    • 在 unicode UTF-8 编码文件中搜索德语单词“Schönheit”。 利用 -P 利用 Perl 正则表达式;使用 \x 后跟十六进制数来搜索 ö 的 UTF-8 编码,它是 C3B6。 要找出 UTF-8 文本的十六进制代码,请使用支持 UTF-8 的纯文本编辑器创建一个包含该文本的文件,然后使用显示十六进制的程序(多个操作系统上的 hexdump)来找到该文本的十六进制代码。 UTF-8 编码不要与代码点混淆;ö 的代码点是 F6,而它的 UTF-8 编码是 C3B6。
  • grep -a -i -o "[-_a-z0-9 ]\{4,\}" mybinary.o
    • 在一定程度上模拟 strings 命令,输出长度至少为 4 的字符串序列,用于允许的字符串字符的特定标准。 使用 -a 将二进制文件视为文本文件,使用 -o 仅输出找到的与模式匹配的序列,而不是包含匹配项的行。
  • nice -19 find /etc /var/www -type f -name "*.php" -exec grep -e foreach -e str_replace -e return.*base64_decode {} /dev/null \; >php-possible-malware.txt
    • 然后使用此方法分析,它首先显示最长的行:cat php-possible-malware.txt | awk '{ print length, $0 }' |sort -n -s -r |head -50 |less
  • perl -ne "print if /\x22hello\x22/" file.txt
    • 这不是一个真正的 grep 示例,而是一个 Perl 单行命令,如果 Perl 可用而 grep 不可用,你可以使用它。
GNU Grep 运行的示例。

可以从 GNU ftp 服务器 获取旧版本的 GNU grep。

GNU grep 的发布公告在 savannah 组 中。

可以从 git.savannah.gnu.org 获取 GNU grep 的变更日志。

可以在 GnuWin32 项目 以及 Cygwin 中获得适用于 MS Windows 的 GNU grep 版本。

[编辑 | 编辑源代码]
华夏公益教科书