如何从文本文件中获取字符串的计数。输出是错误的

如何从文本文件中获取字符串的计数。输出是错误的

我编写了一个代码,用于从文本文件中查找 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

简单的一行代码就能帮你:

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之所以有效,是因为-nswitch 自动用标签将您的代码包装在每行循环中LINE
  • END{...}在最后的花括号之间运行代码(处理完最后一行之后)。

请注意,您可能需要根据用例优化正则表达式。例如,您可以将其固定以确保它不匹配某些随机数字和句点字符串:

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

我知道 OP 使用的是 Windows。对于使用符合 POSIX 标准的系统阅读此问题的未来读者grep,您可以使用:

grep -Fc '192.168.2.16' your_file_name_here

获取包含该 IP 地址的行数。

相关内容