Wie würde eine Pipe von SOCAT nach SOC und BC nach XARGS gehen?

918
user3397903

Ich habe einen Server, der ein paar Zahlen ausgibt, ich lese sie mit socat, dann verwende ich sed, verwende diese Zahlen in mathematische Gleichungen, lasse sie mit bc laufen, dann muss ich sie in xargs weiterleiten.

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

Das Rohr oben erzeugt keine Ausgabe. Meine Pipe ist bis auf die sed-Anweisung genau so und erzeugt auch keine Ausgabe.

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

Eine Pipe wie oben gibt jedoch erwartungsgemäß ein Bündel 2s an die Konsole aus. Beide Pfeifen sollten jedoch gleich sein, da die Sed-Linie alles in dieselbe Phrase umwandelt, egal was passiert. Warum produziert die Pfeife mit socat keine Leistung? Ich vermute nur, dass der Server nur einmal pro Sekunde Zahlen sendet, und es gibt ein Pufferproblem, aber die Verwendung von stdbuf -o0 ändert nichts.

0

1 Antwort auf die Frage

1
Alex Atkinson

Komponenten zerlegen:

# 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 ] 

Was fehlt? Ein Platzhalter Hinweis: '-i' aktiviert Ersatzzeichenfolgen und '{}' ist der Platzhalter.

# 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 

Hmm. Scheint, ich bin deprimiert. Verwenden Sie -I.

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

ODER benutze '-n1', um max-args auf 1 zu setzen.

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

ODER verwenden Sie '-L1', um die maximalen Zeilen auf 1 zu setzen. Wie in den Kommentaren erwähnt.

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

Mehr zu komplexen Befehlen:

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

Hoffentlich hilft das.

Zusammenfassend: `xargs` wartet auf weitere Eingaben. Ich denke, dass "xargs -L 1" wahrscheinlich ausreicht, um das zu vermeiden. Toby Speight vor 8 Jahren 0
Ja, ich kam zurück, um die Option -n hinzuzufügen, aber Ihr Kommentar ist möglicherweise gültiger, je nachdem, was übergeben wird und wer diese Antwort liest. Vielen Dank. @TobySpeight Alex Atkinson vor 8 Jahren 0