使用awk統計最大值、最小值、平均值 幫同事處理問題時遇到一個需求,從日誌中查詢當天某個值的最大值、最小值、平均值,最終通過兩種方式實現: 1、使用sort排序,求最大值、最小值,使用for迴圈求平均值:grep RenewalCheckIbatisDAO.*getHistoryPolicyListByLicenceNo pafa.log |awk -F'time=' '{print $2}'|awk -F'ms' '{a[NR]=$1} END{b=0;c=a[1];d=a[1];for (i in a){b=b+a[i];if(c>a[i])c=a[i];if (d<a[i]) d=a[i]};print "Min:"c,"Max:"d,"Avg:"b/NR}' 2、使用for迴圈+if判斷求最大值、最小值、平均值:grep RenewalCheckIbatisDAO.*getHistoryPolicyListByLicenceNo pafa.log.2013-05-19 |awk -F'time=' '{print $2}'|awk -F'ms' '{a[NR]=$1} END{b=0;c=a[1];d=a[1];for (i in a){b=b+a[i];if(c>a[i])c=a[i];if (d<a[i]) d=a[i]};print "Min:"c,"Max:"d,"Avg:"b/NR}' 經過測試在500W的日誌中兩者的效率差不多:[pub_log_mon@cnsz031500 pa18shopauto]$ wc -l pafa.log.2013-05-195038206 pafa.log.2013-05-19 [pub_log_mon@cnsz031500 pa18shopauto]$ time(grep RenewalCheckIbatisDAO.*getHistoryPolicyListByLicenceNo pafa.log.2013-05-19 |awk -F'time=' '{print $2}'|awk -F'ms' '{print $1| "sort -n"}' | awk '{a[NR]=$1} END{for (i in a)b=b+a[i];print "Min:"a[1],"Max:"a[NR],"Avg:"b/NR}')Min:0 Max:1029 Avg:45.0941real 0m2.450suser 0m0.893ssys 0m1.613s [pub_log_mon@cnsz031500 pa18shopauto]$ time(grep RenewalCheckIbatisDAO.*getHistoryPolicyListByLicenceNo pafa.log.2013-05-19 |awk -F'time=' '{print $2}'|awk -F'ms' '{a[NR]=$1} END{b=0;c=a[1];d=a[1];for (i in a){b=b+a[i];if(c>a[i])c=a[i];if (d<a[i]) d=a[i]};print "Min:"c,"Max:"d,"Avg:"b/NR}')Min:0 Max:1029 Avg:45.0941real 0m2.432suser 0m0.895ssys 0m1.571s