人人都会AI编程

9.1 grep:文本搜索与正则匹配

更新时间:2026-07-12

grep 是 Linux 命令行中使用频率最高的工具之一,它的全称是 Globally search for a Regular Expression and Print matching lines,即在文件或输入流中搜索匹配正则表达式的行并打印出来。无论是分析日志、筛选配置文件还是从大量输出中提取关键信息,grep 都以速度快、功能专一著称。

基本用法

grep 最简单的形式就是在一个或多个文件中搜索某个字符串:

grep "error" /var/log/syslog          # 在 syslog 中查找包含 "error" 的行
grep "root" /etc/passwd               # 查看系统中 root 用户的信息

如果只是想检查文件中是否存在某个模式,而不关心具体行内容,可以用 -q 静默模式,适合在脚本中做条件判断:

if grep -q "backup complete" /var/log/backup.log; then
    echo "备份成功"
fi

常用选项

  • -i:忽略大小写(Case-insensitive)。grep -i "warning" log.txt 会同时匹配 WarningWARNING 等。
  • -v:反向匹配,输出包含指定模式的行。grep -v "^#" config.conf 可以排除注释行。
  • -n:显示匹配行的行号,方便定位。grep -n "timeout" app.log 会输出类似 42:connection timeout 的结果。
  • -c:统计匹配的行数,而不是列出具体内容。grep -c "200" access.log 可以快速查看成功请求的数量。
  • -r-R:递归搜索目录下所有文件。grep -r "TODO" ~/project/ 会找出项目中所有标记了待办事项的位置。
  • -l:只输出包含匹配内容的文件名,而不是具体行。适合找出哪些文件含有某关键字。
  • -w:匹配整个单词,避免部分匹配。grep -w "root" /etc/passwd 不会把 "rooter" 这种单词的变体也匹配进来。
  • -x:匹配整行,行内容必须与模式完全一致。

这些选项可以自由组合,比如 grep -rin "error" /var/log/ 会递归、忽略大小写地搜索并显示行号,是日常排查中最常用的组合之一。

正则表达式支持

grep 的威力很大程度上来自对正则表达式的支持。默认情况下,grep 使用基本正则表达式(BRE),通过 -E 选项(或直接使用 egrep)可以启用扩展正则表达式(ERE),后者更加现代化且易读。

常用正则元字符(ERE 模式下):

  • . :匹配任意单个字符(除换行符外)。
  • * :匹配前一个字符零次或多次。
  • + :匹配前一个字符一次或多次。
  • ? :匹配前一个字符零次或一次。
  • ^ :锚定行首。^ERROR 表示行必须以 ERROR 开头。
  • $ :锚定行尾。done$ 表示行必须以 done 结尾。
  • [abc] :匹配方括号中的任意一个字符。
  • [^abc] :匹配不在方括号中的任意字符。
  • (pattern) :分组,用于后续的重复或引用。
  • | :或运算,匹配左右任意一个表达式。

实用示例:

# 查找 IP 地址形式的行(粗略匹配)
grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' access.log

# 找出所有以 # 开头或空白的行(配置文件中的注释和空行)
grep -E '^#|^$' nginx.conf

# 匹配时间格式 HH:MM:SS
grep -E '[0-9]{2}:[0-9]{2}:[0-9]{2}' log.txt

# 只显示以 "ERROR" 或 "FATAL" 开头的行,并带行号
grep -En '^(ERROR|FATAL)' app.log

如果想使用 Perl 风格的正则表达式(更丰富的元字符,如 \d\s\w 等),可以使用 grep -P(大多数 Linux 发行版的 GNU grep 支持)。

上下文控制

查看匹配行的前后几行内容往往比只看孤立的一行更有帮助:

  • -B num:显示匹配行之前的 num 行(Before)。
  • -A num:显示匹配行之后的 num 行(After)。
  • -C num:显示匹配行前后各 num 行(Context)。

例如,grep -C 3 "panic" /var/log/kern.log 会显示内核恐慌前后各三行,便于快速定位问题发生时的系统状态。

与其他命令组合

grep 最常与管道一起作为过滤器:

ps aux | grep "nginx"          # 查看 nginx 相关进程
dmesg | grep -i "error"       # 内核日志中查找硬件或驱动错误
cat /proc/cpuinfo | grep "model name" | uniq   # 获取 CPU 型号信息

实用技巧与注意事项

  • 颜色高亮:多数发行版已默认启用 --color=auto,匹配的字符串会标红,阅读更直观。如果没有,可手动添加 alias grep='grep --color=auto'.bashrc
  • 搜索二进制文件:直接 grep 二进制文件可能会干扰终端显示。使用 -a 选项可以将二进制文件当作文本处理,或者先用 strings 提取可读字符串再传给 grep
  • 大小写敏感场景:如果确定数据中的字母大小写有意义(如密码字段),避免使用 -i,以免造成误匹配。
  • 性能考量grep 对单次文本搜索进行了高度优化,对于 GB 级别的文件也能快速完成。但如果是超大规模日志且需要反复查询,可以考虑配合正则反向索引工具(如 agripgrep)进一步提速。
  • 递归搜索排除目录grep -r --exclude-dir={node_modules,.git} 可以在递归时跳过指定目录,避免搜索到大量无关文件。

grep 的强项在于专注:它只做文本匹配这一件事,并且将其做到了极致。熟练使用 grep 和正则表达式,会让你在日志分析、系统配置、代码浏览等任务中如虎添翼,也是进一步学习 awksed 等更复杂文本处理工具的重要基础。