TCPストリームを操作するためにgawkを使用しようとしています。 TCPサーバーは、スペースで区切られたテキスト文字列を出力します。最初に追加の文字列を追加してから、残りのフィールドをスペースの代わりにカンマで区切りたいと思います。私は以下を試しました:
socat TCP4:127.0.0.1:8888 - | gawk '{out=""; for(i=1;i<=NF;i++){if (i > 1) {out=out","$i} else out="Hello,"$i}; print out}'
これはうまくいきます。しかし、次のように、そのストリームを2番目のソケットにリダイレクトしたいと思います。
socat TCP4:127.0.0.1:5754 PIPE gawk '{out=""; for(i=1;i<=NF;i++){if (i > 1) {out=out","$i} else out="$LZER0,POS,"$i}; print out}' | socat - TCP:127.0.0.1:9999
しかし、127.0.0.1:9999には何もありません。次のように聞いてみました。
socat tcp-listen:9999,reuseaddr,ignoreeof,fork stdout
しかし、何もありません。
私は別のテストを行いました。
socat TCP4:127.0.0.1:5754 PIPE gawk '{out=""; for(i=1;i<=NF;i++){if (i > 1) {out=out","$i} else out="$LZER0,POS,"$i}; print out}' | socat - -
しかし、私の標準出力には何もありません。
助けてください?
答え1
gawk
出力がパイプに入り、バッファをフラッシュするのに十分な出力が生成されない場合、出力がバッファリングされる可能性が高くなります。
出力バッファを手動でフラッシュするには、プログラムfflush()
で次を使用します。gawk
gawk '{ ... ; print out; fflush() }'