Linux日志批量分析核心是熟练组合grep、awk、sed、sort、uniq、cut命令,依据日志结构特征高效筛选、统计、提取与去重,避免常见陷阱。

Linux Shell 处理日志文件的批量分析,核心在于“用对命令、串好流程、避开陷阱”。不需要写脚本也能高效完成,关键是掌握 grep、awk、sed、sort、uniq、cut 这几个命令的组合逻辑和常见日志结构特征。
按时间范围快速筛选日志行
多数日志(如 nginx、systemd、应用自定义日志)首字段是时间戳。直接用 awk 提取并比对,比逐行 grep 更稳:
- 提取今天凌晨到现在的 Nginx 访问日志:
awk -F'[' '$2 ~ /^$(date -d "today" +%d\/%b\/%Y):[0-9]{2}:[0-9]{2}/ {print}' /var/log/nginx/access.log - 更通用做法:先用 sed 提取含日期的行,再用 grep 精确匹配(例如只看 10 月 25 日):
sed -n '/25\/Oct\/2024/p' app.log | grep 'ERROR\|WARN'
统计高频错误或接口调用
目标不是“看到错误”,而是“知道哪类错误最多、哪个路径最常出问题”:
- 统计 HTTP 状态码分布(Nginx 日志第 9 字段):
awk '{print $9}' access.log | sort | uniq -c | sort -nr - 提取并统计报错行中的关键词(如 Java 异常类名):
grep 'Exception\|ERROR' app.log | awk -F':' '{print $NF}' | awk '{print $1}' | sort | uniq -c | sort -nr | head -10
提取关键字段做横向对比
日志里混着 IP、URL、响应时间、用户 ID 等信息,用 cut 或 awk 定位后,可导出为简易表格用于排查:
- 导出耗时超 2 秒的请求(假设第 10 字段是 $request_time):
awk '$10 > 2 {print $1, $7, $10, $9}' access.log | column -t - 按 IP 统计请求数 + 最长响应时间:
awk '$10 > 0 {ip[$1]++; max[$1] = ($10 > max[$1]) ? $10 : max[$1]} END {for (i in ip) print i, ip[i], max[i]}' access.log | sort -k2 -nr
合并多日志文件统一分析
滚动日志(如 app.log、app.log.1、app.log.2.gz)不能靠手动解压拼接:
- 自动处理当前目录下所有相关日志(含 gzip):
zcat app.log*gz 2>/dev/null; cat app.log app.log.1 2>/dev/null | awk '/POST \/api\/order/ && $9 ~ /^5../ {print $1, $7, $9}' - 避免重复分析:用 awk '!seen[$0]++' 去重(适用于误重复写入场景):
zcat *.gz | cat - app.log | awk '!seen[$0]++' | grep 'OutOfMemoryError'
不复杂但容易忽略:日志字段分隔符是否一致、时间格式是否跨时区、gzip 文件权限是否可读。动手前先 head -3 和 file 看一眼,省掉大半调试时间。










