我有以下grep命令,它通过远程机器在过去24小时内在日志中查找“异常”字符串,并打印出下40行。
ssh $host $'sed -e "1,/^$(date -d -20hour +\'%Y-%m-%d %H\')/d" /mylogs.out | grep -A40 "Exception in"' >> $log
这非常适合捕获例如下面的例外:
2016-02-08 13:19:34,034 ERROR [qtp859655531-3974] com.project.actions.CustomStatsAction - Exception in .....
但是,有时,该行以WARN而不是ERROR开头,我不想在我的结果中使用带有WARN的行。例如:
2016-02-08 13:19:34,034 WARN [qtp859655531-3974] com.project.actions.CustomStatsAction - Exception in ....
我应该如何修改我的查询来实现这一目标?
答案 0 :(得分:1)
将fgrep -v WARN
附加到您的管道以过滤掉不需要的行。
答案 1 :(得分:1)
使用grep -A40 -E "ERROR .*Exception in"
请注意-A
不是标准的,并且在GNU的grep中可用。
答案 2 :(得分:0)
上面的fgrep -v
答案应排除输出中包含WARN的所有行。如果您真的想跳过处理WARN行,请更改您的sed表达式以删除包含WARN的所有行。
将以下额外命令添加到sed
表达式的开头应该可以解决问题。在添加其他sed魔法之前,您正在添加一个命令来删除包含WARN的所有行。把它放在你的第一个双引号内。
ssh $host $'sed -e "/WARN/d;1,/^$(date -d -20hour +\'%Y-%m-%d %H\')/d" /mylogs.out | grep -A40 "Exception in"'