在linux环境下,apache的访问日志默认存储在/var/log/apache2/access.log或者/etc/httpd/logs/access_log路径下,日志中每条记录都包含访问来源IP,我们可以通过shell脚本快速提取并统计这些IP的访问量。

基础IP访问量统计脚本
最基础的统计需求是提取所有访问IP,并统计每个IP的访问次数,按访问量从高到低排序,以下是实现脚本:
#!/bin/bash
# 定义apache访问日志路径,可根据实际环境修改
LOG_FILE="/var/log/apache2/access.log"
# 判断日志文件是否存在
if [ ! -f "$LOG_FILE" ]; then
echo "日志文件不存在,请检查路径是否正确"
exit 1
fi
# 提取IP并统计访问次数,排序输出
# 默认apache日志第一个字段为IP,使用awk提取第一列,uniq -c统计次数,sort -nr按次数降序排序
awk '{print $1}' "$LOG_FILE" | sort | uniq -c | sort -nr
脚本说明
- 首先定义日志文件路径,用户需要根据自己服务器的apache日志实际存储位置修改
LOG_FILE变量的值 - 通过
if [ ! -f "$LOG_FILE" ]判断日志文件是否存在,不存在则提示错误并退出 awk '{print $1}' "$LOG_FILE"提取日志每行的第一个字段,也就是访问来源IPsort | uniq -c先对IP排序,再统计每个IP出现的次数sort -nr按访问次数从高到低排序输出结果
扩展功能脚本
统计指定状态码的IP访问量
如果需要统计返回状态码为200的IP访问量,可以修改脚本增加过滤逻辑:
#!/bin/bash
LOG_FILE="/var/log/apache2/access.log"
# 定义需要统计的状态码,可修改为404、500等
STATUS_CODE="200"
if [ ! -f "$LOG_FILE" ]; then
echo "日志文件不存在,请检查路径是否正确"
exit 1
fi
# 过滤出状态码为指定值的记录,再提取IP统计
awk -v status="$STATUS_CODE" '$9 == status {print $1}' "$LOG_FILE" | sort | uniq -c | sort -nr
这里$9对应apache日志中的状态码字段,不同的日志格式可能需要调整字段位置,可通过查看单条日志确认字段顺序。
统计访问量前10的IP
如果只需要查看访问量最高的前10个IP,可以在脚本末尾添加head -n 10:
#!/bin/bash
LOG_FILE="/var/log/apache2/access.log"
if [ ! -f "$LOG_FILE" ]; then
echo "日志文件不存在,请检查路径是否正确"
exit 1
fi
awk '{print $1}' "$LOG_FILE" | sort | uniq -c | sort -nr | head -n 10
脚本运行注意事项
- 需要给脚本添加可执行权限,使用命令
chmod +x 脚本文件名.sh - 如果apache日志开启了轮转,需要统计历史访问量的话,可以修改
LOG_FILE为对应的历史日志路径,或者批量处理多个日志文件 - 如果日志格式自定义过,第一个字段不是IP的话,需要调整
awk提取的字段位置,可先执行head -n 1 日志路径查看单条日志的字段分布 - 统计结果中第一列为访问次数,第二列为对应的IP地址
linuxshell_scriptapacheIP_访问量统计修改时间:2026-07-01 11:24:15