在slurping文件并使用regex匹配IP地址后,从整行中提取IP地址
我编写了以下代码来读取一个文件,slurp,识别IP地址,并使用哈希结构跟踪每个地址的出现次数。问题是,我的密钥不是与regex匹配的IP地址,而是显示IP地址的整行。我该如何解决这个问题?(我认为这个问题与一行行一行的打滑有关)在slurping文件并使用regex匹配IP地址后,从整行中提取IP地址,regex,perl,slurp,Regex,Perl,Slurp,我编写了以下代码来读取一个文件,slurp,识别IP地址,并使用哈希结构跟踪每个地址的出现次数。问题是,我的密钥不是与regex匹配的IP地址,而是显示IP地址的整行。我该如何解决这个问题?(我认为这个问题与一行行一行的打滑有关) %ipcount; @fileslurp=; foreach(@fileslurp){ 如果(${1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/){ $ipcount{$}++; } } $numIP=标量键%ipcount; 打
%ipcount;
@fileslurp=;
foreach(@fileslurp){
如果(${1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/){
$ipcount{$}++;
}
}
$numIP=标量键%ipcount;
打印“唯一IP的数量:$numIP\n”;
foreach$ipaddress(排序{$ipcount{b}$ipcount{a}}键%ipcount){
打印“$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";
}
%ipcount;
@fileslurp=;
foreach(@fileslurp){
如果(${1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/){
$ipcount{$1}++;
}
}
$numIP=标量键%ipcount;
打印“唯一IP的数量:$numIP\n”;
foreach$ipaddress(排序键%ipcount){
打印“$ipaddress:$ipcount{$ipaddress}\n”;
}
养成在每个perl脚本中使用和的习惯。它会帮助你解决问题 注意
$ipcount{$}
,这里您使用的是您的行${/code>,将其更改为$ipcount{$1}
,其中$1
将被捕获到IP地址
还有一件事是,匹配IP地址的正则表达式不正确。匹配IP地址是正则表达式复杂性和精确性之间权衡的另一个很好的例子<代码>\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b
将匹配任何IP地址,但也将匹配999.999.999
,就好像它是有效的IP地址一样。这是否是一个问题取决于您打算应用正则表达式的文件或数据。要将IP地址中的所有4个数字限制为0..255
,可以使用以下正则表达式。它将4个IP地址中的每一个存储到一个捕获组中。您可以使用这些组进一步处理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
另外,该部分可能有您想要的正则表达式
%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";
}