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