我有一个日志,' 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行并通过电子邮件发送输出对我来说。
谢谢!
答案 0 :(得分:1)
在GNU awk中使用函数mktime
和systime
:
$ 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)
您不应该比较日期的前两个单词,而应该比较第二个和第三个单词。另外,请记住这是一个字符串比较,因此较长字符串的子字符串将始终排序。