Napisałem kod do znalezienia liczby adresów IP z pliku tekstowego. jeśli podobna sukienka IP istnieje w pliku toto.txt:
Mój kod to zrobić to:
use strict;
use warnings;
my %count;
my $str ;
#my $file = shift or die "Usage: $0 FILE\n";
my $address = "192.168.2.16";
open my $fh, '<', 'C:\shekhar_Axestrack_Intern\WindowCreation\toto.txt', or die "Could not open file $!";
print "address is $address \n";
while (my $line = <$fh>)
{
chomp $line;
foreach my $str ($address, $line)
{
$count{$str}++;
}
}
foreach $str (sort keys %count)
{
printf "%s\n", $count{$str};
}
close $fh;
Oczekuję, że zwróci 4 liczniki, ponieważ istnieją 4 adresy tego adresu na liście toto.txt
Address is : 100.64.26.172 and the Time is : Thu Jan 15 18:11:31 2015 End
Address is : 192.168.2.16 and the Time is : Thu Jan 15 18:12:33 2015 End
Address is : 100.65.15.169 and the Time is : Thu Jan 15 18:13:51 2015 End
Address is : 192.168.2.16 and the Time is : Thu Jan 15 18:15:17 2015 End
Address is : 100.65.34.233 and the Time is : Thu Jan 15 18:18:04 2015 End
Address is : 192.168.2.16 and the Time is : Thu Jan 15 18:19:46 2015 End
Address is : 100.64.8.194 and the Time is : Thu Jan 15 18:31:58 2015 End
Address is : 192.168.2.16 and the Time is : Thu Jan 15 18:33:30 2015 End
Ale wynik jest następujący:
address is 192.168.2.16
8
1
1
1
1
1
1
1
1
Jak zmienić kod, aby uzyskać 4 liczbę adresów IP (czyli tak naprawdę 4)?
windows
command-line
perl
użytkownik3085082
źródło
źródło
foreach my $str ($address, $line)
iteruje listę($address, $line)
, w żadnym miejscu nie wyszukujesz adresu $ w wierszu. W tym celu należy użyć wyrażeń regularnych.Odpowiedzi:
Prosta liniówka może pomóc:
Uruchom ten jednowierszowy wiersz poleceń.
Spowoduje to wydrukowanie liczby wystąpień
192.168.2.16
(więc dwa wystąpienia w tej samej linii zostaną policzone dwukrotnie). Jeśli chcesz policzyć linie, w których adres pojawił się co najmniej raz, użyj tego:Wyjaśnienie
-n
oznacza zastosowanie danego kodu do każdego wiersza pliku (technicznie do każdego rekordu zdefiniowanego przez separator rekordów ($/
który jest domyślnie nowym wierszem).-E
oznacza traktuj nadchodzący ciąg jako fragment kodu Perla.$count++ if /.../
oznacza zwiększenie$count
zmiennej, jeśli bieżący wiersz zawiera szukany adres IP.next LINE
działa, ponieważ-n
przełącznik automatycznie otacza kod etykietą w pętli dla liniiLINE
.END{...}
uruchom kod między lokami na samym końcu (po przetworzeniu ostatniego wiersza).Pamiętaj, że może być konieczne udoskonalenie wyrażenia regularnego w zależności od przypadku użycia. Możesz na przykład zakotwiczyć go, aby nie pasował do jakiegoś losowego ciągu cyfr i kropek:
Wiem, że OP używa Windows. Dla przyszłych czytelników tego pytania, korzystających z systemu zgodnego z POSIX
grep
, możesz użyć:aby uzyskać liczbę wierszy zawierających ten adres IP.
źródło