为apache日志组合awk脚本

时间:2014-01-14 14:18:03

标签: apache bash awk

我不擅长编写脚本..

我有两个脚本,第一个是提取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}'

提前致谢

1 个答案:

答案 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}'