grep (文本搜索 / Global Regular Expression Print)

1. 定义

grep 是 Linux/Unix 下按搜索文本的命令行工具,依据正则表达式匹配并打印出符合条件的行。 它是日志排查、代码检索、文本过滤的”瑞士军刀”。

类比:grep 像在一摞文件里用”关键字 + 规则”快速抽出所有相关行,而不用肉眼一行行看。

2. grep 能做什么

场景作用
日志排查从海量日志里捞出含 ERROR / 某个请求 id 的行
代码检索找出所有调用某函数的地方(比编辑器全局搜索快)
管道过滤配合其他命令,只保留感兴趣的输出行
计数 / 取反统计出现次数、或反向筛掉某些行

3. 三个常见变体

变体全称区别
grep基础版默认支持 BRE(基础正则)
egrep / grep -EExtended grep支持扩展正则(不用转义 + () {}
fgrep / grep -FFixed grep把模式当纯文本,不解释正则,匹配更快更安全

日常推荐直接用 grep -E(或别名 egrep)写正则,少踩转义坑。

4. 常用命令

基础搜索

grep "error" app.log                 # 在文件里搜包含 error 的行
grep "error" app.log error.log       # 同时搜多个文件
grep -i "error" app.log              # -i 忽略大小写
grep -v "debug" app.log              # -v 反向:排除含 debug 的行
grep -r "TODO" src/                  # -r 递归搜索目录

正则与输出格式

grep -E "GET|POST" access.log        # -E 扩展正则,支持 |
grep -E "[0-9]{3,}" data.txt         # 匹配连续 3 位以上数字
grep -n "main" app.py                # -n 显示行号
grep -o "[a-z]+@[a-z]+\.com" mail.txt # -o 只输出匹配到的部分(提取邮箱)
grep -c "404" access.log             # -c 统计匹配行数

上下文与高亮

grep -C 3 "Exception" app.log        # -C 3 显示匹配行上下各 3 行
grep -A 5 "Stack trace" app.log      # -A 5 只显示匹配行之后 5 行
grep -B 2 "panic" app.log            # -B 2 只显示匹配行之前 2 行
grep --color=auto "error" app.log    # 高亮匹配(多数发行版默认开启)

管道组合

ps aux | grep nginx                  # 从进程列表里筛 nginx
cat access.log | grep -E " 500 " | wc -l   # 统计 500 错误出现次数
docker logs web | grep -E "ERROR|WARN"     # 过滤容器日志

5. grep vs 其他搜索工具

工具擅长何时用
grep正则行匹配通用文本搜索、日志过滤
ripgrep (rg)超快、默认递归、尊重 .gitignore大型代码库全局搜索,体验优于 grep
ag (the silver searcher)快、代码友好类似 rg 的轻量选择
awk按列处理、计算需要切分字段、做统计时配合 grep 用

6. 典型工作流

排查线上错误

grep -E -i "error|exception" /var/log/app/*.log   # 先粗捞错误
grep -C 5 "NullPointer" app.log | less             # 再看上下文定位根因

代码库里找用法

grep -rn "send_email" src/          # 递归 + 行号,定位所有调用
grep -rn "def send_email" src/      # 精确找函数定义

实时跟踪日志

tail -f app.log | grep --line-buffered "order_id=123"   # 只盯着某笔订单

7. 常见误区

  • ❌ “grep 搜不到,一定是没有”。正则可能写错或大小写不匹配——先加 -i 试试,或先用纯文本 grep -F 验证。
  • ❌ “在管道里 grep 卡住不输出”。管道带缓冲,tail -f 等实时流要加 --line-buffered 才会逐行显示。
  • ❌ “用 . 匹配任意字符时踩到换行”。grep 默认按行匹配,. 不匹配换行符,多行内容要换工具(如 pcregrep -M)。
  • ❌ “递归搜目录结果里混入二进制乱码”。加 grep -I(忽略二进制文件)或 grep -r --exclude-dir=.git

8. 延伸阅读 / 关联概念

  • sed — 流式文本编辑,grep 负责”找”,sed 负责”改”
  • awk — 按列处理与统计,常和 grep 串联
  • ripgrep (rg) — 现代更快的代码搜索替代
  • 正则表达式(BRE / ERE / PCRE)——grep 匹配能力的核心
  • GNU grep 文档:https://www.gnu.org/software/grep/manual/