【问题标题】:Select Pattern with dependencie of 2 lines选择依赖 2 行的模式
【发布时间】:2019-07-19 17:16:56
【问题描述】:

如何从依赖 2 行的日志文件中选择/过滤内容。 我需要从日志文件中过滤掉内容,如果当前行中的“pattern1”后面跟着下一行的“pattern2”?

示例:第 1 到 7 行

18.07.19 23.44.01  APP1    CHECK SRBR 820224  APPUSER       12   
18.07.19 23.44.01  APP1    DATABASE ERROR ------> PROGRAM FAILURE APPUSER 866
18.07.19 23.44.01  APP1    OPTI-LOCK-FORCE-ERROR SITUATION A                  
18.07.19 23.44.01  APP1    CHECK SRBR 820224 
18.07.19 23.44.01  APP1    DATABASE ERROR ------> PROGRAM FAILURE
18.07.19 23.44.01  APP1    CHECK SRBR 820224 
18.07.19 23.44.01  APP1    ROLLBACK

如果发生

DATABASE ERROR ------> PROGRAM FAILURE

在当前行后跟内容

OPTI-LOCK-FORCE-ERROR SITUATION

在下一行 然后我想过滤掉这两条线。

我需要知道DATABASE ERROR ------> PROGRAM FAILUREOPTI-LOCK-FORCE-ERROR SITUATION 的单个事件。

如果我使用

sed -n '/DATABASE ERROR ------> PROGRAM FAILURE/,/OPTI-LOCK-FORCE-ERROR/!p'

示例中的第 5 行也被过滤掉了

哪种语法/工具可以支持这一点,我更喜欢 grep、sed 或 awk。 非常感谢,Steff

【问题讨论】:

    标签: awk sed grep


    【解决方案1】:

    这将打印两行

    awk '/OPTI-LOCK-FORCE-ERROR SITUATION/ && p~/DATABASE ERROR ------> PROGRAM FAILURE APPUSER/ {print $0"\n"p} {p=$0}'
    18.07.19 23.44.01 APP1 OPTI-LOCK-FORCE-ERROR SITUATION A
    18.07.19 23.44.01 APP1 DATABASE ERROR ------> PROGRAM FAILURE APPUSER 866
    

    它测试了行是OPTI-LOCK....,前一行是DATABASE...,并打印两者。

    【讨论】:

    • 谢谢,模式匹配工作正常。但是我需要没有这两行的日志文件的输出,以防只有这行在日志文件中逐行跟随。例如,我需要将第 1 行和第 4-7 行的输出打印出来。斯特夫
    【解决方案2】:

    这可能对你有用(GNU sed):

    sed '/DATABASE ERROR ------> PROGRAM FAILURE/{N;/OPTI-LOCK-FORCE-ERROR/d;P;D}' file
    

    如果当前行包含DATABASE ERROR ------> PROGRAM FAILURE,则追加下一行,如果包含OPTI-LOCK-FORCE-ERROR,则删除两者,否则打印/删除第一行并重复。

    【讨论】:

    • 谢谢,不幸的是系统上没有可用的“gnu sed”
    • @Steff 按原样试一试,它可能会完美运行。
    • sed '/数据库错误 ------> 程序失败/{N;/OPTI-LOCK-FORCE-ERROR/d;P;D}' /tmp/opti_sr_4_stackoverflow ---- -------------------------------------------------- -----------------------------------------------------------sed:命令乱码:/DATABASE ERROR ------> PROGRAM FAILURE/{N;/OPTI-LOCK-FORCE-ERROR/d;P;D}
    • 嗨 Potong,我在较新的 Rhel 系统上进行了测试,您的命令运行良好,但在 Solaris 10 上不行。
    猜你喜欢
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    相关资源
    最近更新 更多