繁体   English   中英

提取文件并使用正则表达式匹配IP地址后,从全行提取IP地址

[英]Extract IP address from a full line after slurping file and using regex to match IP address

我已经编写了以下代码来读取文件,读取,识别IP地址并使用哈希结构跟踪每个地址的出现次数。 问题是,不是我的密钥是与正则表达式匹配的IP地址,而是密钥是显示IP地址的整行。 我该如何解决? (我认为这个问题与逐行进行制浆有关)

%ipcount;

@fileslurp = <FH>;
foreach(@fileslurp){
    if($_ =~ m/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/){
        $ipcount{$_}++;
    }
}

$numIP = scalar keys %ipcount;

print "Number of unique IP: $numIP \n"; 

foreach $ipaddress (sort { $ipcount{b} <=> $ipcount{a} } keys %ipcount){
    print "$ipaddress: $ipcount{$ipaddress} \n";
}

看起来您已经在进行小组比赛,只需将$ _更改为$ 1即可添加到哈希中。

%ipcount;

@fileslurp = <FH>;
foreach(@fileslurp){
    if($_ =~ m/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/){
        $ipcount{$1}++;
    }
}

$numIP = scalar keys %ipcount;

print "Number of unique IP: $numIP \n"; 

foreach $ipaddress (sort keys %ipcount){
    print "$ipaddress: $ipcount{$ipaddress} \n";
}

养成use strict;使用的习惯use strict; use warnings; 在每个perl脚本中。 它将帮助您发现问题。

注意$ipcount{$_} ,这里使用的是$_行,将其更改为$ipcount{$1} ,其中将捕获$1 IP地址。


还有一件事是您用于匹配IP地址的正则表达式不正确。 匹配IP地址是在正则表达式的复杂性和准确性之间进行权衡的另一个很好的例子。 \\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\b可以匹配任何IP地址,但也可以匹配999.999.999.999 ,就好像它是一个有效的IP地址一样。 这是一个问题,取决于您打算将正则表达式应用到的文件或数据。 要将IP地址中的所有4个数字限制为0..255 ,可以使用以下正则表达式。 它将IP地址的4个数字分别存储到捕获组中。 您可以使用这些组进一步处理IP号。 自由间距模式使它适合页面的宽度。

\\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\. (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\. (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\. (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b

如果您不需要访问单个数字,则可以使用量词将正则表达式缩短为:

\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3} (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b

同样,您可以将快速正则表达式缩短为\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b

另外, 正则表达式::常见::网的部分正则表达式::常见的可能,你的愿望正则表达式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM