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
- 等等...
链接
- 2.1 命令行选项 在 grep 手册,gnu.org
- Unix grep(1) 手册页 在 man.cat-v.org,DESCRIPTION 部分
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。
链接
- 正则表达式 在 GNU grep 手册中,gnu.org
当使用从 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 ftp 服务器 获取旧版本的 GNU grep。
GNU grep 的发布公告在 savannah 组 中。
可以从 git.savannah.gnu.org 获取 GNU grep 的变更日志。
可以在 GnuWin32 项目 以及 Cygwin 中获得适用于 MS Windows 的 GNU grep 版本。
- GNU grep 用户手册(单页版) 在 gnu.org 上
- grep(1) OS X 手册页 在 developer.apple.com 上
- Unix grep(1) 手册页 在 man.cat-v.org 上
- 关于 grep 的维基百科文章