Greping来自nmap输出的不同行的字符串

时间:2014-05-15 13:09:45

标签: awk sed grep output nmap

我有以下nmap输出:

Nmap scan report for 192.168.1.14
Host is up (0.13s latency).
PORT    STATE  SERVICE VERSION
110/tcp closed pop3    
--
Nmap scan report for 192.168.1.15
Host is up (0.13s latency).
PORT    STATE SERVICE    VERSION
110/tcp open  pop3       Popper
--
Nmap scan report for 192.168.1.20
Host is up (0.13s latency).
PORT    STATE SERVICE VERSION
110/tcp open  pop3    Dove

我使用命令nmap -p 110 -sV 192.168.1.10-20

注意:我没有将-oG输出格式与nmap一起使用,因为我知道它已被弃用。

我需要的输出:

192.168.1.15 open Popper
192.168.1.20 open Dove

如您所见,它应该打印IP地址,仅打开OPEN端口的状态和版本

我尝试过:

使用grep和awk的各种变体(使用下面的命令)来获取我所需的输出,但是无法按照我想要的方式工作:

nmap -p 110 -sV 192.168.1.10-20 | grep -B3 'open' | egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}"

我遇到的困难是如何从输出的不同行提取特定部分并将它们放在一起

非常感谢您的帮助,谢谢

************* UPDATE ***************

我发现有时在VERSION列中不仅有单个单词,有时可能会说Popper 1.2.7-Beta而不仅仅是Popper。在这种情况下,它只会打印1.2.7-Beta而不是Popper 1.2.7-Beta(因为单词之间的空格会混淆它)。你会如何应对这种情况?感谢

2 个答案:

答案 0 :(得分:1)

试试这个:

awk '/Nmap scan report/ { host=$NF } NF==4 && $2=="open" { print host, $2, $NF }' nmap-output.txt

说明:

1)对于与字符串“Nmap scan report”匹配的任何行,请记住变量名称“host”中该行的最后一个字段

2)对于任何有4个字段并且第二个字段与字符串“open”匹配的行,打印记住的“host”变量,该行的第二个字段(“open”)和最后一个字段line(Version列中的内容)。

答案 1 :(得分:0)

这个awk怎么样:

awk '/^Nmap/{a=$5}
     /^110\/tcp open/{print a,$2,$3}' Your_file