簡體   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