この Stack Exchange questionで説明されているように、bash では通常、tcpdump の出力を awk 式に送信することはできません。これは何も出力しません:
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 を実行し、別のファイルにエクスポートすることでしたが、これでは、編集したファイルをリアルタイムで読み取ることができなくなります。なぜこれが起こるのかについてのアイデアはありますか?