在最后一分钟内查找日志文件中关键字的出现次数

时间:2016-02-05 13:38:29

标签: linux bash awk command-line

出于向AWS CloudWatch发布指标的目的,我想获取应用程序日志中最后一分钟(从当前系统时间)内某些关键字(例如,错误,异常)的出现次数的信息。

以下是我根据相关主题(Filter log file entries based on date range)的答案尝试的命令:

awk -vDate=`date -d'now-1 minutes' +["%Y-%m-%d %H:%M:%S"` '($1 FS $2) > Date {print $3}' application.log | grep "ERROR" | uniq -c

awk -vDate=`date -d'now-1 minutes' +["%Y-%m-%d %H:%M:%S"` '{if ($1 > Date) {print $3}}' application.log | grep "ERROR" | uniq -c

awk -vDate=`date -d'now-1 minutes' +["%Y-%m-%d %H:%M:%S"` '{if ($1 == $Date) {print $3}}' application.log | grep "ERROR" | uniq -c

但是当我尝试这个时,我收到这样的错误:

awk: cmd. line:1: 13:06:17
awk: cmd. line:1:   ^ syntax error

以下是我的日志文件的格式:

2016-02-05 12:10:48,761 [INFO] from org.xxx
2016-02-05 12:10:48,761 [INFO] from org.xxx
2016-02-05 12:10:48,763 [INFO] from org.xxx
2016-02-05 12:10:48,763 [INFO] from org.xxx
2016-02-05 12:10:48,763 [ERROR] from org.xxx
2016-02-05 12:10:48,763 [INFO] from org.xxx
2016-02-05 12:10:48,764 [INFO] ffrom org.xxx
2016-02-05 12:10:48,773 [WARN] from org.xxx
2016-02-05 12:10:48,777 [INFO] from org.xxx
2016-02-05 12:10:48,778 [INFO] from org.xxx

坚持这一点很长一段时间。 谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

您正在使用已弃用的反引号,因此不引用date输出。这样做:

awk -vDate="$(date -d'now-1 minutes' +"%Y-%m-%d %H:%M:%S")" '($1 FS $2) > Date { if ($3~/ERROR/) print $3}' file

请注意,您不需要管道grep,并且-vDate之间没有空格,您的脚本特定于gawk,如果它是'因为gawk拥有自己的内置时间函数(提示:date),所以你不需要对BEGIN{Date=strftime("%Y-%m-%d %H:%M:%S",systime()-60)}进行外部调用。

您也不需要uniq -c但却看不到您的实际输入和预期输出(执行uniq -c,因为输入对wc -l没有任何意义我不会再猜了。

哦,到底是什么,这是整个剧本中的傻瓜:

$ cat tst.awk
BEGIN {
    #date = strftime("%Y-%m-%d %H:%M:%S",systime()-60)
    date = "2016-02-05 12:10:48"
}
($1" "$2) > date {
    if ($3 ~ /ERROR/) {
        cnt[$3]++
    }
}
END {
    for (err in cnt) {
        print err, cnt[err]
    }
}
$
$ awk -f tst.awk file
[ERROR] 1

我认为实际上你有各种各样的" ERROR"这就是为什么你想要每个人的计数。只需取消注释strftime行并删除硬编码时间戳行即可在您的实际数据上运行。