直接统计apache访问日志中30x状态码次数需用awk精准提取第9字段并匹配300–308:awk '{print $9}' access_log | grep '^30[0-8]$' | wc -l;若格式自定义,须先确认状态码实际列号。

直接统计 Apache 访问日志中 30x 状态码的出现次数,关键在于准确提取状态码字段并匹配 300–307 范围(含 308,若启用 HTTP/2)。Apache 默认日志格式中,状态码是第 9 个空格分隔字段(%s),位置固定,用 awk 或 grep + wc 即可快速完成。
用 awk 按字段精准统计
状态码在日志中是独立字段,不依赖正则模糊匹配,最稳:
- awk '{print $9}' /var/log/httpd/access_log | grep '^30[0-8]$' | wc -l —— 输出所有 300–308 的总次数
- 想看各状态码分别多少次:awk '$9 ~ /^30[0-8]$/ {count[$9]++} END {for (c in count) print c, count[c]}' /var/log/httpd/access_log
用 grep 提取整行再过滤
适合配合其他条件(如时间、路径)联合分析:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- grep -E ' 30[0-8] ' /var/log/httpd/access_log | wc -l —— 注意前后空格,避免误匹配 URL 或 User-Agent 中的数字
- 只查 301 和 302:grep -E ' 301 | 302 ' /var/log/httpd/access_log | wc -l
注意日志格式是否自定义
如果 Apache 配置了非默认 LogFormat(比如合并了响应头或省略了某些字段),$9 可能不准。此时需先确认实际格式:
- 查配置:grep "LogFormat" /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf
- 典型默认格式:LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined,其中 %>s 就是状态码,对应第 9 字段
- 若用了自定义格式,用 head -1 /var/log/httpd/access_log 看一行样例,数清状态码是第几列
扩展:按跳转目标统计(如重定向到 /login)
如果要分析“哪些 30x 响应指向特定地址”,可结合响应头 Location(需日志中记录)或原始请求路径:
- 假设日志里记录了 %{Location}o(需配置支持),可用:awk '$9 ~ /^30[0-8]$/ {print $12}' /var/log/httpd/access_log | sort | uniq -c | sort -nr
- 更常见的是查“发起跳转的请求路径”:awk '$9 ~ /^30[0-8]$/ {print $7}' /var/log/httpd/access_log | sort | uniq -c | sort -nr($7 是请求 URI)










