如何使用Perl从日志文件或任何其他文件中过滤出IP地址?

如何使用Perl从日志文件或任何其他文件中过滤出IP地址?,perl,unix,solaris,Perl,Unix,Solaris,我试图找出如何使用Perl扫描特定文件,找到所有IP地址并阻止它们,以便将IP地址中的数字转换为x。例如:194.66.82.11,在代码运行后,它的格式为xxx.xx.xx.11,而不是完全删除它。这是在unix中实现的 要匹配以句点分隔的4个数字(最大长度为3),可以使用以下正则表达式: (?:[0-9]{1,3}\.){3}([0-9]{1,3}) 替换时,您可以使用\1访问最后一个捕获组(第一个是非捕获组),例如xxx.xxx.xxx.\1。请注意,结果的xs数与原始IP的位数不同。如

我试图找出如何使用Perl扫描特定文件,找到所有IP地址并阻止它们,以便将IP地址中的数字转换为x。例如:194.66.82.11,在代码运行后,它的格式为
xxx.xx.xx.11
,而不是完全删除它。这是在unix中实现的

要匹配以句点分隔的4个数字(最大长度为3),可以使用以下正则表达式:

(?:[0-9]{1,3}\.){3}([0-9]{1,3})

替换时,您可以使用
\1
访问最后一个捕获组(第一个是非捕获组),例如
xxx.xxx.xxx.\1
。请注意,结果的
x
s数与原始IP的位数不同。如果这是一个问题,您必须调整正则表达式。

您在评论中声明您正在使用日志文件:

192.168.72.177 - - [22/Dec/2002:23:32:19 -0400] "GET /search.php HTTP/1.1" 400 1997 www.yahoo.com "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; ...)" "-" –
因此,我建议您只需编辑日志文件的第一个字段即可获得结果

使用perl单行程序

perl -lane '$F[0] =~ s/\d(?=.*\.)/x/g; print "@F"' file.log
产出:

xxx.xxx.xx.177 - - [22/Dec/2002:23:32:19 -0400] "GET /search.php HTTP/1.1" 400 1997 www.yahoo.com "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; ...)" "-" –

你是否需要考虑IPv6?NoPE,只是IPv4@ KnITTLL,你的Login的某个部分可以使用ReGEX来完成它。@ AISHIS 192.16872.177-(22 /DEC/2002∶23:32∶19 - 0400)“获取/搜索.php http/1.1”400 1997,wwwayyocom“-”“Mozilla /4(兼容;MSIE 6;Windows NT 5.1;…)”-“像这样吗?”perl-nle(?[0-9]{1,3}\){3}([0-9]{1,3});'文件名