Shell 腳本循環遍歷日志文件中的值進行求和並計算平均值,最大值和最小值


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

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

  

  為了便於驗證,寫了一個簡單的日志文件 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 相關行的耗時統計:

   

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM