iT邦幫忙

0

Perl 的IP比對

我有一個IIS Log 大概長得像這樣:

2015-06-05 05:41:36 W3SVC1 172.16.18.11 GET /Menu/index.htm - 80 - 172.16.13.74 Mozill/4.0 .....

我用

while(<FILE>){
  if($_ =~ /(\d+\.\d+\.\d+\.\d+)/g){
...} 
    $data .= $& . "\n";
    $ip{$&}++;
    $cnt++;  }

但都只能比對到第一個IP "172.16.18.11" ,但我希望比對到的是"172.16.13.74" 後面這個,
請問要怎樣改比較好呢 ?

Perl新手感謝不盡

1 個回答

0
weiclin
iT邦高手 4 級 ‧ 2015-06-12 17:52:41
最佳解答

我是覺得不需要用到 regexp 啦..用空白去切欄位就行了
或是把你的程式改成類似這樣

<pre class="c" name="code">
if(/\d+\.\d+\.\d+\.\d+.*?(\d+\.\d+\.\d+\.\d+)/) {
    print $1; // 第二個 ip
}
lalelee iT邦新手 4 級 ‧ 2015-06-15 11:06:57 檢舉

感謝你的熱心回答^^
我自己也找到另一個版本, 來分享一下給後面的人

<pre class="c" name="code">use Regexp::Common qw/net/;
my $IPv4 = $RE{net}{IPv4};
while(<FILE>){
  if(my @matched = $_ =~ /\b($IPv4)\b/g){   # $matched[1] 就是每一行的第二組IP
   	my $ok = $matched[1];

我要發表回答

立即登入回答