选择2行依赖的模式

时间:2019-07-19 07:54:16

标签: awk sed grep

如何从日志文件中选择/过滤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

2 个答案:

答案 0 :(得分:0)

这将打印两行

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 :(得分:0)

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

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

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