Я просто хочу напечатать первый и последний IP-адрес из следующего текстового файла, который у меня есть

Traceroute: 10 1291134800 1291134792 1291134792 GoogleDNS 0.media.collegehumor.com 92.123.72.112
traceroute to 92.123.72.112 (92.123.72.112), 30 hops max, 60 byte packets
 1  * * *
 2  134.2.205.30  0.765 ms  1.125 ms  1.428 ms
 3  134.2.250.254  0.612 ms  0.701 ms  0.695 ms
 4  129.143.135.33  0.515 ms  0.516 ms  0.510 ms
 5  129.143.1.149  1.014 ms  1.012 ms  1.010 ms
 6  129.143.1.166  1.036 ms  0.821 ms  0.808 ms
 7  129.143.1.130  274.286 ms  274.265 ms *
 8  80.81.192.28  7.246 ms  6.913 ms  6.896 ms
 9  92.123.72.0  7.319 ms  7.311 ms  7.297 ms
Traceroute: 12 1291134800 1291134792 1291134792 LocalDNS 0.media.collegehumor.com      212.201.100.184
traceroute to 212.201.100.184 (212.201.100.184), 30 hops max, 60 byte packets
1  * * *
2  134.2.205.30  0.774 ms  1.121 ms  1.426 ms
3  134.2.250.254  0.635 ms  0.716 ms  0.709 ms
4  129.143.135.33  0.584 ms  0.583 ms  0.579 ms
5  129.143.1.149  0.951 ms  0.948 ms  0.942 ms
6  188.1.233.229  1.042 ms  0.969 ms  0.962 ms
7  188.1.145.77  4.665 ms  4.804 ms  4.826 ms
8  188.1.146.50  4.815 ms  4.890 ms  4.841 ms
9  188.1.145.73  7.071 ms  7.202 ms  7.241 ms
10  188.1.145.69  9.976 ms  10.001 ms  9.441 ms
11  212.201.100.184  9.289 ms  9.259 ms  9.276 ms

Например, если у меня есть указанный выше файл, он должен распечатать те, в которых первый и последний не совпадают. Итак, из приведенного выше я ожидал бы чего-то вроде: Пункт назначения на 92.123.72.112, но достиг 92.123.72.0 И для второго traceroute он не должен ничего печатать, поскольку пункт назначения 212.201.100.184 фактически достиг 212.201.100.184. Пока что я написал следующий код ..

  #!/usr/bin/perl -w
    use Regexp::Common qw/net/; 
 open my $in, '<', "Sample_01.txt" or die $!;
 open FILE, ">", "filename.txt" or die $!;
 while (my $line = <$in>){

         if($line =~ /^Traceroute: .* (\S+)/) {
               $traceroute = $1;
        print FILE "Destination to |$traceroute|";
        my ($ip) = $line =~ /(?: \d+ \s \s+) ($RE{net}{IPv4}) /msx+;
                if($traceroute eq $ip){

        print FILE "$ip|";
        print FILE "\n";
        }
        }
        else {

        }
0
mkumars 14 Авг 2012 в 03:33

1 ответ

Лучший ответ

Создайте хэш массивов, где ключи к хешу - это исходные IP-адреса, а массив - это IP-адреса каждого перехода. Затем, когда вы закончите, просто сравните ключ с последним значением в хэше.

#!/usr/bin/perl

use strict;
use warnings;

open my $in, '<', 'Sample_01.txt' or die $!;
open FILE, '>', 'filename.txt' or die $!;

my %ipToRoute;
my $srcIp;
while (my $line = <$in>) {
    next if ($line =~ /^Traceroute/);

    if (my ($ip) = $line =~ m/traceroute to ([^ ]+)/) {
        $srcIp = $ip;
    }
    else {
        $line =~ s/^ +//;
        my $dstIp = (split / +/, $line)[1];
        push @{$ipToRoute{$srcIp}}, $dstIp if $dstIp ne '*';
    }
}

foreach my $srcIp (keys %ipToRoute) {
    my $finalDst = @{$ipToRoute{$srcIp}}[-1];
    if ($srcIp ne $finalDst) {
        print FILE "Destination to $srcIp but reached $finalDst\n";
    }
}
0
Chris 14 Авг 2012 в 03:59
Он отлично работает для образца, который у меня есть выше, но он дает некоторые ошибки, если traceroute похож на Traceroute: 24 1291144000 1291143994 1291143994 OpenDNS www.openpaths.com 208.78.244.38 traceroute на 208.78.244.38 (208.78.244.38), максимум 30 переходов , 60 байтовых пакетов 1 * * * 2 134.2.205.30 0.819 мс 1.156 мс 1.693 мс 3 134.2.250.254 0,621 мс 0,624 мс 0,678 мс 4 129.143.135.33 0,583 мс 0,575 мс 0,564 мс 5 208.78.244.38 0,583 мс 0,575 мс 0,564 мс
 – 
mkumars
14 Авг 2012 в 04:16
Хорошо, понял - немного изменил код - и большое спасибо :) @chris
 – 
mkumars
14 Авг 2012 в 04:32