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

标签 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

纠结了好久。 感谢您的帮助!

最佳答案

您使用的是已弃用的反引号,因此未引用 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 的外部调用,因为 gawk 有它自己的内置时间函数(提示:BEGIN{Date=strftime("%Y- %m-%d %H:%M:%S",systime()-60)}).

你也不需要 uniq -c 但没有看到你的真实输入和预期输出(做一个 uniq -c 假设输入没有任何意义vs wc -l) 我不会再猜了。

哦,见鬼,这是 gawk 中的整个脚本:

$ 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 行并删除硬编码时间戳行即可在您的真实数据上运行。

关于linux - 在最后一分钟内查找日志文件中关键字的出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35225612/

相关文章:

c - C 中的 fork 和 waitpid

c - 来自文件系统的 "short read",什么时候会发生?

linux - 无法将现有的 git 存储库推送到 github

bash - 找不到文件时sftp避免退出

bash - 在同步执行期间如何处理 bash 中的信号?

linux - 加速/并行化大规模硬链接(hard link)循环

arrays - awk程序检查每行是否有 '0'

unix - Awk:使用包含标题的部分修改 csv

linux - 在 Mac 上添加 boost include 编译器路径

linux - awk 在某些命令后不被识别