我尝试使用 awk 命令从日志文件中提取过去 5 分钟的内容。下面是我使用的命令
`awk -v d1="$(date --date="-5 min" "+%m/%d/%y %k:%M:%S:%3N")" -v d2="$(date "+%m/%d/%y %k:%M:%S:%3N")" '$0 > d1 && $0 < d2 || $0 ~ d2' /tmp/test.log
发现该条件'$0 > d1 && $0 < d2 || $0 ~ d2'
仅适用于特定日期格式。我的日志中的日期格式如下:[2/9/17 13:30:35:552 EST] 我上面运行的命令不起作用。
但当我测试其他日期格式时,如下所示:2 月 9 日 14:01
条件起作用了。
awk -v d1="$(date --date="-30 min" "+%b %_d %H:%M")" -v d2="$(date "+%b %_d %H:%M")" '$0 > d1 && $0 < d2 || $0 ~ d2' /tmp/test2.log
知道为什么这个条件对 [2/9/17 13:30:35:552 EST] 日期格式不起作用吗?
答案1
假设[2/9/17 13:30:35:552 EST]
是格式,那么17
始终代表2017
并且时区转换不是问题(EST
被忽略)。
假设这是一个示例日志:
$ cat test.log
[2/1/17 10:30:35:000 EST] a
[2/2/17 13:30:31:553 EST] bbb
[2/9/17 09:00:00:000 EST] ccc
[2/9/17 13:30:33:657 EST] ddd
我想你会喜欢这样的东西:
$ ./calc.sh '2017-02-01 10:00:00' 2017-02-03
[2/1/17 10:30:35:000 EST] a
[2/2/17 13:30:31:553 EST] bbb
$ ./calc.sh '1 Feb 2017' now
[2/1/17 10:30:35:000 EST] a
[2/2/17 13:30:31:553 EST] bbb
[2/9/17 09:00:00:000 EST] ccc
[2/9/17 13:30:33:657 EST] ddd
$ ./calc.sh '5 Feb 2017' now
[2/9/17 09:00:00:000 EST] ccc
[2/9/17 13:30:33:657 EST] ddd
这是我的解决方案(为了清晰起见,扩展了很多变量):
$ cat calc.sh
#!/bin/bash
awk -v d1="$(date +%s --date="$1")" -v d2="$(date +%s --date="$2")" '
{
tDate = substr($1, 2)
split(tDate, dToken, "/")
month = dToken[1]
day = dToken[2]
year = "20"dToken[3]
tTime = $2
tTZ = substr($3, 1, length($3) - 1)
split(tTime, tToken, ":")
hh = tToken[1]
mm = tToken[2]
ss = tToken[3]
ts = mktime(year" "month" "day" "hh" "mm" "ss)
# maybe >= and <= would be better
if ((ts > d1) && (ts < d2)) {
print
}
}
' test.log