regex - linux + 不规则表达式查找机制(查找命令)或 perl

标签 regex linux perl find

嗨,亲爱的 friend ,早上好

以下问题对我的系统来说可能很复杂而且很关键

我有 4 台带集群的 Linux 机器

我的目标是在linux系统的每个文件中找到各种IP地址(xxx.xxx.xxx.xxx)

备注:需要扫描linux系统中的每个文件,验证文件是否包含IP地址,如果是需要打印IP

如下

更多/etc/inet/file.example1

 182.23.2.4
 255.255.0.0
 10.10.1.1
 19.2.*.*
 127.0.0.1

更多/etc/dir/file1.example2

 1.1.1.1 TCP

等等......

我可以得到一些搜索所有IP地址并打印出来的创造性建议吗

莉迪亚

最佳答案

当被要求匹配 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 操作使用 '\0' 分隔文件名,但 '\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";
  }
}

关于regex - linux + 不规则表达式查找机制(查找命令)或 perl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3656434/

相关文章:

perl - 什么时候应该使用 Perl 的 AUTOLOAD?

java - @Pattern 正则表达式仅允许 : numbers & empty String & numbers beginning by 0

python - Python 中的正则表达式反向引用问题

regex - 理解 sed 命令中的正则表达式

javascript - 直接访问 Amazon S3 被拒绝

perl - Test::Class 测试可以并行运行吗? (或如何分解父类(super class)测试)

PHP - 特殊字符字符串的正则表达式

regex - 在 Linux 中使用正则表达式搜索/Grep 仅公共(public) IP 地址

c - 在 C 中的特定端口上运行服务守护进程?

linux - 计算一个巨大目录中的文件