當記者問到匹配的IP地址,許多人會寫
/\d+\.\d+\.\d+\.\d+/
,但是這會給誤報。在Jeffrey Friedl的Mastering Regular Expressions中,作者給出了一個更加小心的IP地址匹配模式。下面的代碼借用了Friedl強制的不是任意的數字運行,而是從0到255的範圍,要求地址開始和結束在字邊界(\b
),並且不允許地址0.0.0.0。
沒有參數時,下面的代碼默認爲當前目錄作爲搜索開始。要搜索所有文件,請提供根目錄作爲參數。打開find
輸出的每條路徑,然後我們搜索每條線路的IP地址並打印所有匹配以及它們各自的路徑。
請注意代碼如何使用local
在記錄分隔符$/
的NUL字符和換行符之間來回切換。這是必要的,因爲find
的-print0
操作將文件名與分開,但'\n'
是行終止符。用-T
,我們只搜索文本文件。
#! /usr/bin/perl
use warnings;
no warnings 'exec';
use strict;
my $octet = qr/[01]?\d\d?|2[0-4]\d|25[0-5]/;
my $ip = qr/ \b
(?!0+\.0+\.0+\.0+\b)
$octet(?:\.$octet){3}
\b
/x;
@ARGV = (".") unless @ARGV;
open my $find, "-|", "find", @ARGV, "-type", "f", "-print0"
or die "$0: failed to start find: $!\n";
$/ = "\0";
while (defined(my $path = <$find>)) {
chomp $path;
next unless -T $path;
if (open my $fh, "<", $path) {
local $/ = "\n";
while (<$fh>) {
print "$path: $_" if /$ip/;
}
close $fh;
}
else {
warn "$0: open $path: $!\n";
}
}
同樣,這是超級用戶的問題。 – Johnsyweb 2010-09-07 09:35:48
@Johnsyweb [常問問題](http://stackoverflow.com/faq)表示SU適用於「一般計算機軟件或硬件故障排除」。這是一個編程問題,而不是故障排除問題。 – 2010-09-07 12:57:24
我坐正確。雖然沒有說明問題的原因,但似乎是關於解決網絡或安全問題。既然你用perl程序解決了這個問題,那麼顯然它就是家庭。 – Johnsyweb 2010-09-07 22:14:08