我有一个以这种格式发出日志的应用程序:
00:00:10,799 ERROR [stderr] (http-prfilrjb08/10.1.29.34:8180-9) {}:return code: 500
我需要监视日志文件中的新ERROR,这是在过去一小时内发生的。看一些教程,我想出了以下grep:
grep "^$(date -d -1 hour +'%H:%M:%S')" /space/log/server.log | grep 'ERROR'
然而没有任何东西被掠过!你能帮我解决一下吗? 谢谢!
答案 0 :(得分:4)
您需要-1 hour
周围的引号,并且还要从输出中删除秒和分钟(您当前的解决方案仅在1小时前的第一秒找到数据):
grep "^$(date -d '-1 hour' +'%H')" /space/log/server.log | grep 'ERROR'
答案 1 :(得分:2)
grep -E "^($(date -d '-1 hour' '+%H')|$(date '+%H')):[0-9]{2}:[0-9]{2}" /space/log/server.log | grep 'ERROR'
让我们来看看部分
grep -E
告诉grep使用扩展正则表达式(所以我们不需要转义所有这些括号)
date -d '-1 hour' '+%H'
打印前一个小时。同样date '+%H'
打印当前小时。这些需要在运行时进行评估并在捕获组中捕获,这就是我们拥有(date|date)
结构的原因(您可能不仅需要前一小时的某些数据,而且还需要当前运行小时的数据)。
接下来,您需要指定您确实在查看时间戳。我们使用:
来分隔小时,分钟和秒。一个两位数的数字组可以与[0-9]{2}
正则表达式匹配(这与[0-9][0-9]
基本相同但更短)
你去。
聚苯乙烯。我推荐sed。