【问题标题】:How to count first and the last IP adderess from the following text that i have如何从我拥有的以下文本中计算第一个和最后一个 IP 地址
【发布时间】:2012-08-14 07:59:40
【问题描述】:

我只想从我拥有的以下文本文件中打印第一个和最后一个 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 而对于第二个跟踪路由它不应该打印任何东西,因为目的地 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 {

        }

【问题讨论】:

    标签: perl lines counting


    【解决方案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";
        }
    }
    

    【讨论】:

    • 它对于我上面的示例工作正常,但如果 traceroute 类似于 Traceroute: 24 1291144000 1291143994 1291143994 OpenDNS www.openpaths.com 208.78.244.38 traceroute to 208.78.244.38 ( 208.78.244.38), 30 hops max, 60 byte packets 1 * * * 2 134.2.205.30 0.819 ms 1.156 ms 1.693 ms 3 134.2.250.254 0.621 ms 0.624 ms 0.678 ms 4 129.143.135.33 0.583 ms 0.575 ms 0.564 ms 5 208.78.244.38 0.583 毫秒 0.575 毫秒 0.564 毫秒
    • 好的 - 稍微修改了代码 - 非常感谢 :) @chris
    猜你喜欢
    • 1970-01-01
    • 2012-08-30
    • 2016-01-01
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 2017-03-15
    • 2013-06-19
    • 2013-09-15
    相关资源
    最近更新 更多