与えられた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/
この行と一致する場合:
$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?///,