Como um pipe de socat para sed a bc to xargs?

0

Eu tenho um servidor gerando alguns números, eu estou lendo-os com socat, depois usando sed, eu transformo esses números em algumas equações matemáticas, eu os executo com bc, então eu preciso canalizá-los em xargs.

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

O tubo acima não produz saída. Meu pipe é exatamente assim, exceto pela declaração sed, e também não produz saída.

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

Um pipe como o acima, no entanto, imprime um grupo de 2s para o console conforme o esperado. Os dois canais devem ser os mesmos, porque a linha sed muda tudo na mesma frase, não importa o quê. Por que o pipe com socat não produz saída? Meu único palpite é que o servidor só envia números uma vez por segundo, e há algum tipo de problema de buffer, mas usar stdbuf -o0 não muda nada.

    
por user3397903 29.05.2015 / 07:38

1 resposta

1

Quebrando os componentes:

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

O que está faltando? Um espaço reservado. Nota: '-i' ativa strings de substituição e '{}' é o marcador de posição.

# 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. Parece -i é depreciada. Use -I.

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

OU use '-n1' para definir max-args como 1.

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

OU use '-L1' para definir linhas máximas como 1. Como mencionado nos comentários.

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

Mais sobre comandos complexos:

link

Espero que isso ajude.

    
por 29.05.2015 / 10:29