我有一个服务器输出一些数字,我用 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
希望这有帮助。