人人都会AI编程

基础搜索、反向匹配、正则表达式、多文件搜索

更新时间:2026-07-12

grep 是 Linux 世界里使用频率最高的文本搜索工具,它的名字来源于 ed 编辑器中的命令 g/re/p(全局正则表达式打印)。它的核心职责就是从给定的文本或文件中找出符合特定模式的行,并输出到屏幕。尽管功能可以非常高级,但日常使用中掌握以下几种模式就足以应对绝大多数场景。

1. 基础搜索

最简单的用法是指定一个关键词和一个文件,grep 会输出所有包含该关键词的行:

grep "error" /var/log/syslog

如果不提供文件,grep 会从标准输入读取数据,因此特别适合与管道(|)配合:

dmesg | grep "usb"

常用选项:

  • -i:忽略大小写。grep -i "warning" log.txt 可以匹配 Warning、WARNING、warning。
  • -n:显示行号,定位问题更方便。
  • -c:只输出匹配行的计数,而不是具体内容,适合快速统计。
  • --color=auto:用颜色高亮匹配的文本,多数发行版已默认开启。

2. 反向匹配

有时需要排除掉包含某些内容的行,例如查看配置文件时忽略掉注释和空行。这时使用 -v(invert match):

grep -v "^#" /etc/ssh/sshd_config | grep -v "^$"

这里第一个 grep -v "^#" 排除了以 # 开头的注释行,第二次通过管道再排除空行(^$ 匹配空行),最终得到的就是全部有效配置项。反向匹配在日志分析中同样适用:当你想找出非正常状态的信息时,可以先排除所有包含 “ok” 或 “success” 的行。

3. 正则表达式

grep 支持基本正则表达式(BRE)和扩展正则表达式(ERE),通过 -E 选项(或用 egrep)启用扩展模式,语法更灵活。常用元字符:

  • .:匹配任意单个字符。
  • *:匹配前一个字符零次或多次。
  • ^$:分别匹配行首和行尾。
  • [abc]:匹配括号中的任意一个字符。[0-9] 匹配单个数字。
  • |(需 -E):逻辑或,匹配多个模式。
  • +?{}(需 -E):重复次数控制。

示例:

grep -E "error|fail|critical" app.log        # 匹配 error、fail 或 critical
grep -E "^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" access.log  # 匹配以IP开头的行
grep -E "https?://" urls.txt                 # 匹配 http:// 或 https://

如果不使用 -E,则 |+ 等需要转义,如 grep "error\|fail",因此日常推荐直接使用 grep -E

4. 多文件搜索

grep 可以一次性搜索多个文件,支持通配符和大规模文件树的递归扫描。

grep "TODO" *.c              # 在当前目录所有 .c 文件中搜索
grep -r "192.168.1.100" /etc/   # 递归搜索 /etc 下所有文件

在递归模式下,实用选项包括:

  • -I:忽略二进制文件,避免输出乱码。
  • --include--exclude:按文件名过滤。例如只搜索 .conf 文件:
  grep -r --include="*.conf" "Listen" /etc/
  
  • -l:只打印包含匹配内容的文件名,不显示具体行,常用于先定位到文件再进一步分析。
  • -L:反过来,列出不包含匹配内容的文件。

多文件搜索时,grep 会自动在输出行前加上文件名(如 filename:line content),方便区分来源。如果配合 -h 则会隐藏文件名,-n 显示行号。

这些方法可以灵活组合。例如,你想在一个项目里找出所有引用某个旧接口、但不是注释行的 Python 文件,可以这样:

grep -r "old_api_call" --include="*.py" | grep -v "^#" | grep -v "^\s*#"

这种层层过滤的思路正是 Unix 组合哲学的体现。掌握这些基础用法后,grep 会成为你排查日志、分析数据、审阅代码时不可或缺的利器。