1

ホストへのトレースルートを実行し、それらをファイルに保存するシェルスクリプトをいくつか作成しました。.logこれは完全に機能し、意図したとおりにすべてのデータをファイルに出力します。

.log次に、これを.csvファイルに変換する簡単なPerlスクリプトを作成して、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

表示するデータの場合、空白の後に行を分割せずに行を分割し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 に答える
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 に答える