我的日志采用以下格式:
[2018-01-22T13:40:22,825][WARN ] message
[2018-01-22T13:41:52,830][ERROR ] message
[2018-01-22T13:45:27,831][WARN ] message
我需要编写一个脚本来检查过去5分钟内是否有任何错误。从我在网上发现的,这样的事情应该有效:
awk -v d1="$(date --date="-5 min" "+%Y-%m-%dT%H:%M:%S")" -v d2="$(date "+%Y-%m-%dT%H:%M:%S")" '$0 > d1 && $0 < d2 || $0 ~ d2' log.txt
但事实并非如此。我认为[可能正在阻碍?我还能尝试什么?
答案 0 :(得分:2)
Awk
解决方案:
示例log.txt
:
[2018-01-22T13:40:22,825][WARN ] message
[2018-01-23T00:38:37,830][ERROR ] message
[2018-01-22T13:45:27,831][WARN ] message
awk -v d1="$(date --date="-5 min" "+%Y-%m-%dT%H:%M:%S")" \
-v d2="$(date "+%Y-%m-%dT%H:%M:%S")" \
'$2 > d1 && $2 < d2 && $4~/ERROR/' FS='[\\[\\]]' log.txt
FS='[\\[\\]]'
- 将方括号视为复杂字段分隔符输出:
[2018-01-23T00:38:37,830][ERROR ] message
答案 1 :(得分:2)
你是对的,[
正在阻碍你。
词典比较,$0 > d1
,比较如下:
[2018-01-22T13:45:27,831][WARN ] message
与
2018-01-22T13:45:27
和[...
始终大于以数字开头的任何字符串,例如20..
。
同样适用于$0 < d2
- 但在这种情况下,条件从不满足([20..
始终大于20..
)。这就是为什么你没有得到任何输出。
快速解决问题的方法是简单地格式化d1
和d2
以[
开头:
awk -v d1="$(date --date="-5 min" "+[%Y-%m-%dT%H:%M:%S")" -v d2="$(date "+[%Y-%m-%dT%H:%M:%S")" '$0 > d1 && $0 < d2' log