Awk 从nmap输出的不同行灰显字符串

Awk 从nmap输出的不同行灰显字符串,awk,sed,grep,output,nmap,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

我有以下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-p110-sv192.168.1.10-20

注意:我没有在nmap中使用-oG输出格式,因为我知道它已被弃用

我需要的输出:

192.168.1.15 open Popper
192.168.1.20 open Dove
如您所见,它应该只打印打开端口的IP地址、状态和版本

我所尝试的:

使用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}"
我遇到的困难是如何从输出的不同行中提取特定部分并将它们放在一起

更新 我发现,有时在版本栏中不止一个单词,例如有时它可能会说
Popper 1.2.7-Beta
,而不仅仅是
Popper
。在这种情况下,它只打印
1.2.7-Beta
,而不是
Popper 1.2.7-Beta
(因为单词之间的空格混淆了它)。您将如何处理这种情况

试试这个:

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”)以及行的最后一个字段(版本列中的内容)。

此awk如何:

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

你能解释一下每一部分的作用吗?感谢您的解释,我发现版本栏中有时不止一个单词,例如有时它可能会说
Popper 1.2.7-Beta
,而不仅仅是
Popper
。在这种情况下,它只打印
1.2.7-Beta
,而不是
Popper 1.2.7-Beta
。您将如何处理这种情况?谢谢,我假设一种方法是删除两个不需要的字段,然后打印结果行-将
print
部分替换为
$1=“”$3=""; 打印主机,$0
。另一种方法是循环使用
$4
<编码>$NF并分别打印它们。。。如果字段由制表符分隔,则会有另一个选项,但我不知道
nmap
是否是这种情况……为此,您可以使用
-oG
格式。Nmap所说的“弃用”是指格式已冻结,并且不会向其添加新功能。因此,它只代表Nmap可能输出的一小部分。不过,它不会去任何地方,它确实以一种易于解析的格式包含了您需要的部分。@bonsaiviking-啊,太好了,我认为这意味着它将在某个时候被删除。谢谢你的帮助