shell脚本统计nginx日志每分钟/小时的qps,pv,简单实用附带思路和注释!

脚本思路:

先思考获取每分钟的PV,qps 该如何做?

处理较小的日志可以直接cat,因为要循环取,频繁操作日志文件,如果日志过大,会执行很慢,

所以先把我们要的东西给提出来,

cat test.log| cut -d ' ' -f4 | uniq -c | sort -n -r -o ./temp_sorted.log

上面这条命令

查看日志 |(管道符) cut以“ ”(空格)为分隔符,取出第四列  |  统计次数并且去重 | 按照数值排序,逆序,输出结果到temp_sorted.log 中

统计次数并且去重,因为我们取的是时间那一列,如果一秒访问了10次,那么日志里就会出现10行一样的,所以去重统计次数,可以查看每秒访问了多少。

temp_sorted.log日志内容如下:

shell脚本统计nginx日志每分钟/小时的qps,pv,简单实用附带思路和注释!_第1张图片

既然每秒的qps我们已经拿到了,那就好说了,接下来就是求每分钟了

一小时60分钟,先求一个小时的,拿12点来算

需要循环60次,12:00-12:59   这是12点要循环的

先求每分钟的qps,

cat temp_sorted.log |grep ":12:01:"|awk '{sum += $1}END{print sum}'

上面这行代码:

查看日志文件 |  搜索出12:01分的数据 | 切割,用awk的求和来加$1(也就是每秒钟的次数),每秒钟的次数叠加在一块,加够了所有的,就得出了12:01分的qps和pv了

然后将时分写做变量,在当前代码的外层写个循环60次(一小时60分钟所以60次)就得出一小时的了

得出一小时之后,在再外层写个循环24次(一天24小时),就得出每小时的了,最后再通过一个变量,把每小时的加一块,就是每天的了,效果图如下:

这是每分钟的qps

shell脚本统计nginx日志每分钟/小时的qps,pv,简单实用附带思路和注释!_第2张图片

这是每小时的qps

shell脚本统计nginx日志每分钟/小时的qps,pv,简单实用附带思路和注释!_第3张图片

 

完整脚本内容如下:

 

#!/bin/bash

####获取输入
read -p "请输入日志名称: " log_name
####判断日志是否存在
if [[ -e $log_name ]];then
   echo "开始检查文件: $log_name"
else
   echo "文件不存在,请检查输入的路径."
   exit
fi
####将日志进行统计,每秒钟的请求数
cat ./$log_name | cut -d ' ' -f4 | uniq -c | sort -n -r -o ./temp_sorted.log
###定义一天的pv,初始值为0 
all_pv=0
###循环24小时,一天
for hour in `seq 0 23`
do
#定义每分钟的pv
min_all_pv=0
#判断是不是0-9,如果是需要手动加0
if (( $hour <= 9 ));then
	#循环每一分钟
	for minute in `seq 0 59`
	do
           ##判断是不是前9分钟,如果是,需要手动加0
	   if (( $minute <= 9 ));then
		###将每分钟的请求数相加
		min_sum_pv=`cat temp_sorted.log |grep ":0$hour:0$minute:"|awk '{sum += $1}END{print sum}'`
		#可以查看每分钟的请求数是多少
   		#echo "0$hour:0$minute的请求数是:   $min_sum_pv"
  	   ##不是前9分钟,不需要加0
	   else
		min_sum_pv=`cat temp_sorted.log |grep ":0$hour:$minute:"|awk '{sum += $1}END{print sum}'`
		#echo "0$hour:$minute的请求数是:   $min_sum_pv"
 	  fi
	   min_all_pv=`expr $min_sum_pv + $min_all_pv`
	done
	#输出空行,可以有效的分隔出每小时的总pv
        #echo -e "\n"
	echo "0$hour时的总请求数是: $min_all_pv"
	all_pv=`expr $min_all_pv + $all_pv`
	#echo -e "\n"
else
        for minute in `seq 0 59`
        do
           if (( $minute <= 9 ));then
                min_sum_pv=`cat temp_sorted.log |grep ":$hour:0$minute:"|awk '{sum += $1}END{print sum}'`
                #echo "$hour:0$minute的请求数是:   $min_sum_pv"
           else 
                min_sum_pv=`cat temp_sorted.log |grep ":$hour:$minute:"|awk '{sum += $1}END{print sum}'`
                #echo "$hour:$minute的请求数是:   $min_sum_pv"
          fi
           min_all_pv=`expr $min_sum_pv + $min_all_pv`
        done
        #echo -e "\n"
        echo "$hour时的总请求数是: $min_all_pv"
	all_pv=`expr $min_all_pv + $all_pv`
        #echo -e "\n"
fi
done
echo "总pv是: $all_pv"
rm -f ./temp_sorted.log

脚本是放在log目录下执行的,所以我写的是./ ,如果日志在不同的目录,把./去掉,输入的时候就输入绝对路径就行了。

 

 

你可能感兴趣的:(shell,三剑客)