1

我编写了一些 shell 脚本,它们运行到主机的跟踪路由,然后将它们保存到一个文件中。这完美地工作.log并按预期将所有数据输出到文件。

然后我继续编写了一个简单的 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

但是,traceroute 是否应该返回与文件中存储的内容类似的任何内容.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";
};

感谢您的所有帮助/回复!

4

2 回答 2

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";
    }   
  }
}
于 2013-03-06T01:50:08.083 回答
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
于 2013-03-06T01:46:41.357 回答