1

tshark出力をにパイプしようとしていawkます。tsharkコマンドはそれ自体で正常に機能し、などの他のプログラムにパイプするとcat正常に機能します(出力のリアルタイム印刷)。ただし、awkにパイプ接続すると、ハングして何も起こりません。

sudo tshark -i eth0 -l -f "tcp" -R 'http.request.method=="GET"' -T fields -e ip.src -e ip.dst -e 
tcp.srcport -e tcp.dstport -e tcp.seq -e tcp.ack | awk '{printf("mz -A %s -B %s -tcp \"s=%s sp=%s 
dp=%s\"\n", $2, $1, $5, $4, $3)}'

これはより単純なバージョンです:

sudo tshark -i eth0 -f "tcp" -R 'http.request.method=="GET"' | awk '{print $0}'

比較すると、以下は問題なく機能します(ただし、あまり有用ではありません)。

sudo tshark -i eth0 -f "tcp" -R 'http.request.method=="GET"' | cat

前もって感謝します。

4

3 に答える 3

4

私も同じ問題を抱えていました。

完全に移植できない部分的な「解決策」をいくつか見つけました。それらのいくつかは、fflush()またはflush()awk関数または-Wインタラクティブオプションを使用することを示しています

http://mywiki.wooledge.org/BashFAQ/009

私は両方を試しましたが、どれも機能しませんでした。したがって、awkは適切なコマンドではありません。

それらのいくつかはgawkを使用することを提案していますが、どちらも私にとってはトリックではありません。

cutコマンドにも同じ問題があります。

私の解決策:私の場合は、-line-bufferedをGREPに入れて、awkコマンドに触れないようにする必要がありましたが、あなたの場合は、次のことを試してみます。

sed -u 

適切な正規表現を使用します。例えば:

sed -u 's_\(.*\)     \(.*\)  \(.*\) DIFF: \(.*\)_\3 \4_'

この式により、3番目と4番目の列がTABで区切られます(ctrl + vとTABの組み合わせで記述されます)。-uオプションを使用すると、バッファなしの出力が得られます。また、-lオプションを使用すると、行バッファ付きの出力が得られます。

遅いですが、この回答がお役に立てば幸いです。

于 2013-03-21T21:32:48.187 に答える
2

コメントの以前のメッセージによると、入力を強制的に閉じてラインフィードを発行するように強制的に機能する可能性があります。

sudo tshark -i eth0 -f "tcp" -R 'http.request.method=="GET"' ...... \
| {
    awk '{print $0}'
    printf "\n"
  }

awkとprintfの間にパイプがないことに注意してください。

これがお役に立てば幸いです。

于 2011-08-08T02:53:47.120 に答える
1

ここで解決策を見つけました https://superuser.com/questions/742238/piping-tail-f-into-awk(John1024による)。

それは言う:

「効率を上げるためにパイプがバッファリングされるため、リアルタイムでは表示されません。出力がawkに渡される前に、tail -fがバッファ(通常は4 kB)をいっぱいにする必要があります。」

提案されている解決策は、「unbuffer」または「stdbuf-o0」コマンドを使用してバッファリングを無効にすることです。それはこのように私のために働いた:

stdbuf -o0 tshark -i ens192 -f "ip" | awk'{print $ 0}'

于 2021-12-11T08:29:03.723 に答える