在过去24小时或当天搜索日志中的错误

时间:2017-03-22 13:53:29

标签: bash date awk

我有一个日志,' test.log',我想只输出过去24小时,或者当前几天(从午夜开始)这些单词' ERROR'出现。

匹配日志的内容如下:

  

Wed Mar 22 04:20:05 UTC 2017 - 错误 - 出了点问题。请检查。

我尝试过以下操作,但是在过去的24小时内,我在日志中找到了“错误”字样的所有行。出现。

awk -v d="$(date -d '24 hours ago' +'%a %b %d %T %Z %Y')" '$1" "$2>=d &&/ERROR/' test.log

我也试过

awk -v d="$(date -d 'today' +'%a %b %d %T %Z %Y')" '$1" "$2>=d &&/ERROR/' test.log

awk -v d="$(date -d '1 day ago' +'%a %b %d %T %Z %Y')" '$1" "$2>=d &&/ERROR/' test.log

具有相同的结果。

我需要这个工作,而不必给它我正在搜索的确切日期,因为它将在cron中设置以查找过去24小时(或从午夜以来)的ERROR行并通过电子邮件发送输出对我来说。

谢谢!

4 个答案:

答案 0 :(得分:1)

在GNU awk中使用函数mktimesystime

$ awk '               
BEGIN{
    FS="[ :]"                        # multichar FS
    split("Jan Feb Mar Apr",m," ")   # add months here
    for(i in m)                      # flip keys and vals 
        mm[m[i]]=sprintf("%02d", i)  # zeropad month #s
        st=systime()                 # remember now
}
{
    t=mktime($8 " " mm[$2] " " $3 " " $4 " " $5 " " $6)
    if(t > st-86400)                 # now I'm sure. lol
        print                        # print if cool
}' file
Wed Mar 22 04:20:05 UTC 2017 - ERROR - something has gone wrong. Please check.

答案 1 :(得分:1)

要获取当天的所有错误消息,您可以选择以下任何一种:

grep "^$(date +'%a %m %d').*ERROR" file
awk -v date="$(date +'%a %m %d')" '$0 ~ "^"date".*ERROR"' file

答案 2 :(得分:0)

试试这个awk脚本:

BEGIN {
    IFS = "-"
    cmd = "date +%s --date=\"24 hours ago\""
    cmd | getline threshold
    close(cmd)
}
/ERROR/ {
    cmd = "date +%s --date='" $1 "'";
    cmd | getline stamp
    close(cmd)
    if (stamp >= threshold) print
}

使用以下方式运行:

awk -f above_script_file_name log_file

从午夜开始,将24 hours ago更改为00:00当天的日志行ERROR

答案 3 :(得分:-1)

您不应该比较日期的前两个单词,而应该比较第二个和第三个单词。另外,请记住这是一个字符串比较,因此较长字符串的子字符串将始终排序。