我不擅长编写脚本..
我有两个脚本,第一个是提取access_log的最后五分钟,第二个是计算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 }'
脚本二
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}'
提前致谢
答案 0 :(得分:1)
避免获得EPOC时间,以下是我提出的简化问题的建议。
首先,使用以下格式获取5分钟的时间:
MIN=$(date -d "-5 minutes" +%Y%m%d%H%M%S)
例如,时间输出将类似于:20140114023124
您可以在5天之前或其他时间设置,无论您喜欢什么。
然后在awk或其他地方重新格式化access_log [14/Jan/2014:02:36:50 +0100]
的时间部分,你应该得到20140114023650
并与$ MIN比较,如果超过$ MIN,则打印出来。
因此脚本将是(导出在5分钟内生成的日志)。
MIN=$(date -d "-5 minutes" +%Y%m%d%H%M%S)
awk -F'[][]' -v m=$MIN '{ gsub(/\//," ",$2); sub(/:/," ",$2); "date +%Y%m%d%H%M%S -d \""$2"\""|getline d; if (d>=m) print }' access_log
您可以将标准差计算附加到awk命令中,或者只导出到现有代码: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}'