【问题标题】:How can I, using Perl, filter out IP addresses from a log file or any other file?如何使用 Perl 从日志文件或任何其他文件中过滤 IP 地址?
【发布时间】:2014-09-14 17:09:43
【问题描述】:

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

【问题讨论】:

  • 是否还需要考虑 IPv6?
  • 不,只是 IPv4 @knittl
  • 放一些你的日志
  • 你可以使用RegEx来做。
  • @ashish 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(兼容;MSIE 6.0;Windows NT 5.1;...)”“-”

标签: perl unix solaris


【解决方案1】:

您已在 cmets 中声明您正在使用日志文件:

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; ...)" "-" –

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 这样? perl -nle (?:[0-9]{1,3}\.){3}([0-9]{1,3});'文件名
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多