2017-03-22 76 views
2

我有一个日志'test.log',并且我只想输出最近24小时或当前日期(从午夜开始)的行出现'错误'一词。搜索过去24小时或当前日志中的错误

日志与比赛的内容,如下所示:

周三3月22日4点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行并将输出发送到我。

谢谢!

+0

使用一个健全的格式为你的时间戳。另外,在读取日志文件时使用'-'作为分隔符。 –

回答

1

要获得所有当天的错误消息也只是你喜欢这些取其:

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

日志文件时间戳以UTC表示。这是否照顾到了这一点? –

+0

它与OP中的日期显示在我们的样本('Mar Mar 22')文件的每一行的开始处相同。如果OP在他的'date'命令中需要一个特定的时区,他可以简单地设置它。 –

+1

我想我过于复杂了我的原始脚本,甚至没有考虑过当前日期和问题。这很好,谢谢! – user198634

-1

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

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 ago00:00以来午夜ERROR当前天的日志行。

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

++对于'systime'和'mktime'方法 - 只需要注意,这只适用于GNU awk。 – jm666

相关问题