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?///

私はさまざまなコマンドを試しましたが、その1つは次のとおりです。

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. 変数を印刷します。

おすすめ記事