Shell 指令碼迴圈遍歷日誌檔案中的值進行求和並計算平均值,最大值和最小值

香吧香發表於2022-01-21

本文為博主原創,轉載請註明出處:

  最近在進行壓測,為了觀察並定位服務效能的瓶頸,所以在程式碼中很多地方加了執行耗時的日誌,但這種方式只能觀察,卻在壓測的時候,不太能準確的把握程式碼中某些方法的效能,所以想到寫一個指令碼,用來統計所加的日誌中的平均耗時,最大耗時,最小耗時等等,這需要保證每行日誌都是唯一的,程式碼中新增日誌的方式如下:

  

  為了便於驗證,寫了一個簡單的日誌檔案 console.log ,內容如下:

[root@iZ2ze10u5v2hhw1ezi52suZ shell]# cat console.log
filterStr 23
filterStr 56
filterStr 89
filterStr 1
filterStr 10
filterStr 2
requireTime 3
requireTime 4
requireTime 3
requireTime 10

 

1.先編寫一個計算 含 filterStr  日誌行的所有平均時間,最大時間,最小時間,指令碼示例如下:

#!/bin/bash
sum=0
min=`cat console.log|grep "filterStr"|awk '{print $2}'|head -n 1`
max=0

for value in `cat console.log|grep 'filterStr'|awk '{print $2}'`
        do
                sum=$(($sum+$value))

                if [ $value -le $min ];then
                        min=$value
                fi

                if [ $value -ge $max ];then
                        max=$value
                fi
        done
echo "總共耗時:"$sum

totalCount=`cat console.log|grep 'filterStr'|awk '{print $2}'|wc -l`
echo "總共請求次數為:"$totalCount

#計算請求的平均時間
avageTime=$(($sum/$totalCount))
echo "平均請求響應時間為: "$avageTime

#列印最大值與最小值
echo "最大值為:"$max
echo "最小值為:"$min

 

  最小值的初始定義命令為:  min=`cat console.log|grep "filterStr"|awk '{print $2}'|head -n 1`  ; 這行命令過濾出日誌的所有行,並取第一行中過濾出的第二個值(awk '{print $2}')。所以需要提前預定好 該耗時計算在日誌中的位置,我這邊示例中位於第二個位置,所以取第二個$2 的 值

  該指令碼執行效果如下:

    

 

2. 通過動態傳參過濾內容的方式執行執行指令碼

  由於服務中加了很多位於不同程式碼處的耗時日誌,所以想到通過動態傳參的方式執行指令碼,shell 指令碼示例如下:

#!/bin/bash
sum=0
min=`cat console.log|grep "$filterStr"|awk '{print $2}'|head -n 1`
max=0

filterStr=$1

for value in `cat console.log|grep "$filterStr"|awk '{print $2}'`
        do
                sum=$(($sum+$value))

                if [ $value -le $min ];then
                        min=$value
                fi

                if [ $value -ge $max ];then
                        max=$value
                fi
        done
echo "總共耗時:"$sum

totalCount=`cat console.log|grep "$filterStr"|awk '{print $2}'|wc -l`
echo "總共請求行數為:"$totalCount

#計算請求的平均時間
avageTime=$(($sum/$totalCount))
echo "平均請求響應時間為: "$avageTime

#列印最大值與最小值
echo "最大值為:"$max
echo "最小值為:"$min

  

  用該指令碼計算 console.log 中的 requireTime 相關行的耗時統計:

   

 

相關文章