用法简介:

1
grep [OPTIONS] PATTERN [FILE...]

PATTERN 可以是普通字符串或正则表达式(取决于选项)。若省略 FILE,则从标准输入读取。

常用选项说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-E        # 使用扩展正则表达式(等同 egrep)
-F # 将 PATTERN 作为固定字符串列表(等同 fgrep)
-P # 使用 Perl 兼容正则(PCRE),并非所有 grep 构建都支持
-i # 忽略大小写
-v # 反选,显示不匹配的行
-n # 打印行号
-H # 显示文件名(当从多个文件或 piped 输入时)
-h # 不显示文件名
-w # 匹配完整单词
-x # 整行匹配
-c # 仅输出匹配到的行数(每个文件)
-o # 只输出匹配到的字符串(可多次)
-l # 列出包含匹配内容的文件名
-L # 列出不包含匹配内容的文件名
-r, -R # 递归搜索目录
--exclude=PATTERN # 排除匹配文件名
--include=PATTERN # 仅包含匹配文件名
--binary-files=TYPE # 如何处理二进制文件(binary/text)
--color=auto|always|never # 高亮匹配内容
-A NUM # 匹配行后显示 NUM 行(after)
-B NUM # 匹配行前显示 NUM 行(before)
-C NUM # 匹配行前后各显示 NUM 行(context)
--line-number # 同 -n,部分系统选项名不同
--null # 输出以 NUL 字符分隔(用于 xargs -0)

常见示例与说明:

  • 在文件中查找字符串(精确匹配子串):

    1
    grep 'root' /etc/passwd
  • 忽略大小写:

    1
    grep -i 'error' /var/log/syslog
  • 显示行号:

    1
    grep -n 'TODO' src/*.c
  • 反选(不包含该模式的行):

    1
    grep -v '^#' file.conf     # 去除注释行
  • 只输出匹配到的部分:

    1
    grep -o -E '[0-9]{4}-[0-9]{2}-[0-9]{2}' logfile
  • 计数匹配行数:

    1
    grep -c 'pattern' files/*
  • 列出包含匹配的文件名:

    1
    grep -l 'main' -R .
  • 列出不包含匹配的文件名:

    1
    grep -L 'TODO' -R .
  • 上下文显示(行号 + 上下文):

    1
    2
    grep -n -C 2 'exception' app.log   # 每个匹配显示前后2行
    grep -A 3 'start' script.sh # 显示匹配行及其后3行
  • 使用扩展正则表达式(|、+、?、()):

    1
    grep -E 'error|warning' /var/log/syslog
  • 使用固定字符串搜索(更快,禁用正则解析):

    1
    grep -F 'a+b' file.txt
  • 使用 PCRE(高级正则特性,如前瞻):

    1
    grep -P '(?<=id=)\d+' file

    注意:并非所有系统的 grep 都支持 -P。

  • 与 find / xargs 组合(递归并过滤文件名):

    1
    2
    3
    find . -name '*.log' -print0 | xargs -0 grep -H 'ERROR'
    # 或者使用 --include/--exclude:
    grep -R --include='*.py' 'def ' .
  • 在二进制文件中搜索时避免”Binary file matches”提示:

    1
    grep --binary-files=text 'pattern' *

进阶与性能提示:

  • 对于大规模代码库或日志,考虑使用专门工具(ripgrep rg、The Silver Searcher ag)以获得更好性能。
  • 使用 -F(固定字符串)比正则快;避免未必要的正则分组或回溯。
  • 对于多模式搜索,使用 -E 将多个模式合并比多次调用 grep 更高效。
  • 使用 –exclude-dir、–include 控制递归时的搜索范围,减少 I/O。

常见正则片段:

  • 匹配邮箱(简单示例):[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,}
  • 匹配 IPv4(简化):([0-9]{1,3}.){3}[0-9]{1,3}
  • 匹配日期 YYYY-MM-DD:\b[0-9]{4}-[0-9]{2}-[0-9]{2}\b

小结示例集:

1
2
3
4
5
6
7
8
# 在 /etc 中搜索包含 root 的文件,并显示文件名与行号
grep -R -n -H 'root' /etc

# 在当前目录递归搜索 Python 文件中的 TODO 注释(忽略大小写)
grep -R --include='*.py' -i 'TODO' .

# 显示最近的系统日志中含 "segfault" 的行及其前后3行
tail -n 1000 /var/log/syslog | grep -n -C 3 'segfault'