grep (文本搜索 / Global Regular Expression Print)
1. 定义
grep 是 Linux/Unix 下按行搜索文本的命令行工具,依据正则表达式匹配并打印出符合条件的行。 它是日志排查、代码检索、文本过滤的”瑞士军刀”。
类比:grep 像在一摞文件里用”关键字 + 规则”快速抽出所有相关行,而不用肉眼一行行看。
2. grep 能做什么
| 场景 | 作用 |
|---|---|
| 日志排查 | 从海量日志里捞出含 ERROR / 某个请求 id 的行 |
| 代码检索 | 找出所有调用某函数的地方(比编辑器全局搜索快) |
| 管道过滤 | 配合其他命令,只保留感兴趣的输出行 |
| 计数 / 取反 | 统计出现次数、或反向筛掉某些行 |
3. 三个常见变体
| 变体 | 全称 | 区别 |
|---|---|---|
grep | 基础版 | 默认支持 BRE(基础正则) |
egrep / grep -E | Extended grep | 支持扩展正则(不用转义 + () {}) |
fgrep / grep -F | Fixed 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/