awk를 사용하여 IP만 인쇄하고 포트 필드 열기

awk를 사용하여 IP만 인쇄하고 포트 필드 열기

주어진 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/이 줄과 일치하는 경우 :

  1. $2IP를 사용하여 변수 생성 ( )
  2. 필드를 반복합니다 $3. 일치하는 항목이 있으면 NF필드를 변수에 추가합니다./open/
  3. 변수를 인쇄합니다.

답변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?///,  

관련 정보