【问题标题】:GREP search modification: filter by stringGREP搜索修改:按字符串过滤
【发布时间】:2016-02-19 05:50:08
【问题描述】:

我有以下 grep 命令,它通过远程机器在过去 24 小时的日志中查找“Exception in”字符串并打印出接下来的 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 ....

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

【问题讨论】:

    标签: bash shell unix grep


    【解决方案1】:

    使用grep -A40 -E "ERROR .*Exception in"

    请注意-A 不是标准的,在 GNU 的 grep 中可用。

    【讨论】:

    • 这正是我想要的
    【解决方案2】:

    将fgrep -v WARN 附加到您的管道以过滤掉不需要的行。

    【讨论】:

    • 我认为这只会排除 WARN 字符串;如果它以 WARN 开头,我根本不想处理数据。
    • 它应该从输出中排除所有包含 WARN 的行。如果您想跳过处理 WARN 行,请将 sed 表达式的开头更改为:
    • @GregTarsa :我的查询基于“Exception in”字符串。所以,如果字符串中存在“异常”并且行不是以 WARN 开头,我需要打印接下来的 40 行
    • 是的,我现在明白了。添加命令执行 sed 表达式以删除 WARN 更符合您的要求。顺便说一句,如果grep -A 选项不可用,您可以将| head -40 添加到命令的末尾以获得相同的效果。 (我喜欢尽可能使用最普通的选项。)
    【解决方案3】:

    上面的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"'
    

    【讨论】:

    • :像这样的吗? ssh $host $'sed -e "/WARN/d 1,/^$(date -d -20hour +\'%Y-%m-%d %H\')/d" /mylogs.out | grep -A40 "Exception in"' 这实际上给出了一些语法错误。很抱歉打扰,但我是 shell 脚本的新手
    • 在d 后面加一个分号。 sed 允许您以这种方式在一行(或在一个表达式中)组合命令。我会修改我的答案以使这一点更清楚。
    猜你喜欢
    • 2013-10-31
    • 2018-06-29
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多