运维和开发工作中,出问题时第一反应往往是“先看日志”。但生产环境的日志文件动辄几百 MB 甚至几十 GB,如果只会用 tail 和 less 逐行翻看,效率极低。Linux 提供了一整套轻量、高效的小工具,通过管道组合起来,可以在几秒钟内从海量日志中筛出关键信息。以下是几个最常用、最能解决实际问题的组合套路。
1. 快速过滤错误和异常
假设应用日志文件为 /var/log/app.log,你想找出所有包含 ERROR 或 FATAL 的行,并查看它们的上下文:
grep -E 'ERROR|FATAL' /var/log/app.log | tail -50
grep -E使用扩展正则,同时匹配多个关键词;tail -50只看最近 50 条,方便判断刚发生的故障。
如果你想实时监控新产生的错误,可以换成 tail -f 配合 grep:
tail -f /var/log/app.log | grep --line-buffered 'ERROR'
--line-buffered 确保每一行匹配后立即输出,不会因为缓冲而延迟。
2. 按时间段截取日志
很多日志没有自带时间戳过滤功能,但我们可以利用 awk 按时间范围筛选。假设日志格式为 2025-01-20 14:23:45 ...,需要查看当天 14:00 到 15:00 之间的记录:
awk '/2025-01-20 14:/' /var/log/app.log
如果时间跨度不固定,可以借助 grep 的匹配能力:
grep '2025-01-20 1[4-5]:' /var/log/app.log
这种写法匹配 14: 到 15:59 的行,简单直接。
3. 统计频率:谁访问最多、哪个错误最多
查找访问日志(如 Nginx access.log)中访问次数最多的 IP 地址,只需一行:
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
awk '{print $1}'提取第一个字段(IP);sort | uniq -c统计每个 IP 出现次数;sort -rn按次数从高到低排序;head -10取前 10。
同样的套路可用于统计错误日志中哪种异常类型最频繁:
grep 'Exception' app.log | awk -F': ' '{print $2}' | sort | uniq -c | sort -rn | head
这里根据日志具体格式适当调整分隔符。
4. 提取特定字段并展现
想从结构化的日志(如 JSON 格式)中快速提取某个字段值,使用 jq 是更专业的做法,但在没有 jq 的环境中,grep 加 awk 也能应急:
grep '"status":500' app.log | awk -F'"request_uri":"' '{print $2}' | awk -F'"' '{print $1}'
这串命令跑出所有状态码 500 的请求路径,用来定位哪些接口出了问题。
5. 多文件联合分析
当服务由多个实例组成,日志分散在不同文件中时,可以先用 cat 合并再分析:
cat /var/log/app*.log | grep 'ERROR' | awk '{print $3}' | sort | uniq -c | sort -rn
或者直接用 grep 递归目录:
grep -rh 'ERROR' /var/log/myapp/ | ...
6. 结合管道和重定向快速生成排查报表
一次性把异常频率、最近错误示例、受影响接口汇总到一个文件:
{
echo "=== Top Errors ==="
grep 'ERROR' app.log | awk '{print $5}' | sort | uniq -c | sort -rn | head
echo ""
echo "=== Latest 5 Errors ==="
grep 'ERROR' app.log | tail -5
} > problem_report.txt
这样极大方便了问题移交或附带在工单中。
7. 实用小技巧
- 进度可见:如果文件很大,可以用
pv替代cat来了解处理进度:pv app.log | grep ...。 - 匹配行号再查上下文:先用
grep -n得到行号,再使用sed -n '1234,1240p'精准提取前后几行。 - 避免匹配到自身:用
grep '[E]RROR'这个方法时,grep进程自身的命令行不会被匹配,因为模式中的[E]是正则技巧。
这些组合方法的核心思路始终是:分解需求为若干简单步骤,每一步找一个最合适的小工具,然后用管道串联。掌握这几个套路后,面对突然的线上问题,你往往能在几分钟内锁定根因,而不需要慌张地打开图形化的日志平台或手动浏览。简单、快速、可靠,这就是管道命令在日志排查中的真正威力。