sed multiline在模式之前删除

时间:2016-09-07 14:50:55

标签: unix awk sed multiline

您好我有一个大日志文件,我正在尝试将xml数据传递给它。

我有一个重要的大日志文件:

2016/01/01   bladh bqskjdqskldjqsdlqskdjqlskdj dazihzmkldjkdjqslkjd
2016/01/01:  qsdhqsdlkqsmdjqsldjqslkdjqlskdjqslkdjqslkdjqskdjqsd
2016/01/01: qsjdqmlskdmlqskdmcxxxx [qskjd][qsdjqslkdj] Payload    :[<LOG><a>a</a>
<b>b</b>
<c>c</c>
<id>XXXXX</id>
<d>d</d>
</LOG>]]

2016/01/01   bladh bqskjdqskldjqsdlqskdjqlskdj dazihzmkldjkdjqslkjd
2016/01/01:  qsdhqsdlkqsmdjqsldjqslkdjqlskdjqslkdjqslkdjqskdjqsd
2016/01/01: qsjdqmlskdmlqskdmcxxxx [qskjd][qsdjqslkdj] Payload :[<LOG>    <a>a</a>
<b>b</b>
<c>c</c>
<id>YYYYY</id>
<d>d</d>
</LOG>]]
qskdmqlskdqlsdqlskdqlsdk
qsdlkqsdlkqsdmlkqsdlk

目前我正在使用

  sed -n '/<START/{:start /\/END/!{N;b start};/XXXXX/p}' logFile

我正在接受这个

    2016/01/01: qsjdqmlskdmlqskdmcxxxx [qskjd][qsdjqslkdj] Payload    :[<LOG><a>a</a>
<b>b</b>
<c>c</c>
<id>XXXXX</id>
<d>d</d>
</LOG>]]

我想检索整个XML并获取:

<LOG>    
   <a>a</a>
   <b>b</b>
   <c>c</c>
   <id>XXXX</id>
   <d>d</d>
</LOG>

提前致谢

3 个答案:

答案 0 :(得分:1)

TXR中的解决方案:

@(repeat)
@  (skip)Payload :[<@tag>@preamble
@  (collect)
@middle
@  (last)
</@tag>]]
@  (end)
@  (output)
<@tag>
  @(trim-str preamble)
@    (repeat)
  @middle
@    (end)
</@tag>
@  (end)
@(end)

执行命令

$ txr extract.txr data
<LOG>
  <a>a</a>
  <b>b</b>
  <c>c</c>
  <id>XXXXX</id>
  <d>d</d>
</LOG>
<LOG>
  <a>a</a>
  <b>b</b>
  <c>c</c>
  <id>YYYYY</id>
  <d>d</d>
</LOG>

答案 1 :(得分:0)

试试这个:

sed -n '/<LOG/{:a;/<\/LOG/!{N;ba};s/.*\(<LOG>\)\(.*XXXXX.*<\/LOG>\).*/\1\n\2/p}' logFile

它应该完成这项工作,但请记住,sed不是解析xml的正确工具。如果您必须解析有效的xml文件,则应考虑使用xmlstarletxmllint

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed -nr '/<LOG>/,/<\/LOG>/{s/.*(<LOG>)\s*/\1\n/;s/(<\/LOG>).*/\1/;p}' file

除非明确要求,否则使用seds grep-like选项禁止打印,并使用范围功能/.../,/.../,顶部和尾部生成的字符串。