删除符合条件的代码块

时间:2019-04-12 12:57:13

标签: linux awk sed grep

我有一个非常大的文本文件,基本上是一个消息日志,在消息之间用{作为分隔符。如果它们满足特定条件,我想删除{之间的块。在下面的示例中,我要删除具有EVENT_TYPE = BDE的中间消息块,并保留两条ABC消息。文件位于Linux机器上,因此我可以访问所有常规的grepsedawk等。我可以使用这些过程来找到EVENT_TYPE,但不确定如何然后找到较大的块并将其删除。

}
/type/ - DataEvents = {
VALUE = 2342
EVENT_TYPE = ABC
VALUE_YESTERDAY = 1299
HAS_DELAY = false
SEND_TIME_RT = 18:55:21.224+00:00
} 

/type/ - DataEvents = {
VALUE = 889
EVENT_TYPE = BDE
VALUE_YESTERDAY = 778 
HAS_DELAY = false
SEND_TIME_RT = 18:55:21.224+00:00
} 

/type/ - DataEvents = {
VALUE = 123
EVENT_TYPE = ABC
VALUE_YESTERDAY = 345
HAS_DELAY = false
SEND_TIME_RT = 18:55:21.224+00:00
} 

6 个答案:

答案 0 :(得分:3)

每当输入数据具有名称=值对时,我发现为每个记录(下面的f[])首先创建该映射的数组(下面的rec)是最方便/最可靠/可维护/可扩展的,并且然后按其名称访问值以进行测试,打印等。

$ cat tst.awk
BEGIN { FS=" *= *" }
NF { rec = rec $0 ORS; f[$1] = $2 }
/^}/ {
    if ( f["EVENT_TYPE"] != "BDE" ) {
        print rec
    }
    rec = ""
    delete f
}

$ awk -f tst.awk file
/type/ - DataEvents = {
VALUE = 2342
EVENT_TYPE = ABC
VALUE_YESTERDAY = 1299
HAS_DELAY = false
SEND_TIME_RT = 18:55:21.224+00:00
}

/type/ - DataEvents = {
VALUE = 123
EVENT_TYPE = ABC
VALUE_YESTERDAY = 345
HAS_DELAY = false
SEND_TIME_RT = 18:55:21.224+00:00
}

答案 1 :(得分:1)

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

sed '/{/{:a;N;/}/!ba;/EVENT_TYPE = BDE/d}' file

收集{}之间的行,如果这些行包含EVENT_TYPE = BDE,则将其删除。

答案 2 :(得分:0)

使用多字符RS的gawk,您可以将RS设置为将每个块视为一条记录,然后像往常一样在该记录内进行测试。我们使用NR > 1来忽略从以记录分隔符开始的数据中产生的不需要的第一(空)记录(假设它确实存在,从您的部分样本中还不清楚)。

$ gawk -v RS='/type/' 'NR > 1 && !/EVENT_TYPE = BDE/ { printf "/type/%s", $0 }' file
/type/ - DataEvents = {
VALUE = 2342
EVENT_TYPE = ABC
VALUE_YESTERDAY = 1299
HAS_DELAY = false
SEND_TIME_RT = 18:55:21.224+00:00
}

/type/ - DataEvents = {
VALUE = 123
EVENT_TYPE = ABC
VALUE_YESTERDAY = 345
HAS_DELAY = false
SEND_TIME_RT = 18:55:21.224+00:00
}

答案 3 :(得分:0)

请您尝试以下。

awk '
/{/{
  val=""
}
/}/{
  if(found=="" && val){
     print val ORS $0
  }
  found=val=""
  next
}
/EVENT_TYPE = BDE/{
  found=1
}
{
  val=(val?val ORS:"")$0
}
END{
  if(val && found==""){
    print val ORS $0
  }
}
'   Input_file

答案 4 :(得分:0)

怎么样

$ vim -es '+g/EVENT_TYPE = BDE/exe "norm! dap"' '+%print' '+q!' file

输出:

}
/type/ - DataEvents = {
VALUE = 2342
EVENT_TYPE = ABC
VALUE_YESTERDAY = 1299
HAS_DELAY = false
SEND_TIME_RT = 18:55:21.224+00:00
}

/type/ - DataEvents = {
VALUE = 123
EVENT_TYPE = ABC
VALUE_YESTERDAY = 345
HAS_DELAY = false
SEND_TIME_RT = 18:55:21.224+00:00
}

答案 5 :(得分:0)

如果您是gnu sed在“ d”中的数据

sed -Ez 's/\{[^{}]*EVENT_TYPE\s*=\s*BDE[^}]*\}//' d