Jak uzyskać liczbę ciągów z pliku tekstowego. Dane wyjściowe są nieprawidłowe

1

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)?

użytkownik3085082
źródło
1
Co dokładnie chcesz policzyć / wydrukować? Do debugowania: wydrukuj nie tylko liczby, ale także klucze, a zobaczysz, co policzyłeś. Wskazówka: 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.
Werner Henze
@WernerHenze Jestem nowy w Perlu .. Kiedy próbuję wydrukować klucze (wypisz „$ klucze”;); daje błąd (symbol globalny „$ klucze” wymaga jawnej nazwy pakietu w C: \ s ...) i jeśli tak było ac ac, mogłem zrobić coś takiego: przerwij wiersz słów (poszczególne ciągi przed każdym słowem oddzielone spacją), a następnie porównaj z adresem $, jeśli jest taki sam. Jak to zrobić w Perlu?
user3085082 15.01.2015
Oczywiście kluczem jest $ str, więc wydrukowanie $ str byłoby opcją.
Werner Henze

Odpowiedzi:

0

Prosta liniówka może pomóc:

perl -nE '$count++ if /192.168.2.16/;END{say $count}' your_file_name_here

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:

perl -nE 'if(/192\.168\.2\.16/){$count++;next LINE};END{say $count}' your_file_name_here

Wyjaśnienie

  • -noznacza 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 $countzmiennej, jeśli bieżący wiersz zawiera szukany adres IP.
  • next LINEdziała, ponieważ -nprzełącznik automatycznie otacza kod etykietą w pętli dla linii LINE.
  • 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:

/[^0-9.]192\.168\.2\.16[^0-9.]/

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ć:

grep -Fc '192.168.2.16' your_file_name_here

aby uzyskać liczbę wierszy zawierających ten adres IP.

Joseph R.
źródło
dziękuję za późno, ale już to zrobiłem.
user3085082,