socat 和 gawk 管道

socat 和 gawk 管道

我正在尝试使用 gawk 操作 TCP 流。 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}'

这是有效的。但现在我想将该流重定向到第二个套接字上,如下所示:

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

相关内容