嗨,亲爱的 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/