linux shell脚本是轻量高效日志分析工具:用grep -e定位错误、awk+sort+uniq统计访问与状态码、awk数值过滤提取慢请求、sed/awk按时间范围截取日志。

Linux Shell 脚本是日志分析最轻量、最直接的工具——不需要额外安装复杂平台,一条命令就能筛选、统计、定位问题。关键在于理清目标:查错误?看访问频次?找慢请求?还是提取特定字段?脚本写法就完全不同。
快速定位错误行(grep + 正则)
大多数日志中,ERROR、WARN、Exception 是关键信号。用 grep -E 同时匹配多种模式,加上行号和上下文更易排查:
grep -n -E "(ERROR|WARN|Exception|Traceback)" app.log
grep -A 2 -B 1 -i "connection refused" nginx/error.log
注意大小写(-i)、显示前后几行(-A/-B),避免漏掉堆栈或请求ID等关联信息。如果日志带时间戳,可加 awk '{print $1,$2,$3}' 快速提取时间列辅助判断集中发生时段。
统计访问来源或响应状态(awk + sort + uniq)
Nginx 或 Apache 的 access.log 适合用 awk 提取字段再聚合。例如统计 Top 10 访问 IP:
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10
统计 HTTP 状态码分布:
awk '{print $9}' access.log | sort | uniq -c | sort -nr
注意:字段编号取决于日志格式(Nginx 默认 $1 是 IP,$9 是 status;若用了自定义 log_format,需先确认字段位置)。遇到带引号或空格的字段(如 request 字段),可用 awk -F'"' '{print $2}' 按双引号分割更稳妥。
提取耗时超阈值的请求(awk 数值过滤)
假设日志最后一列是响应时间(毫秒),要找出 >2000ms 的请求并打印完整行:
awk '$NF > 2000' app.log
如果响应时间在固定列(比如第 12 列),明确写列号更安全:
awk '$12 > 2000 {print $0}' access.log
配合 tail -f 实时监控慢请求:tail -f app.log | awk '$NF > 3000',适合上线后快速感知性能异常。
按时间范围截取日志(sed 或 awk 时间匹配)
当只需分析某几分钟的日志(比如故障窗口),用 sed 定位起止行最高效:
sed -n '/2024-05-20 14:25:/, /2024-05-20 14:30:/p' app.log
如果时间格式不规整(含毫秒或时区),awk 更灵活:
awk '$0 ~ /2024-05-20 14:[25-29]:[0-5][0-9]/' app.log
注意:正则中的时间范围要覆盖实际日志格式(如是否含秒、是否用 24 小时制),测试时先用 head -20 看几行样本再写匹配模式。









