用一行 shell 命令统计 apache 日志独立 ip 数量:cat access.log | awk '{print $1}' | sort -u | wc -l;大文件推荐 awk '{ip[$1]++} end {for (i in ip) print i}' access.log | wc -l。

直接用一行 Shell 命令就能快速统计 Apache 日志里的独立 IP 数量,核心是提取、去重、计数三步。
提取并统计每个 IP 的访问次数
Apache 默认日志格式中,客户端 IP 总是第一列($1),所以最常用也最可靠的方式是:
cat access.log | awk '{print $1}' | sort | uniq -c | sort -nr
说明:
- awk '{print $1}':只取每行第一个字段,即 IP 地址;
- sort:为 uniq 做准备,必须先排序才能正确去重计数;
- uniq -c:统计相邻重复行出现次数,输出“次数 IP”格式;
- sort -nr:按数字逆序排列,访问量高的排在最前面。
只看独立 IP 的总数(不关心谁访问了多少)
如果只需要知道有多少个不同 IP 访问过,不用列出明细:
cat access.log | awk '{print }' | sort -u | wc -l
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
说明:
- sort -u 等价于 sort | uniq,直接输出唯一值;
- wc -l 统计行数,就是独立 IP 总数。
针对大日志文件的优化建议
当 access.log 超过 1–2GB 时,上面命令可能卡在 sort 阶段,占用大量内存和 CPU:
- 优先用 awk 自带数组计数,跳过 sort 和 uniq:
awk '{ip[$1]++} END {for (i in ip) print i}' access.log | wc -l(得独立 IP 数)
或更完整:
awk '{ip[$1]++} END {for (i in ip) print ip[i], i}' access.log | sort -nr - 避免在业务高峰期执行,可先用 head -n 100000 截取样本测试命令逻辑;
- 若需长期分析,建议配合 zcat 处理压缩日志:
zcat access.log.gz | awk '{print $1}' | sort -u | wc -l。
查指定时间段内的独立 IP
比如只统计今天(假设日志时间格式为 [21/Aug/2026:01:23:45):
awk '$4 ~ /\[21\/Aug\/2026/ {print $1}' access.log | sort -u | wc -l
说明:
- $4 是 Apache 日志中的时间字段(含方括号);
- ~ /\[21\/Aug\/2026/ 是正则匹配,注意转义斜杠和左括号;
- 匹配后才打印 $1,减少后续处理数据量。









