快速解析日志

时间:2014-09-08 19:51:33

标签: perl

需要解析一些带空格(" ")的日志作为分隔符,并观察双引号或单引号。

例如

id=firewall time="2010-05-09 16:07:21 UTC" 1.1.1.1 ...

应解析为

id=firewall
time="2010-05-09 16:07:21 UTC"
1.1.1.1

日志

  • 很长很
  • 不一定是key = value format
  • 不一定是csv格式:

尝试使用Text :: CSV_XS,因为它比纯粹的基于perl的解析器快得多。但是,以下代码没有达到我的预期,因为日志不是有效的csv字符串。

use Text::CSV_XS;

$a = 'id=firewall time="2010-05-09 16:07:21 UTC"';

$userDefinedSeparator = Text::CSV_XS->new({sep_char => " "});
print "$userDefinedSeparator\n";
$userDefinedSeparator->parse($a);
my $e;
foreach $e ($userDefinedSeparator->fields) {
    print $e, "\n";
}

是否有可以解析上述日志的快速解析器?很高兴配置Text :: CSV_XS来进行所需的解析。

感谢@ThisSuitIsBlackNot建议重写此问题。

2 个答案:

答案 0 :(得分:1)

我在my response to your comment中就previous question的解决方案回答了这个问题。

以下是我之前给出的答案,以及您在此问题中显示的新数据。

我之前提出的问题是,您只显示了key=value对,所以我认为这就是您在数据中的全部内容。

我希望这适合你。

use strict;
use warnings;

my $string = 'id=firewall time="2010-05-09 16:07:21 UTC" 1.1.1.1 ...';

my @fields = $string =~ / (?: "[^"]*" | \S )+ /xg;

print "$_\n" for @fields;

<强>输出

id=firewall
time="2010-05-09 16:07:21 UTC"
1.1.1.1
...

答案 1 :(得分:0)

在我提交此答案之后,我确定你会告诉我更多有关日志格式的信息,但这里有。

只有您知道日志的样子。如果他们的格式是常规的,那么你将更容易解析它们。

但是考虑到你提供的内容,你可以将空格分成一个数组,然后重新组合时间戳:

 my $a = q(id=firewall time="2010-05-09 16:07:21 UTC" 1.1.1.1);
 my @f = split(/ /, $a);
 my $id = $f[0];
 my $time = join(' ', @f[1..3]));

 print "$id\n$time\n$f[4]\n";