我正在尝试编写一个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
...
有人可以提供一些如何解决这个问题的提示吗?
答案 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