统计日志高频IP需先提取真实IP(注意代理场景取X-Forwarded-For最左IP)、过滤无效行(空行、注释、非IPv4、健康检查等),再执行sort -V | uniq -c | sort -nr | head -n 10。

直接用 sort 和 uniq 统计日志中高频 IP,核心是“先归组、再计数、最后排序”。关键不在命令本身,而在确保输入数据干净、字段准确、逻辑合理。
确认 IP 字段位置并提取
大多数 Web 日志(如 Nginx、Apache 默认格式)中,客户端 IP 位于每行第一列。但必须验证,不能默认 $1 就是真实 IP:
- 若日志启用了代理(如 Cloudflare、Nginx real_ip 模块),实际 IP 可能在
$http_x_forwarded_for字段,常以引号包裹、含多个逗号分隔的 IP(如"203.0.113.5, 192.168.1.10"),此时需取最左侧——不能用$NF,否则拿到的是负载均衡器地址; - 可用
head -5 access.log快速查看前几行结构; - 简单场景直接用:
awk '{print $1}' access.log; - 带 X-Forwarded-For 的场景建议用:
awk '{if ($2 ~ /^"/) {gsub(/^"|"$/, "", $2); n=split($2, a, /,\s*/); print a[1]} else {print $1}}' access.log。
过滤无效行再统计
原始日志常混入干扰项,不清洗会导致结果失真:
- 跳过空行、注释行(# 开头)、非 IPv4 行:加正则匹配
/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/; - 排除健康检查路径(如
/healthz、/ping)、图标请求(favicon.ico)、常见错误(404、403); - 组合写法示例:
awk '/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/ && !/(404|healthz|favicon\.ico)/ {print $1}' access.log。
用 sort + uniq -c 完成频次统计
这两步必须严格按顺序执行,因为 uniq -c 只对连续重复行计数:
-
sort是前置必要操作:把相同 IP 归到一起; -
uniq -c在排好序的数据上统计每组出现次数,并在行首输出数字; - 典型管道:
... | sort | uniq -c; - 注意:
sort默认按字典序排,IP 如192.168.10.1会排在192.168.2.1后面——要按数值排序,加-V(版本序,天然支持 IP)或-k1,1n(按第一列数值排),推荐sort -V更稳妥。
按访问量倒序并取 Top N
统计完是“IP 数量”格式(数量在前),需再次排序并截取:
-
sort -nr:按第一列数字逆序排列(-n数值,-r降序); -
head -n 10取前 10 名; - 完整命令示例:
awk '/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/ {print $1}' access.log | sort -V | uniq -c | sort -nr | head -n 10; - 如需导出为文件,末尾加
> top10_ip.txt即可。











