需要解析一些带空格(" "
)的日志作为分隔符,并观察双引号或单引号。
例如
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
日志
尝试使用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建议重写此问题。
答案 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";