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の場合は3awk
持っています fflush
出力バッファを送信する関数
sudo tcpdump -i eth0 -q -l | awk "{print $3; fflush}" | tee -a file.txt