【问题标题】:sed multiline remove before patternsed 多行删除模式之前
【发布时间】:2016-09-07 14:50:54
【问题描述】:

您好,我有一个很大的日志文件,我正在尝试将 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>

提前致谢

【问题讨论】:

  • 尝试grep -oPz '(?s)&lt;LOG&gt;.*?&lt;/LOG&gt;' logFile | tr '\0' '\n'检索所有&lt;LOG&gt;...&lt;/LOG&gt;
  • sed '/^&lt;/!d' 怎么样?
  • 我想我的 grep 已经过时了?? grep: -P 和 -z 选项不能组合
  • 检查你的手册页,可能是-Z 而不是-z

标签: unix awk sed multiline


【解决方案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>

【讨论】:

    【解决方案2】:

    试试这个:

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

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

    【讨论】:

    • 您好,非常感谢,这似乎有效,但请您解释一下.. 我不想只是复制和粘贴.. 另外,我如何过滤我的 XXXX 唯一请求。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-10-13
      • 2016-10-07
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 2020-01-24
      • 1970-01-01
      • 2020-11-04
      • 1970-01-01
      相关资源
      最近更新 更多