nginx日志分析: 每小时请求量最高的IP

发布时间 2023-09-26 11:50:30作者: 天海沙

按小时来统计, 当前指定日志的每小时最高流量的前10个IP, 并显示出请求的状态码.

nginx.conf中配置的日志格式为:

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

# 功能: 按小时来统计, 当前指定日志的每小时最高流量的前10个IP, 并显示出请求的状态码.
# 使用方法: "./analysis_logs_with_nginx.bash 路径/日志文件名"
# 制作人: zl
# 制作时间: 2023.09.26

#!/bin/bash

# 接收指定的文件名
logname=$1

# 获取日志记录的最新的一条的小时数
ntime=$(tail -n 1 $logname | awk '{print $4}' | grep -oE "[0-9][0-9][0-9][0-9]:[0-9][0-9]:[0-9][0-9]:[0-9][0-9]" | awk -F: '{print $2}')

# 获取指定日志的当前年份
cyear=$(tail -n 1 $logname | awk '{print $4}' | grep -oE "[0-9][0-9][0-9][0-9]:[0-9][0-9]:[0-9][0-9]:[0-9][0-9]" | awk -F: '{print $1}')

# 按指定日志记录的最大时间,开始循环输出统计结果
i=0
while [ $i -le $ntime ]
do
# 判断1-9点之间时拼接小时字符串, 否则跳过
if [ $i -lt 10 ];
then 
ctime="0$i" 
else
ctime="$i"
fi
# 统计并显示指定日志文件中每小时请求次数最高的前10个IP
echo "以下为$logname日志中, $ctime点00分~59分时间段内, 请求最高的10个IP值: "
cat $logname | grep "$cyear:$ctime:" | awk '{print $1,$9}' | sort | uniq -c | sort -rn | head -10
((i++))
echo -e "\n"
done


# 统计整个日志流量前10的IP
#cat website_ssr_access.log | awk '{print $1,$9}' | sort | uniq -c | sort -rn | head -10  
# 统计日志中某小时的流量前10的IP
#cat website_ssr_access.log | grep "07:" | awk '{print $1,$9}' | sort | uniq -c | sort -rn | head -10