Если вы обнаружите, что вам нужны более сложные управление файлами, которые вы собираете с помощью grep, чем предлагается в - exclude
, вы можете использовать find
для создания списка файлов для grep:
$ grep 'Any_you_w ant_to_find '$ (find wherever_you_want_to_search -not -iregex' something_you_want_to_ignore ')
awk
раствор:
awk 'BEGIN{RS=""; FS="\n"}
{split($1,a," "); host[a[5]] = 0; for (i=1; i<=NF; i++) if (match($i,"open") != 0)
host[a[5]]++} END{for (each in host) print each " - " host[each]}' file
192.168.1.10 - 2
192.168.1.201 - 2
192.168.1.51 - 5
192.168.1.17 - 1
В этой команде разделитель записей RS
был установлен на пустую строку “”
, а разделитель полей — на новую строку \n
. Затем awk
разбивает первую строку каждой записи и захватывает пятый элемент в разделенном массиве, который имеет отношение к IP-адресу. После этого Awk
перебирает оставшиеся поля NF
в поисках строки «open» в каждом поле. Когда присутствует open
, он будет считаться соответствующим IP-адресом в массиве хостов. Наконец, awk
выводит результаты.
Поскольку у вас есть файл журнала nmap, если у вас есть контроль над вызовом nmap, рассмотрите (устаревшую)-oG
опцию для создания вывода, допускающего сборку. Например:
$ nmap -oG /tmp/output.txt localhost
$ awk '/^Host: / && /Ports: / { num=gsub("/open/", ""); print $2, "-", num }' < /tmp/output.txt
127.0.0.1 - 6
Это использует awk для разбора greppable вывода от nmap; сценарий awk ищет строки «Host :», которые также содержат строку «Ports :»; затем он подсчитывает количество строк «/open/» и сообщает это число для каждого хоста.
Я бы использовал ниже awk
вместо:
awk 'function output() { print ip, count; count=0 }
/Nmap/ && count { output() }
/Nmap/ { ip=$NF }
/open/ { count++ }
END{ output() }' infile