2013-03-06 66 views
1

我已经编写了一些shell脚本运行跟踪路由到主机,然后将它们保存到文件。这完美地工作,并按预期输出所有数据到一个.log文件。Traceroute登录到CSV Perl解析器正则表达式问题

然后我写了一个简单的Perl脚本,将.log转换为.csv文件,以便我可以将它导入到excel中。但是,在查看生成的.csv文件时,我写的Perl脚本在处理IP地址与时间的数据包时遇到了问题。

例如这条线从.log文件是完全解析:

1 139.222.0.1 0.941 ms 1.446 ms 1.996 ms

.csv文件:

1,139.222.0.1,0.941 ms,1.446 ms,1.996 ms

但是,如果跟踪路由返回类似这样的东西它存储在.log文件中:

12 154.54.57.98 7.579 ms 154.54.74.42 7.009 ms 130.117.0.58 7.480 ms

然后,它解析为.csv文件不正确,并破坏了整个以下.csv文件(这是一个由为例):

11,213.248.77.134,7.432 ms,9.038 ms,213.248.70.238 ms

正如你可以看到与给定的IP跳时间现在用作数据包花费的时间。

我很困惑如何解决这个问题!任何帮助,将不胜感激,这里是一个代码片段,轮流在日志中CSV每个跃:

my $start = "'Hop','IP','T1','T2','T3'"; 
    print OUTPUT "\n$_$start\n"; 
}; 

    print OUTPUT "$1,$2,$3 ms,$4 ms,$5 ms\n" if (/(\d+)\s+(\S+)\s+(\S+)\s+ms\s+(\S+)\s+ms\s+(\S+)/); 

编辑

写我自己的修复程序可以适当地增加了额外的CSV列,其中插入

my $start = "'Hop','IP','T1','T1IP','T2','T2IP',T3'"; 
    print OUTPUT "\n$_$start\n"; 
}; 

if (/(\d+)\s+(\S+)\s+(\S+)\s+ms\s+(\S+)\s+ms\s+(\S+)\s+ms/){ 
print OUTPUT "$1,$2,$3 ms, ,$4 ms, ,$5 ms\n"; 

}elsif (/(\d+)\s+(\S+)\s+(\S+)\s+ms\s+(\S+)\s+(\S+)\s+ms\s+(\S+)\s+ms/){ 
print OUTPUT "$1,$2,$3 ms,$4,$5 ms, ,$6 ms\n"; 

}elsif (/(\d+)\s+(\S+)\s+(\S+)\s+ms\s+(\S+)\s+ms\s+(\S+)\s+(\S+)\s+ms/){ 
print OUTPUT "$1,$2,$3 ms, ,$4 ms,$5,$6 ms\n"; 

}elsif (/(\d+)\s+(\S+)\s+(\S+)\s+ms\s+(\S+)\s+(\S+)\s+ms\s+(\S+)\s+(\S+)\s+ms/){ 
print OUTPUT "$1,$2,$3 ms,$4,$5 ms,$6,$7 ms\n"; 
}; 

感谢您的帮助和回应!

+0

请出示不工作 – Borodin 2013-03-06 01:42:14

+0

原位缺口工作代码的代码如果(/(\ d +)\ s +(\ S +)\ s +(\ S +)\ s + ms \ s +(\ S +),则输出“$ 1,$ 2,$ 3 ms,$ 4 ms,$ 5 ms \ n” \ S + MS \ S +(\ S +)/); ,因为只有traceroute只返回时间值而不是时间和IP值 – 2013-03-06 01:46:35

回答

0

对于您所显示的数据,我只是将空行分割开来,然后是ms

my $csv = join ',', split /\s+(?!ms)/, $line; 

但是,您显示的代码意味着跟踪路由信息与日期混合在一起,因此这可能不合适。

更新

在看到你的数据,我想这应该做你想要什么。

请注意,您打印的标题名称与您在该行上具有多个IP地址的数据不对应。我不确定你想在这种情况下做什么。

#!/usr/bin/perl 

use strict; 
use warnings; 
use autodie; 

my $logfile = 'trace.log'; 
my $parsedfile = 'trace.csv'; 

open my $infh, '<', $logfile; 
open my $outfh, '>', $parsedfile; 

while (<$infh>) { 
    if (/^[a-z]{3}\s+[a-z]{3}/i) { 
     print $outfh $_; 
     print $outfh qq{"Hop","IP","T1","T2","T3"\n}; 
    } 
    elsif (/^\s*\d/) { 
     chomp; 
     s/^\s+//; 
     print $outfh join(',', split /\s+(?!ms)/), "\n"; 
    } 
} 

输出

Wed Mar 6 01:58:49 GMT 2013 
"Hop","IP","T1","T2","T3" 
1,139.222.0.1,0.987 ms,1.412 ms,1.971 ms 
2,10.0.0.1,0.445 ms,0.500 ms,0.552 ms 
3,172.16.0.34,1.667 ms,0.875 ms,1.503 ms 
4,193.62.92.71,1.939 ms,2.547 ms,2.529 ms 
5,146.97.130.249,2.561 ms,2.447 ms,4.615 ms 
6,146.97.65.85,5.309 ms,6.709 ms,5.376 ms 
7,146.97.65.65,7.133 ms,7.340 ms,7.323 ms 
8,146.97.65.37,9.362 ms,9.750 ms,9.804 ms 
9,146.97.35.125,9.473 ms,9.485 ms,8.815 ms 
10,213.248.84.177,8.798 ms,9.171 ms,8.505 ms 
11,213.248.77.134,8.333 ms,7.837 ms,213.248.70.238,7.721 ms 
12,154.54.74.42,7.879 ms,154.54.72.186,7.450 ms,154.54.57.94,7.862 ms 
13,66.28.4.189,81.812 ms,81.433 ms,154.54.30.129,80.648 ms 
14,154.54.30.17,217.548 ms,154.54.43.10,217.531 ms,66.28.4.222,109.029 ms 
15,154.54.27.53,216.490 ms,154.54.42.241,195.393 ms,154.54.27.53,216.389 ms 
16,154.54.42.241,195.141 ms,193.123 ms,192.900 ms 
17,154.54.28.85,99.232 ms,154.54.5.229,99.127 ms,98.931 ms 
18,154.54.31.21,102.739 ms,154.54.5.229,99.086 ms,98.803 ms 
19,154.54.31.21,102.719 ms,38.122.60.46,101.206 ms,101.052 ms 
20,216.234.104.254,102.619 ms,38.122.60.46,101.415 ms,101.275 ms 
21,75.98.163.130,100.512 ms,100.409 ms,100.485 ms 
+0

日期事件只是作为标题,并且只在log/csv文件的开始处打印一次,因为此跟踪路径重复运行且我需要它作为参考,一旦traceroute启动,就没有其他日期打印了:)感谢您的回复生病了看看该方法谢谢 – 2013-03-06 01:51:42

+0

了解了您的问题后,我认为我的解决方案可能并不合适。完整输入的示例将会有所帮助。 – Borodin 2013-03-06 01:53:56

+0

谢谢Ben。我已经更新了我的答案,以提供我认为是一个工作程序 – Borodin 2013-03-06 02:20:35

0

你想要什么猜测,无头代码:

my $re_ip = qr/\d+\.\d+\.\d+\.\d+/; 
while(<INPUT>) { 
    my @v = split(/($re_ip)/); 
    my $hop = (shift(@v) =~ /(\d+)/)[0]; # the hop number? 
    for my $v (@v) { 
    if ($v =~ /$re_ip/) { 
     print OUTPUT "$hop,$v,"; 
    } else { 
     my @ms = $v =~ /(\S+\s+ms)/g; 
     print OUTPUT join(",", @ms), "\n"; 
    } 
    } 
} 
+0

感谢您的回复,我会看看这也:) – 2013-03-06 02:01:36