nginx日志分析可用纯shell命令快速定位问题:①按小时统计请求量(awk+sort+uniq);②top10访问ip识别异常流量;③状态码分布及占比评估服务健康度;④top20业务url路径(去参、过滤静态资源)。

分析Nginx日志时,用好Shell命令能快速定位访问峰值、异常IP、高频URL、状态码分布等问题。以下是一组高频、实用、可直接粘贴执行的命令,适用于标准 combined 格式日志(如 /var/log/nginx/access.log),无需额外工具,纯 Bash + GNU coreutils 即可完成。
统计每小时请求量(按时间窗口聚合)
适合发现业务高峰或爬虫集中时段:
awk '{print substr($4,2,13)}' access.log | sort | uniq -c | sort -nr
-
$4是原始时间字段,形如[12/Jan/2024:08:30:15,substr($4,2,13)截取12/Jan/2024:08 - 先按小时分组,再计数、倒序排列
- 若需精确到分钟,把
13改为16(即12/Jan/2024:08:30)
找出访问次数最多的前10个客户端IP
用于识别疑似扫描、CC 或真实高活跃用户:
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10
-
$1对应日志中第一个字段——通常是客户端IP(注意:若前端有代理,需改用$HTTP_X_FORWARDED_FOR对应字段) -
uniq -c要求输入已排序,所以必须先sort - 加
grep -v "127.0.0.1\|::1"可排除本地回环流量
查看返回状态码分布(含比例)
快速评估服务健康度与错误类型:
awk '{print $9}' access.log | sort | uniq -c | sort -nr | awk '{total += $1} END {for (i in a) print a[i], i} {a[$2] = $1} END {for (i in a) printf "%s\t%d%%\n", i, a[i]/total*100}' | sort -k2 -nr
更简洁可靠写法(推荐):
awk '{a[$9]++} END {for (i in a) printf "%s\t%d\t%.1f%%\n", i, a[i], a[i]/NR*100}' access.log | sort -k2 -nr
-
$9是HTTP状态码字段(标准 combined 日志) -
a[$9]++累计每个状态码出现次数;NR是总行数 - 输出示例:
200 12485 87.2%
提取访问最频繁的TOP 20 URL路径(去参数、去静态资源)
聚焦业务接口或页面热点,排除 js/css/png 等干扰:
awk -F'"' '{print $2}' access.log | awk '$1 ~ /^GET|POST/ {sub(/\?.*$/,"",$2); if ($2 !~ /\.(js|css|png|jpg|gif|ico|svg|woff|ttf|map)$/ && $2 != "/") print $2}' | sort | uniq -c | sort -nr | head -20
- 先用
-F'"'按双引号切分,取第2段(即请求行部分) - 再用空格切分,匹配
GET /xxx HTTP/1.1,删掉?后参数,过滤常见静态后缀 - 确保只统计非根路径(
$2 != "/"),避免首页淹没真实业务路径
这些命令可组合使用,比如先用 IP 统计找出可疑地址,再用 grep "192.168.1.100" access.log | ... 做二次分析。注意日志轮转后需指定具体文件(如 access.log.1.gz 需配合 zcat)。不复杂但容易忽略细节,实际效果取决于对字段位置和正则边界的准确把握。










