awkで複数の出力ラインを一緒に印刷する方法

awkで複数の出力ラインを一緒に印刷する方法

私の出力は次のとおりです

________________________________________________

 :: Method           : GET
 :: URL              : HOST/FUZZ
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 500
 :: Matcher          : Response status: 200
________________________________________________

[Status: 200, Size: 52, Words: 2, Lines: 6]
    * FUZZ: index.jsp
    * HOST: https://test.com


この出力で私が得たいのは、2つを1つにまとめることです。

期待される出力

https://test.com/index.jsp

私が試したことは

awk '/HOST:/{ print $4} /FUZZ:/{ print $4}' ffuf'

出力

index.jsp
https://test.com

16進ダンプ出力

grep 'FUZZ:' ffuf | hexdump -C

出力

00000000  0d 0d 20 20 20 20 2a 20  46 55 5a 5a 3a 20 69 6e  |..    * FUZZ: in|
00000010  64 65 78 2e 6a 73 70 0a                           |dex.jsp.|
00000018

彼らに連絡する方法を知っていますか?

ありがとう

答え1

hexdump探しているデータを含む行の先頭に2つのキャリッジリターンがあることが示されている出力から明らかです。解析データを使用する場合、これはその行の最初のフィールドを形成しますawk。以下の2つのバリエーション(sedおよび)は、awkこれらの問題を無視()または回避()してこの問題を解決します。sedawk


を使用しsed、with行がFUZZ:常にwith行の前に表示されるとしますHOST:

$ sed -n '/.*FUZZ: /{ s///; h; }; /.*HOST: /{ s///; G; s,\n,/,p; }' file
https://test.com/index.jsp

このsedコマンド(各行をオフにするデフォルトの出力として実行-n)はそのFUZZ:行を一致させ、ファイル名までその行のすべてのエントリを削除します。次に、ファイル名を予約済みスペースにコピーしますh

行が一致すると、HOST:行の先頭も削除され、スペースの予約内容がURL(HOST:行の残りの部分)に追加されます。コマンドによって挿入された改行文字はGスラッシュに変更され、結果の文字列が印刷されます。


を使用すると、上記とawk同じ仮定が行われます。

$ awk -v OFS='/' '/FUZZ:/ { fuzz = $NF } /HOST:/ { print $NF, fuzz }' file
https://test.com/index.jsp

ここで、変数はfuzz上記のバリアントで使用したスペースsed、つまりファイル名を保持する役割を果たします。$NF行の最後のフィールドのデータです。

答え2

私はこれを行うことでこれを達成しました

awk '/FUZZ:/{ FUZZ=$4; next } /HOST:/{ print $4 "/" FUZZ }'

出力

https://test.com/index.jsp

関連情報