使用perl分割多行

时间:2017-06-29 10:58:53

标签: perl split

我正在尝试编写一个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
 ...

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

1 个答案:

答案 0 :(得分:0)

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

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