GREP搜索修改:按字符串过滤

时间:2016-02-17 19:25:49

标签: bash shell unix grep

我有以下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 ....

我应该如何修改我的查询来实现这一目标?

3 个答案:

答案 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"'