脚本思路:
先思考获取每分钟的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日志内容如下:
既然每秒的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
这是每小时的qps
完整脚本内容如下:
#!/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目录下执行的,所以我写的是./ ,如果日志在不同的目录,把./去掉,输入的时候就输入绝对路径就行了。