直接用 grep、awk、sort 和 uniq 可快速统计日志中 http 状态码频次与占比:先用 awk '{print $9}' 提取 nginx 日志第 9 字段状态码,再通过 sort | uniq -c | sort -nr 得频次排序;用 awk 统计总数并计算百分比,支持 grep 过滤特定状态码类别。

直接用 grep 配合 awk、sort 和 uniq 就能快速统计日志中各类 HTTP 状态码的出现次数和占比,无需写脚本。
确认日志中状态码的位置
常见 Web 日志(如 Nginx 或 Apache)中,HTTP 状态码通常在每行的第 9 字段(Nginx 默认格式)或第 10 字段(Apache common log)。先用 head -n 1 看一行示例,再用 awk '{print $9}' 抽取验证:
192.168.1.1 - - [10/Jan/2024:08:30:12 +0000] "GET /api/user HTTP/1.1" <strong>200</strong> 1234 "https://example.com" "Mozilla/5.0..."
这里状态码是第 9 个字段,值为 200。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
提取所有状态码并统计频次
用 awk 提取状态码列,再用 sort | uniq -c | sort -nr 得到从高到低的频次列表:
awk '{print $9}' access.log | sort | uniq -c | sort -nr- 输出类似:
12456 2002317 404892 500103 302
计算各状态码占比(带百分比)
用 awk 一次性完成总数统计和百分比计算:
awk '{codes[$9]++} END {for (c in codes) total += codes[c]; for (c in codes) printf "%s: %.2f%\n", c, codes[c]/total*100}' access.log | sort -k2 -nr- 说明:
–codes[$9]++统计每个状态码出现次数
– 第一个for算出总请求数total
– 第二个for输出每个码及对应百分比,保留两位小数
–sort -k2 -nr按第二列(百分比)降序排列
只看常见状态码(可选过滤)
如果只想关注 2xx、4xx、5xx 类别,或排除 200/304 这类高频缓存响应,加 grep 过滤:
- 只统计错误码(4xx 和 5xx):
awk '{print $9}' access.log | grep -E '^[45]..' | sort | uniq -c | sort -nr - 排除 200 和 304:
awk '$9 != 200 && $9 != 304 {print $9}' access.log | sort | uniq -c | sort -nr










