如何通過管道從 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”將 max-lines 設為 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

希望有幫助。

相關內容