Я просто хочу напечатать первый и последний 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 {
}
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";
}
}
Похожие вопросы
Новые вопросы
perl
Perl - это процедурный высокоуровневый динамический язык программирования общего назначения, известный своей собственной поддержкой регулярных выражений и возможностей синтаксического анализа строк. Пожалуйста, используйте этот тег для вопросов о Perl в целом. Для вещей, связанных с новым (но связанным) языком Raku (ранее «Perl 6»), используйте тег raku. Для регулярных выражений в стиле Perl на других языках используйте тег regex или, если они основаны на библиотеке PCRE, тег pcre.