在slurping文件并使用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; 打

我编写了以下代码来读取一个文件,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;
打印“唯一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";
}