다음과 같은 웹 로그 파일이 있습니다.
Nmap scan report for 192.168.1.51
Host is up.
PORT STATE SERVICE
80/tcp open http
443/tcp open https
8080/tcp open http-proxy
443/tcp open https
8080/tcp open http-proxy
8082/tcp filtered redcap
8083/tcp filtered https-alt
Nmap scan report for 192.168.1.201
Host is up.
PORT STATE SERVICE
80/tcp open http
443/tcp filtered https
8281/tcp filtered http-proxy
8080/tcp open sedan
8801/tcp filtered https-alt
Nmap scan report for 192.168.1.17
Host is up.
PORT STATE SERVICE
80/tcp closed http
443/tcp closed https
9081/tcp open ecan
Nmap scan report for 192.168.1.10
Host is up.
PORT STATE SERVICE
80/tcp closed ftp
443/tcp open https
9081/tcp open standard
IP 주소와 각 IP 주소에 대해 열린 포트 수를 추출하고 싶으므로 결과는 다음과 같습니다.
192.168.1.10 - 2
192.168.1.201 - 2
192.168.1.51 - 5
192.168.1.17 - 1
답변1
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
결과를 인쇄합니다.
답변2
nmap 로그 파일이 있는 것으로 보이므로 nmap 호출을 제어할 수 있는 경우 (더 이상 사용되지 않음) -oG
옵션을 사용하여 grepable 출력을 생성하는 것을 고려하십시오. 예를 들어:
$ nmap -oG /tmp/output.txt localhost
$ awk '/^Host: / && /Ports: / { num=gsub("/open/", ""); print $2, "-", num }' < /tmp/output.txt
127.0.0.1 - 6
이는 awk를 사용하여 nmap의 grepable 출력을 구문 분석합니다. awk 스크립트는 "Ports:" 문자열도 포함하는 "Host:" 행을 찾은 다음 "/open/" 문자열 수를 계산하고 각 호스트에 대한 수를 보고합니다.
답변3
대신 다음 접근 방식을 사용합니다 awk
.
awk 'function output() { print ip, count; count=0 }
/Nmap/ && count { output() }
/Nmap/ { ip=$NF }
/open/ { count++ }
END{ output() }' infile