以下问题对我的系统来说可能很复杂且至关重要
我有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地址并打印出来的创意建议
利迪娅
答案 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 /