/ / tcpdumpの出力を複数回パイプ処理する - bash、unix、awk、pipe、tcpdump

tcpdumpの出力をbash、unix、awk、pipe、tcpdumpなどに何度も配管する

bashでは、通常、tcpdumpの出力をawk式に送信することはできません。 このStack Exchangeに関する質問。 これは何も表示しません。

sudo tcpdump -i en1 -n -q "tcp[13]=18 and src port 80" | awk "{$0=$3; sub(".80$",""); print $0}"

解決策は、出力をでバッファすることです。 -l これは期待どおりに動作するフラグです。

sudo tcpdump -i en1 -n -q -l "tcp[13]=18 and src port 80" | awk "{$0=$3; sub(".80$",""); print $0}"

しかし、awkの出力をファイルまたは他の場所にパイプしようとすると、ファイルは作成されますが、tcpdumpがパケットを受信したと言っていても空のままです。

sudo tcpdump -i en1 -n -q -l "tcp[13]=18 and src port 80" | awk "{$0=$3; sub(".80$",""); print $0}" | tee -a file.txt

または

sudo tcpdump -i en1 -n -q -l "tcp[13]=18 and src port 80" | awk "{$0=$3; sub(".80$",""); print $0}" | awk "{print $3}" >> file.txt

私の回避策はファイルに出力することです。その後、そのファイルに対してawkを実行し、別のファイルにエクスポートします。ただし、編集したファイルをリアルタイムで読み取ることはできません。これがなぜ起こるかについての任意のアイデア?

回答:

回答№1の場合は3

awk 持っています fflush 出力バッファを送信する関数

sudo tcpdump -i eth0 -q -l | awk "{print $3; fflush}" | tee -a file.txt