如何在awk中使用正则表达式?

时间:2018-05-03 18:23:01

标签: regex awk

我正在使用nmap扫描网络。

结果如下:

Nmap scan report for 30.142.41.52
Host is up.

PORT     STATE    SERVICE
8080/tcp open http-proxy

Nmap scan report for 51.136.230.94
Host is up.

PORT     STATE    SERVICE
8080/tcp filtered http-proxy

Nmap scan report for 58.188.208.42
Host is up.

PORT     STATE    SERVICE
8080/tcp filtered http-proxy

我只是想知道如何使用grep或awk,只保存状态"打开"结果并将其保存在文本文件中?

我尝试过像......

awk '{print $5}' | sort -n > IPs

但它只保存IP,那么如何在awk中使用正则表达式来保存处于OPEN状态的IP?

提前谢谢你, 问候。 // terrisa

2 个答案:

答案 0 :(得分:1)

awk '/^Nmap/{ip=$5}; / open /{print ip}' file

awk '$1=="Nmap"{ip=$5}; $2=="open"{print ip}' file

输出:

30.142.41.52

答案 1 :(得分:0)

使用awk,您可以使用您选择的字符串设置记录分隔符(RS),对于字段分隔符(FS)也是如此:

awk -F"\n" -v RS='Nmap scan report for ' '$5~/ open /{print $1}'

这样,awk不是逐行工作,而是逐块工作(从每个'Nmap扫描报告'到'下一个);并且字段分隔符是换行符(这意味着第一个字段是IP,第五个字段是行8080/tcp open http-proxy)。

请注意,如果您使用gawk,则可以将每个IP存储在一个数组中并使用asort函数,而不是将结果传递给sort