我不是在腳本很好結合的awk腳本..爲Apache日誌
我有兩個劇本,第一個是提取我的訪問日誌的最後五分鐘,而第二個是計算apache響應時間的標準偏差,所以我可以創建一個nagios警報。
所以,基本上我需要的是計算Apache的access_log的最後五分鐘的標準偏差。
任何人都可以幫我一下嗎?
腳本一個
x=$((5*60))
last=$(tail -n1 access_log|awk -F'[][]' '{ gsub(/\//," ",$2); sub(/:/," ",$2); "date +%s -d \""$2"\""|getline d; print d;}')
awk -F'[][]' -v last=$last -v x=$x '{ gsub(/\//," ",$2); sub(/:/," ",$2); "date +%s -d \""$2"\""|getline d; if (last-d<=x)print $0 }'
腳本2
awk '{x[NR]=$11; s+=$11} END{a=s/NR; for (i in x){ss += (x[i]-a)^2} sd = sqrt(ss/NR); print "SD = "sd}' access_log
哎呀,我已經想通了,問題是第二個腳本實際上解析錯行,所以我的連接提前
正確的腳本# this variable you could customize, important is convert to seconds.
# e.g 5days=$((5*24*3600))
x=$((5*60)) #here we take 5 mins as example
# this line get the timestamp in seconds of last line of your logfile
last=$(tail -n1 access_log2|awk -F'[][]' '{ gsub(/\//," ",$2); sub(/:/," ",$2); "date +%s -d \""$2"\""|getline d; print d;}')
awk -F'[][]' -v last=$last -v x=$x '{ gsub(/\//," ",$2); sub(/:/," ",$2); "date +%s -d \""$2"\""|getline d; if (last-d<=x)print $0 }' access_log2 |
awk '{x[NR]=$14; s+=$14} END{a=s/NR; for (i in x){ss += (x[i]-a)^2} sd = sqrt(ss/NR); print "SD = "sd}'
謝謝
可不可以給一些樣品輸入或日誌,以及關於你在哪裏有點解釋卡住? – fedorqui
請注意,在第二個腳本中,您將每個響應時間存儲在一個數組中,因此您可以獲得一個潛在的巨大數組。你可以通過存儲時間平方的運行總和來避免這種情況,並用平均數的平方來做一些簡單的數學運算。 –
順便說一下,我認爲你的第二個腳本適用於我(平均文件大小,導致我的日誌不打印響應時間) –