【问题标题】:Using perl to split over multiple lines使用 perl 拆分多行
【发布时间】:2017-06-29 10:58:52
【问题描述】:

我正在尝试编写一个 perl 脚本来处理 log4net 日志文件。日志文件中的字段用分号分隔。我的最终目标是捕获每个字段并填充一个 mysql 表。

通常我的行看起来有点像这样(都在一行上)

DEBUG;2017-06-13T03:56:38,316-05:00;2017-06-13 08:56:38,316;79ab0b95-7f58-
44a8-a2c6-1f8feba1d72d;(null);WorkerStartup 1;"Starting services."

这些很容易处理。我可以简单地用分号分割得到我需要的信息。

但是,有时末尾的“消息”字段可能会跨越几行,尤其是在存在堆栈跟踪的情况下。我想将整个消息捕获为单个列。我不能使用分号分割,因为下一行通常看起来像:

 at some.random.classname
 at another.classname
 ...

有人可以提供一些提示如何解决这个问题吗?

【问题讨论】:

  • 寻找分隔符,并设置$/
  • 您能详细说明一下吗?不明白你的意思?
  • 您知道如何识别日志条目的开始。使用该信息来累积后续行,直到您点击另一个日志条目。
  • 您可以阅读有关魔术变量$/(输入记录分隔符)here的所有信息。

标签: perl split


【解决方案1】:

下面的解决方案使用一个字段中“的个数是偶数($p=~y/"//%2),这个条件数"奇数可以被其他可以表明该字段不完整的条件数改变。 拆分的列数固定为7(允许在最后一个字段中使用;)并且可以更改,例如@array = map {s/;$//} $p=~/\G(?:"[^"]*"|[^;])*;/g;。 该文件是逐行读取的,但是当它完成时会处理一行sub process $p 变量来存储上一行,最后一行在 END 块中处理。

perl -ne '
    sub process {
        @array = split /;/,$p,7;
        # do something with array
        print ((join "\n---\n", @array),"\n");
    }
    if ($p=~y/"//%2) {
        $p.=$_;
        next;
    }
    process;
    $p=$_;
    END{process}
' < logfile.txt

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-23
    • 1970-01-01
    • 2011-08-01
    • 2019-07-28
    • 2015-03-06
    • 2013-03-12
    • 2014-01-11
    • 2014-02-08
    相关资源
    最近更新 更多