411 字
2 分钟
nginx 日志分析组合拳:awk 管道的几个实战姿势

接手一台流量异常的机器,没装任何监控,只有一份 2G 的 access log。十分钟后问题定位完毕,靠的是几条管道。这类命令每次现查文档太慢,整理在这里。

请求数 Top 10 的来源 IP#

Terminal window
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head

这条管道值得拆开记:uniq -c 只统计相邻重复行,所以前面必须先 sort;后面再 sort -rn 按计数倒序。三段式是日志分析的万能起手式。

awk 管道各阶段的数据形态:从原始日志行逐级演变成 Top 10 统计结果

状态码分布#

Terminal window
awk '{print $9}' access.log | sort | uniq -c | sort -rn

4xx 占比突然升高,配合上一条基本能锁死是谁在扫。

每小时请求量#

Terminal window
awk '{print substr($4, 14, 2)}' access.log | sort | uniq -c

$4 是时间字段,substr 掐出小时位。画在脑子里就是一张流量曲线,哪个小时被打了 Peak 一目了然。

找出响应最慢的请求#

Terminal window
awk '($NF > 2){print $NF, $7}' access.log | sort -rn | head

前提是 log_format 里把 $request_time 放在最后一个字段。超过 2 秒的请求按耗时倒序,URL 跟在后面。

旋转过的压缩日志#

Terminal window
zcat access.log.*.gz | awk '{print $1}' | sort | uniq -c | sort -rn | head

zcat 直接读 gzip,不用先解压落盘。排查上周的问题 logrotate 已经转走了,这条是救命用的。

一点体会:管道思维的本质是把大问题拆成每条命令只做一件事。真到几十 G 的日志再上 Go 写的专用工具,日常这几条够用十年。

nginx 日志分析组合拳:awk 管道的几个实战姿势
https://oliver6868686.tech/posts/nginx-log-analysis/
作者
Oli
发布于
2026-03-25
许可协议
CC BY-NC-SA 4.0