0

この 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 を実行し、別のファイルにエクスポートすることでしたが、これでは、編集したファイルをリアルタイムで読み取ることができなくなります。なぜこれが起こるのかについてのアイデアはありますか?

4

1 に答える 1

4

awk出力バッファを送信するfflush関数があります。

sudo tcpdump -i eth0 -q -l | awk '{print $3; fflush}' | tee -a file.txt
于 2013-06-30T08:56:29.567 に答える