插件窝 干货文章 linux统计appche站点IP访问量的shell脚本怎么写

linux统计appche站点IP访问量的shell脚本怎么写

统计 FILE START date 820    来源:    2025-04-26

Apache站点IP访问量统计Shell脚本

以下是一个用于统计Apache站点IP访问量的Shell脚本,可以根据你的需求进行修改:

#!/bin/bash

# Apache访问日志统计脚本
# 功能:统计指定时间段内访问Apache站点的IP及其访问次数

# 配置部分
LOG_FILE="/var/log/apache2/access.log"  # Apache访问日志路径
OUTPUT_FILE="ip_access_report_$(date +%Y%m%d).txt"  # 输出报告文件
DAYS=1  # 统计最近多少天的数据(1表示今天)
TOP_IP=20  # 显示访问量最高的前N个IP

# 检查日志文件是否存在
if [ ! -f "$LOG_FILE" ]; then
    echo "错误:Apache访问日志文件不存在!"
    echo "请检查配置的日志路径: $LOG_FILE"
    exit 1
fi

# 获取日期范围
START_DATE=$(date -d "-${DAYS} days" +%d/%b/%Y)
END_DATE=$(date +%d/%b/%Y)

echo "正在分析Apache访问日志..."
echo "统计时间范围: $START_DATE 至 $END_DATE"
echo ""

# 统计IP访问量并排序
echo "=== 访问量最高的前${TOP_IP}个IP ===" > $OUTPUT_FILE
awk -v start="$START_DATE" -v end="$END_DATE" '$4 >= "["start && $4 <= "["end {print $1}' $LOG_FILE | \
sort | uniq -c | sort -nr | head -n $TOP_IP >> $OUTPUT_FILE

# 统计总访问量
TOTAL_VISITS=$(awk -v start="$START_DATE" -v end="$END_DATE" '$4 >= "["start && $4 <= "["end {print $1}' $LOG_FILE | wc -l)
UNIQUE_IPS=$(awk -v start="$START_DATE" -v end="$END_DATE" '$4 >= "["start && $4 <= "["end {print $1}' $LOG_FILE | sort | uniq | wc -l)

echo "" >> $OUTPUT_FILE
echo "=== 统计摘要 ===" >> $OUTPUT_FILE
echo "总访问次数: $TOTAL_VISITS" >> $OUTPUT_FILE
echo "独立IP数量: $UNIQUE_IPS" >> $OUTPUT_FILE
echo "统计时间: $(date)" >> $OUTPUT_FILE

echo "分析完成!结果已保存到: $OUTPUT_FILE"

使用说明

  1. 将上述脚本保存为 apache_ip_stats.sh
  2. 给脚本执行权限:chmod +x apache_ip_stats.sh
  3. 运行脚本:./apache_ip_stats.sh

自定义配置

  • 修改 LOG_FILE 变量为你的Apache访问日志实际路径
  • 修改 DAYS 变量设置要统计的天数范围(1=今天,2=昨天和今天,以此类推)
  • 修改 TOP_IP 变量设置要显示的前N个访问量最高的IP

高级选项

如果你需要更复杂的统计,可以考虑以下修改:

  1. 按小时统计
# 添加小时统计
echo "=== 按小时访问量统计 ===" >> $OUTPUT_FILE
awk -v start="$START_DATE" -v end="$END_DATE" '$4 >= "["start && $4 <= "["end {print substr($4,14,2)}' $LOG_FILE | \
sort | uniq -c >> $OUTPUT_FILE
  1. 统计访问的URL
# 添加最常访问的URL统计
echo "=== 最常访问的前${TOP_IP}个URL ===" >> $OUTPUT_FILE
awk -v start="$START_DATE" -v end="$END_DATE" '$4 >= "["start && $4 <= "["end {print $7}' $LOG_FILE | \
sort | uniq -c | sort -nr | head -n $TOP_IP >> $OUTPUT_FILE
  1. 使用gzip压缩的日志: 如果你的日志是gzip压缩的,可以修改为:
zgrep -h "$START_DATE" /var/log/apache2/access.log.*.gz | awk '{print $1}' | \
sort | uniq -c | sort -nr | head -n $TOP_IP

希望这个脚本对你有帮助!你可以根据实际需求进一步调整和扩展功能。