Como obter a contagem de uma string de um arquivo de texto. A saída está errada

1

Eu escrevi um código para encontrar a contagem de endereços IP de um arquivo de texto. se existir um endereço IP semelhante no arquivo toto.txt:

Meu código para fazer isso é:

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;

Espero que isso retorne 4 count porque existem 4 existências desse endereço na lista 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

Mas a saída é esta:

address is 192.168.2.16
8
1
1
1
1
1
1
1
1

Como alterar meu código para obter a contagem de 4 IP (que na verdade é 4)?

    
por user3085082 15.01.2015 / 15:08

1 resposta

0

Um simples one-liner pode ajudá-lo:

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

Execute este one-liner no prompt de comando.

Isso imprimirá o número de ocorrências de 192.168.2.16 (portanto, duas ocorrências na mesma linha serão contadas duas vezes). Se você quiser apenas contar as linhas em que o endereço ocorreu pelo menos uma vez, use isso:

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

Explicação

  • -n significa aplicar o código fornecido a cada linha do arquivo (tecnicamente, para cada registro conforme definido pelo separador de registro ( $/ , que é uma nova linha por padrão).
  • -E significa tratar a próxima string como uma parte do código Perl.
  • $count++ if /.../ significa incrementar a variável $count se a linha atual contiver o endereço IP que você está procurando.
  • next LINE funciona porque a opção -n agrupa automaticamente seu código em um loop por linha com o rótulo LINE .
  • END{...} executa o código entre os curlies no final (após a última linha ter sido processada).

Observe que você pode precisar refinar o regex, dependendo do seu caso de uso. Você pode, por exemplo, ancorá-lo para garantir que ele não corresponda a uma sequência aleatória de dígitos e pontos:

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

Eu sei que o OP está usando o Windows. Para futuros leitores desta questão usando um sistema com um grep compatível com POSIX, você pode usar:

grep -Fc '192.168.2.16' your_file_name_here

para obter uma contagem das linhas que contêm esse endereço IP.

    
por 20.01.2015 / 04:28