socatとgawkパイプライン

socatとgawkパイプライン

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() }'

おすすめ記事