Wie würde man von socat zu sed zu bc zu xargs pfeifen?

0

Ich habe einen Server, der einige Zahlen ausgibt, ich lese sie mit socat, verwandle sie dann mit sed in einige mathematische Gleichungen, ich führe sie mit bc aus, dann muss ich sie in xargs umleiten.

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

Die obige Pipe 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 die oben beschriebene gibt jedoch erwartungsgemäß ein paar Sekunden an die Konsole aus. Beide Pfeifen sollten jedoch gleich sein, da die Sed-Linie alles in die gleiche Phrase ändert, egal was passiert. Warum produziert die Pfeife mit socat keine Ausgabe? Ich vermute nur, dass der Server nur einmal pro Sekunde Zahlen sendet und es eine Art Pufferproblem gibt, aber die Verwendung von stdbuf -o0 ändert nichts.

user3397903
quelle

Antworten:

1

Aufteilung der Komponenten:

# 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 -i ist veraltet. Verwenden Sie -I.

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

ODER setzen Sie mit '-n1' max-args auf 1.

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

ODER setzen Sie mit '-L1' die max-Zeilen auf 1. 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.

Alex Atkinson
quelle
In Summe: xargs wartet auf weitere eingaben. ich denke, dass xargs -L 1 ist wahrscheinlich ausreichend, um das zu vermeiden.
Toby Speight
Ja, ich bin zurückgekommen, um die Option -n hinzuzufügen, aber Ihr Kommentar ist möglicherweise gültiger, je nachdem, was bestanden wird und wer diese Antwort liest. Vielen Dank. @TobySpeight
Alex Atkinson