您好,我正在努力使用perl脚本,使用split命令将8列CSV行解析为另一个CSV行。但我想排除方括号[]所包含的所有文本。该行看起来像:
128.39.120.51,0,49788,6,SYN,[8192:127:1:52:M1460,N,W2,N,N,S:.:Windows:XP/2000 (RFC1323+, w+, tstamp-):link:ethernet/modem],1,1399385680
我使用了以下脚本,但是当我打印$ fields [7]时,它给了我上面[]里面的一个字段。但是通过打印“$ fields [7]”我希望它是 1399385680 ,这是上一行中的最后一个字段。我试过的剧本是。
while (my $line = <LOG>) {
chomp $line;
my @fields=grep { !/^[\[.*\]]$/ } split ",", $line;
my $timestamp=$fields[7];
print "$fields[7]";
}
感谢您的时间。我将非常感谢你的帮助。
答案 0 :(得分:1)
始终在每个perl脚本的顶部包含use strict;
和use warnings;
。
你的&#34; csv&#34;文件不是正确的csv。因此,我唯一可以建议的是在拆分之前删除括号中的内容:
use strict;
use warnings;
while (<DATA>) {
chomp;
s/\[.*?\]//g;
my @fields = split ',', $_;
my $timestamp = $fields[7];
print "$timestamp\n";
}
__DATA__
128.39.120.51,0,49788,6,SYN,[8192:127:1:52:M1460,N,W2,N,N,S:.:Windows:XP/2000 (RFC1323+, w+, tstamp-):link:ethernet/modem],1,1399385680
输出:
1399385680
显然,也可以捕捉括号内的字段的内容,但你并不是说这是一个要求或目标。
<强>更新强>
如果要捕获括号分隔字段,一种方法是使用正则表达式进行捕获。
注意,此当前正则表达式要求每个字段都有一个值。
chomp;
my @fields = $_ =~ /(\[.*?\]|[^,]+)(?:,|$)/g;
my $timestamp = $fields[7];
print "$timestamp";
答案 1 :(得分:0)
好吧,如果你想实际上忽略方括号之间的文字,你也可以摆脱它:
while ( my $line = <LOG> ) {
chomp $line;
$line =~ s,\[.*?\],,; # Delete all text between square brackets
my @fields = split ",", $line;
my $timestamp = $fields[7];
print $fields[7], "\n";
}