使用正则表达式从日志中解析ip地址

使用正则表达式从日志中解析ip地址

我有一个包含大量日志的大型 nmap 扫描。我正在尝试将其变成仅 ip 的列表。

当我运行命令时,我收到如下反馈:

Starting Nmap 7.25BETA2 ( https://nmap.org ) at 2017-03-17 21:27 EDT
Nmap scan report for 10.10.1.22
Host is up (0.13s latency).
PORT   STATE SERVICE
25/tcp open  smtp
MAC Address: 00:50:56:89:7C:D5 (VMware)

Nmap scan report for 10.0.1.72
Host is up (0.22s latency).
PORT   STATE SERVICE
25/tcp open  smtp
MAC Address: 00:50:56:89:55:06 (VMware)

我试图使用以下命令仅检索 IP 列表:

nmap -n -p 25 10.11.1.1-254 --open | grep '\d{1,3}\.\d{1,3}\.\d\.\d{1,3}'

我还尝试过 awk 匹配:

nmap -n -p 25 10.11.1.1-254 --open | awk '/\d{1,3}\.\d{1,3}\.\d\.\d{1,3}/ { print $0 } '

尽管当我删除管道右侧的所有内容时能够看到输出,并且还能够使用暂存器中的正则表达式正确过滤 IP,但都没有返回任何结果。

我缺少什么知识?

答案1

对于此类事情,您首先要使用 Nmap 的正确输出格式。 Nmap的Grepable 输出选项( -oG) 以易于解析的格式生成输出,该格式在版本之间保持一致,这与“人类可读”的正常输出不同。以下是获取打开端口 25 的所有系统列表的方法:

nmap -p 25 --open 10.11.1.1-254 -oG - | awk '/^Host/{print $2}'

Nmap 将产生如下一行:

Host: 64.13.134.52 (scanme.nmap.org)    Ports: 25/open/tcp//smtp///

awk 命令将根据“Host”行开头进行匹配,并打印第二个字段(IP 地址)。

答案2

\d是一个与 perl 兼容的正则表达式 (PRCE) 扩展:您的版本grep 可能-P通过选项支持这个

grep -P '\d{1,3}\.\d{1,3}\.\d\.\d{1,3}'

否则你可以使用[0-9]十进制数字;但请注意,大括号在基本正则表达式中是文字,因此您要么需要扩展模式-E,要么必须转义它们

grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]\.[0-9]{1,3}'

或者

grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\.[0-9]\{1,3\}'

相关内容