linux +查找机制与Irregular Expression(查找命令)或perl

时间:2010-09-07 07:06:13

标签: regex linux perl find

亲爱的朋友们,早上好,

以下问题对我的系统来说可能很复杂且至关重要

我有4台带有集群的Linux机器

我的目标是在linux系统的每个文件中找到所有类型的IP地址(xxx.xxx.xxx.xxx)

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

如下

more /etc/inet/file.example1

 182.23.2.4
 255.255.0.0
 10.10.1.1
 19.2.*.*
 127.0.0.1

more /etc/dir/file1.example2

 1.1.1.1 TCP

ETC .................

我是否可以获得一些搜索所有IP地址并打印出来的创意建议

利迪娅

3 个答案:

答案 0 :(得分:2)

当要求匹配IP地址时,许多人会写

/\d+\.\d+\.\d+\.\d+/

但这会产生误报。在Jeffrey Friedl的Mastering Regular Expressions中,作者提供了一种匹配IP地址的模式,这种模式要小心得多。下面的代码借用了Friedl来强制不是任意数字的运行,但是在0到255的范围内,要求地址在字边界(\b)开始和结束,并且不允许地址0.0.0.0。 / p>

没有参数,下面的代码默认为搜索开始的当前目录。要搜索所有文件,请提供根目录作为参数。打开find输出的每条路径,然后我们搜索每一行的IP地址,并打印所有匹配及其各自的路径。

请注意代码如何使用local在记录分隔符$/的NUL字符和换行符之间来回透明地切换。这是必要的,因为find的{​​{1}}操作会将文件名与-print0分开,但'\0'是行终止符。使用-T,我们只搜索文本文件。

'\n'

答案 1 :(得分:0)

在Linux上(grep支持递归搜索)并假设每行最多1个IP地址,下面的代码可以工作(--include& --exclude是可选的,搜索从$ PWD递归开始)。

grep -r -P [--include=PATTERN --exclude=PATTERN]\
  '\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b' $PWD |\
  perl -ne 'print "$1\n" if /\b(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\b/;'

答案 2 :(得分:0)

要搜索文件,我几乎总是使用ack

一个简单的模式,正如gbacon所说,会导致误报:

ack -uo '\b\d+\.\d+\.\d+\.\d+\b' /

-u选项使ack匹配不受限制,ack通常会跳过版本控制元数据目录,如.svn和备份文件。 -o选项将打印出匹配的每一行的部分,而不是匹配的整行。

同样的想法,但使用gbacon更好的模式:

ack -uo '\b(?!0+\.0+\.0+\.0+\b)(?:[01]?\d\d?|2[0-4]\d|25[0-5])(?:\.(?:[01]?\d\d?|2[0-4]\d|25[0-5])){3}\b' /

要匹配特定地址,您可以使用--literal指定要匹配的确切文字。

ack -uo --literal 123.34.5.23 /