주어진 gnmap 파일에서 IP 주소와 열린 포트 필드를 인쇄하고 싶습니다.
호스트: 123.123.123.123 () 포트: 80/open/tcp//http?///, 443/open/tcp//https?///, 8083/close/tcp//us-srv///, 65001 /close/tcp///// 상태 무시: 필터링됨(65531) 시퀀스 인덱스: 262 IP ID 시퀀스: 무작위 호스트: 123.123.123.124 () 포트: 80/open/tcp//http?///, 443/open/tcp//https?///, 10443/open/tcp//https///, 65001/close /tcp///// 상태 무시: 필터링됨(65531) 시퀀스 인덱스: 262 IP ID 시퀀스: 무작위 호스트: 123.123.123.125 () 포트: 80/open/tcp//http?///, 443/open/tcp//https?///, 8083/close/tcp//us-srv///, 8445 /open/tcp//https///, 65001/close/tcp///// 상태 무시: 필터링됨(65531) 시퀀스 인덱스: 262 IP ID 시퀀스: 무작위 호스트: 123.123.123.126 () 포트: 1337/open/tcp//https?///, 8083/close/tcp//us-srv///, 65001/close/tcp///// 상태 무시: 이미 필터(65531) 시퀀스 인덱스: 262 IP ID 시퀀스: 무작위
예상 출력은 다음과 같습니다.
123.123.123.123 80/open/tcp//http?///, 443/open/tcp//https?/// 123.123.123.124 80/open/tcp//http?///, 443/open/tcp//https?///, 10443/open/tcp//https/// 123.123.123.125 80/open/tcp//http?///, 443/open/tcp//https?///
나는 다양한 명령을 시도했는데 그 중 하나는 다음과 같습니다.
cat targets_osdetection.gnmap | awk '/open/{print $2 " " $5 " "$6 " " $7}'
하지만 $Number 필드에 해당하는 필드만 출력하며, 각 IP의 열려 있는 포트 수가 동일하지 않을 수 있으므로 이 명령은 효율적이지 않습니다.
누구든지 이것에 대한 awk 솔루션을 제공할 수 있습니까?
답변1
awk '/\/open\//{
l=$2
for (i=3;i<=NF;++i) {
if ($i~/\/open\//) l=l" "$i;
};
print l
}'
설명하다:
/open/
이 줄과 일치하는 경우 :
$2
IP를 사용하여 변수 생성 ( )- 필드를 반복합니다
$3
. 일치하는 항목이 있으면NF
필드를 변수에 추가합니다./open/
- 변수를 인쇄합니다.
답변2
정적 파일 형식 교체가 있으므로 sed
다음 작업도 수행할 수 있습니다.
sed -E 's/(Host:|Ports:|\(\)) +|[^ ]+closed[^ ]+| +Ignored State:.*//g' targets_osdetection.gnmap
산출:
123.123.123.123 80/open/tcp//http?///, 443/open/tcp//https?///,
123.123.123.124 80/open/tcp//http?///, 443/open/tcp//https?///, 10443/open/tcp//https///,
123.123.123.125 80/open/tcp//http?///, 443/open/tcp//https?///, 8445/open/tcp//https///,
123.123.123.126 1337/open/tcp//https?///,