如何从 socat 到 sed 到 bc 到 xargs 进行管道传输?

如何从 socat 到 sed 到 bc 到 xargs 进行管道传输?

我有一个服务器输出一些数字,我用 socat 读取它们,然后使用 sed,我将这些数字转换成一些数学方程式,我用 bc 运行它们,然后我需要将它们通过管道传输到 xargs 中。

socat -u udp-recv:10552,reuseaddr,crnl - | sed -u s/.*/1+1/ | bc | xargs echo

上面的管道没有输出任何内容。我的管道与此完全一样,只是没有 sed 语句,同样也没有输出任何内容。

yes | gsed -u s/.*/1+1/ | bc | xargs echo

但是,如上所示的管道会按预期将一堆 2 打印到控制台。但是,两个管道应该相同,因为 sed 行无论如何都会将所有内容更改为相同的短语。为什么带有 socat 的管道没有输出?我唯一的猜测是服务器每秒只发送一次数字,并且存在某种缓冲区问题,但使用 stdbuf -o0 不会改变任何东西。

答案1

分解组件:

# From host1 - Start with 'socat'
user@host1:~# socat -u udp-recv:10552,reuseaddr,crnl -
# From host2 send some data via udp to host1:10552
user@host2:~# echo foo > /dev/udp/host1/10552
# Result on host1
foo

# From host1 - Add 'sed'
user@host1:~# socat -u udp-recv:10552,reuseaddr,crnl - | sed -u s/.*/1+1/
# From host2 send some data via udp to host1:10552
user@host2:~# echo foo > /dev/udp/host1/10552
# Result on host1
1+1

# From host1 - add 'bc'
user@host1:~# socat -u udp-recv:10552,reuseaddr,crnl - | sed -u s/.*/1+1/ | bc
# From host2 send some data via udp to host1:10552
user@host2:~# echo foo > /dev/udp/host1/10552
# Result on host1
2

# From host1 - add 'xargs echo'
user@host1:~# socat -u udp-recv:10552,reuseaddr,crnl - | sed -u s/.*/1+1/ | bc | xargs echo
# From host2 send some data via udp to host1:10552
user@host2:~# echo foo > /dev/udp/host1/10552
# Result on host1
[ nothing ]

缺少什么?一个占位符。注意:'-i' 启用替换字符串,'{}' 是占位符。

# From host1 - setup xargs with -i
user@host1:~# socat -u udp-recv:10552,reuseaddr,crnl - | sed -u s/.*/1+1/ | bc | xargs echo -i{} echo {}
# From host2 send some data via udp to host1:10552
user@host2:~# echo foo > /dev/udp/host1/10552
# Result on host1
2

嗯。看来 -i 已被弃用。请使用 -I。

user@host1:~# socat -u udp-recv:10552,reuseaddr,crnl - | sed -u s/.*/1+1/ | bc | xargs echo -I{} echo {}

或者使用‘-n1’将 max-args 设置为 1。

socat -u udp-recv:10552,reuseaddr,crnl - | sed -u s/.*/1+1/ | bc | xargs -n1

或者使用'-L1'将最大行数设置为 1。正如评论中所提到的。

socat -u udp-recv:10552,reuseaddr,crnl - | sed -u s/.*/1+1/ | bc | xargs -L1

有关复杂命令的更多信息:

http://www.tldp.org/LDP/abs/html/moreadv.html

希望这有帮助。

相关内容