bash - processando saída de uma linha por vez

0

Eu li que o xargs era bom para processar a saída de um comando, uma linha por vez (e é). Eu tenho a seguinte linha no meu script.

./gen-data | awk '{printf $2 " "; printf $1=$2=$3=""; gsub (" ", "", $0);if(length($0) == 0){ print "0000"} else{print $0}}' | xargs -t -n2 -P1 bash -c 'datatojson "$@"' _

Produz a saída certa, não há dúvidas sobre isso. No entanto, gen-data produz algo como 1000 linhas, e o que eu realmente gostaria é que este comando seja executado após cada linha, não depois de 1000 linhas (está parando regularmente para obter mais entradas).

Veja como a gen-data se parece:

candump $interface &
while true; do
    while read p; do
        cansend $interface $(echo $p | awk 'NF>1{print $NF}');
    done < <(shuf $indoc)
done

( cansend envia dados para uma interface e candump lê a partir dessa interface e envia para a tela, mas aposto que isso não é muito relevante). Em qualquer caso, candump parece estar continuamente transmitindo a saída, mas quando eu canalizo isso para awk e xargs , ele fica fragmentado. É só porque eu usei shuf ? Eu acho que, como ele está passando pela interface e sendo lido do outro lado, seria menos fragmentado do que o shuf fornece.

    
por user3475234 27.07.2015 / 16:03

1 resposta

2

Você pode tentar o mesmo comando, desta vez usando vários hacks para evitar o armazenamento em buffer :

./gen-data | gawk '{printf $2 " "; printf $1=$2=$3=""; gsub (" ", "", $0);if(length($0) == 0){ print "0000"} else{print $0}; fflush(stdout)}' | stdbuf -o0 xargs -t -n2 -P1 bash -c 'datatojson "$@"' _

Considere a mudança de awk para gawk e o uso de fflush . Você também pode tentar mawk -Winteractive . Lembre-se também que adicionei stdbuf -o0 antes dos xargs. Você também pode tentar o mais recente no início com ./gen-data

    
por 27.07.2015 / 17:23