1

Я написал код для определения количества IP-адресов из текстового файла. если в файле toto.txt есть похожие IP-платья:

Мой код для этого:

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;

Я ожидаю, что это вернет 4 счетчика, потому что в списке toto.txt 4 таких адреса.

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

Но вывод таков:

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

Как изменить мой код, чтобы получить 4 IP-адреса (что на самом деле 4)?

1 ответ1

0

Простой однострочник может помочь вам:

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

Запустите эту однострочную строку из командной строки.

Это напечатает количество вхождений 192.168.2.16 (поэтому два вхождения в одной строке будут учитываться дважды). Если вы хотите сосчитать только те строки, где адрес встречался хотя бы один раз, используйте вместо этого:

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

объяснение

  • -n означает применять данный код к каждой строке файла (технически, к каждой записи, как определено разделителем записей ($/ который по умолчанию является новой строкой).
  • -E означает обрабатывать предстоящую строку как часть кода Perl.
  • $count++ if /.../ означает увеличение переменной $count если текущая строка содержит искомый IP-адрес.
  • next LINE работает, потому что ключ -n автоматически упаковывает ваш код в цикл для каждой строки с меткой LINE .
  • END{...} запустить код между curly в самом конце (после обработки последней строки).

Обратите внимание, что вам может потребоваться усовершенствовать регулярное выражение в зависимости от вашего варианта использования. Например, вы можете привязать его, чтобы убедиться, что он не совпадает с какой-либо случайной строкой цифр и точек:

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

Я знаю, что ОП использует Windows. Для будущих читателей этого вопроса, использующих систему с grep , совместимым с POSIX, вы можете использовать:

grep -Fc '192.168.2.16' your_file_name_here

чтобы получить количество строк, которые содержат этот IP-адрес.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .