2013-03-06 68 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