直接用 awk 配合 sort 和 bc 即可快速统计 nginx 日志中各状态码占比:提取第 9 字段状态码,累加频次并计算百分比,支持按大类归类(2xx/3xx/4xx/5xx)和降序排序。

直接用 awk 配合 sort 和 bc 就能快速算出各状态码的占比,无需额外脚本或工具。
提取状态码并统计频次
假设日志路径为 /var/log/nginx/access.log,Nginx 默认日志格式中状态码是第 9 字段(空格分隔),可用以下命令统计每个状态码出现次数:
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
输出类似:
24567 200<br> 1892 404<br> 321 500<br> 87 302
计算百分比(带小数)
用 awk 一次性完成总数统计和百分比计算:
awk '{count[$9]++} END {for (code in count) total += count[code]; for (code in count) printf "%s: %.2f%\n", code, count[code]/total*100}' /var/log/nginx/access.log | sort -k2nr
说明:
-
count[$9]++累计每个状态码出现次数 -
total += count[code]求总请求数 -
printf "%s: %.2f%\n"格式化输出,保留两位小数 -
sort -k2nr按第二列(百分比)降序排列
只看常见状态码(可选过滤)
如果只想聚焦 2xx/3xx/4xx/5xx 大类,可先归类再统计:
awk '{if ($9 ~ /^2/) print "2xx"; else if ($9 ~ /^3/) print "3xx"; else if ($9 ~ /^4/) print "4xx"; else if ($9 ~ /^5/) print "5xx"; else print "other"}' /var/log/nginx/access.log | sort | uniq -c | awk '{printf "%s: %.2f%\n", $2, $1/'$(wc -l
注意:该写法中 $(wc -l 动态获取总行数,确保分母准确。
加时间范围或实时统计(小技巧)
若日志含时间戳(如 log_format 自定义了 $time_local),可先用 sed 或 awk 截取某一时段;对正在写的日志文件,用 tail -f 配合 head -n 抽样:
- 查最近 10000 行:
tail -n 10000 /var/log/nginx/access.log | awk ... - 按小时聚合(需日志含标准时间字段):
awk '$4 ~ /\[.*\/Jul\/2024:14:/ {print $9}'(示例:抓 14 点整的请求)











