Как использовать регулярные выражения в awk для этого случая? - PullRequest
0 голосов
/ 03 мая 2018

Я сканирую сети, используя 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 для сохранения IP с состоянием OPEN?

Заранее спасибо, С уважением. // terrisa

Ответы [ 2 ]

0 голосов
/ 03 мая 2018
awk '/^Nmap/{ip=$5}; / open /{print ip}' file

или

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

Выход:

30.142.41.52
0 голосов
/ 03 мая 2018

С помощью 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...