【问题标题】:print lines between x and y from the log using Perl使用 Perl 从日志中打印 x 和 y 之间的行
【发布时间】:2013-09-10 23:51:51
【问题描述】:

我有日志文件,其中包含一些 xml 消息,例如...

<fixsim xyz='tststtsts'>
  <name test="test1">
    <time t=234>
    </time>
  </name>
</fixsim>


here some normal log text
whoiwoei
blsdbndsnb

<fixsim xyz='tssts'
  <name test="test2"
<time t=234>
    </time>
  </name>
</fixsim>

等等……

从上面的日志文件中,我想在某些条件下获取 xml 消息 (from &lt;Fixsim&gt; to &lt;/fixsim&gt;)。例如

我想要具有 test=test2 的 xml 消息。所以我应该得到输出

<fixsim xyz='tssts'
  <name test="test2"
<time t=234>
    </time>
  </name>
</fixsim>

【问题讨论】:

    标签: perl unix xml-parsing


    【解决方案1】:

    以下将获取 XML 文档:

    process($_) for $log =~ m{<fixsim.*?</fixsim>}sg;
    

    所以会

    my $xml;
    while (<$log_fh>) {
       if ( my $count = m{<fixsim} .. m{</fixsim>} ) {
          $xml .= $_;
    
          if ($count =~ /E0\z/) {
              process($xml);
              $xml = undef;
          }
       }
    
       process($xml) if defined($xml);
    }
    

    获得 XML 后,您可以使用自己喜欢的 XML 解析器提取所需的字段。

    【讨论】:

    • 你的意思是 $log 是文件句柄?因为需要处理日志文件。
    • 是否可以通过 sed -n 在一定条件下获取此消息?
    • 不,不是文件句柄。日志文件内容。
    • 日志文件太大,所以无法将整体放入变量中。而且这条消息不是单行的,而是多行的。
    • 所以在缓冲区中累积行。已更新。
    猜你喜欢
    • 2015-04-13
    • 2012-06-21
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多