grep 实战指南:把日志过滤一下
grep (_缩写_来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行。
0. 准备:创建示例日志文件
在终端执行:
1nano test.log 2
粘贴下面内容:
12026-01-27 10:01:12 INFO App started 22026-01-27 10:01:15 INFO User login success userId=123 32026-01-27 10:02:01 WARN VIDEO_BLUR enabled for low bandwidth 42026-01-27 10:02:05 ERROR Network REJECT_TIMEOUT while calling API 52026-01-27 10:02:07 DEBUG psi-p packet received size=512 62026-01-27 10:02:10 INFO Request finished traceId=abc 72026-01-27 10:03:00 ERROR Payment failed orderId=998 82026-01-27 10:03:10 INFO App closed 9
保存退出:Ctrl + O → 回车 → Ctrl + X
查看文件:
1cat test.log 2
1. 单关键词过滤(忽略大小写)
命令
1grep -i error test.log 2
实际输出
12026-01-27 10:02:05 ERROR Network REJECT_TIMEOUT while calling API 22026-01-27 10:03:00 ERROR Payment failed orderId=998 3
解释
2. 多关键词 OR(error 或 timeout 或 fail)
命令
1grep -E -i "error|timeout|fail" test.log 2
实际输出
12026-01-27 10:02:05 ERROR Network REJECT_TIMEOUT while calling API 22026-01-27 10:03:00 ERROR Payment failed orderId=998 3
(第一行包含 timeout,第二行包含 fail)
解释
-E:启用扩展正则,支持A|B|C|:或(OR)-i:忽略大小写
3. 指定你原始的 3 个关键词
命令
1grep -E -i "REJECT_TIMEOUT|VIDEO_BLUR|psi-p" test.log 2
实际输出
12026-01-27 10:02:01 WARN VIDEO_BLUR enabled for low bandwidth 22026-01-27 10:02:05 ERROR Network REJECT_TIMEOUT while calling API 32026-01-27 10:02:07 DEBUG psi-p packet received size=512 4
4. 多条件 AND(同时包含 error 和 timeout)
命令
1grep -i error test.log | grep -i timeout 2
实际输出
12026-01-27 10:02:05 ERROR Network REJECT_TIMEOUT while calling API 2
解释
两次过滤:
- 先找 error
- 再从结果里找 timeout
5. 显示行号
命令
1grep -n -i error test.log 2
实际输出
14:2026-01-27 10:02:05 ERROR Network REJECT_TIMEOUT while calling API 27:2026-01-27 10:03:00 ERROR Payment failed orderId=998 3
6. 查看上下文(前后各 2 行)
命令
1grep -n -C 2 -i "REJECT_TIMEOUT" test.log 2
实际输出
12-2026-01-27 10:01:15 INFO User login success userId=123 23-2026-01-27 10:02:01 WARN VIDEO_BLUR enabled for low bandwidth 34:2026-01-27 10:02:05 ERROR Network REJECT_TIMEOUT while calling API 45-2026-01-27 10:02:07 DEBUG psi-p packet received size=512 56-2026-01-27 10:02:10 INFO Request finished traceId=abc 6
7. 排除某类日志(去掉 DEBUG)
命令
1grep -v "DEBUG" test.log 2
实际输出
12026-01-27 10:01:12 INFO App started 22026-01-27 10:01:15 INFO User login success userId=123 32026-01-27 10:02:01 WARN VIDEO_BLUR enabled for low bandwidth 42026-01-27 10:02:05 ERROR Network REJECT_TIMEOUT while calling API 52026-01-27 10:02:10 INFO Request finished traceId=abc 62026-01-27 10:03:00 ERROR Payment failed orderId=998 72026-01-27 10:03:10 INFO App closed 8
8. 只看最后 N 行再过滤
命令
1tail -n 4 test.log | grep -i error 2
实际输出
12026-01-27 10:03:00 ERROR Payment failed orderId=998 2
9. 实时监控日志
命令
1tail -f test.log | grep -i error 2
模拟追加日志
另一个终端执行:
1echo "2026-01-27 10:04:00 ERROR New crash happened" >> test.log 2
实时窗口看到
12026-01-27 10:04:00 ERROR New crash happened 2
10. 你那条命令的完整含义
1grep -E -i "REJECT_TIMEOUT|VIDEO_BLUR|psi-p" tico_app2.log 2
等价于:
在 tico_app2.log 中查找包含以下任意关键词的行:
- REJECT_TIMEOUT
- VIDEO_BLUR
- psi-p
并忽略大小写。
11. 必记 5 条黄金命令
1# 单关键词 2grep -i error app.log 3 4# 多关键词 OR 5grep -E -i "error|timeout|fail" app.log 6 7# 多条件 AND 8grep -i error app.log | grep -i timeout 9 10# 行号 + 上下文 11grep -n -C 3 -i error app.log 12 13# 实时监控 14tail -f app.log | grep -i error 15
12. 更快的替代:ripgrep(rg)
1brew install ripgrep 2rg -i "error|timeout|fail" app.log 3
速度通常比 grep 快 3~10 倍。
