Número de linhas de saída do programa anterior

29

Estou tentando contar o número de linhas de saída que um determinado programa produz. O problema é que o programa leva muito tempo para ser executado e eu quero exibir a saída para o usuário. Existe uma maneira de contar o número de linhas que o último comando produziu?

Eu poderia fazer program | wc -l , mas isso não mostraria a saída para o usuário. Então, tanto quanto eu sei, eu tenho que fazer program; program | wc -l - mas o programa leva pelo menos um minuto para ser executado, então eu não quero ter que fazê-lo mais de uma vez apenas para mostrar uma contagem de linha na parte inferior.

EDITAR:

  • Existe uma maneira de mostrar a saída como acontece (linha por linha) e, em seguida, retornar uma contagem no final?
por Libbux 18.04.2013 / 00:08

6 respostas

36

Você pode usar tee para dividir o fluxo de saída enviando uma cópia para wc e a outra cópia para STDOUT como normal.

program | tee >(wc -l)

A sintaxe >(cmd) é bash, o que significa executar cmd e substituir o >(cmd) bit pelo caminho para (um canal nomeado conectado a) o STDIN desse programa.

    
por 18.04.2013 / 00:22
9

Uma opção é usar o awk, que pode fazer a contagem e imprimir na stdout.

program | awk '{ print } END { print NR }'

Em awk , NR é o número da linha atual. Você pode realizar o mesmo com perl:

program | perl -pe 'END {print "$.\n"}'

Ou sed :

program | sed -n 'p;$='
    
por 18.04.2013 / 00:18
5

Você pode clonar stdout em stderr.

program | tee /dev/stderr | wc -l

Dessa forma, o stdout de program é canalizado para tee para ser gravado em stderr, que é impresso no console. tee também grava os dados enviados para o stdout, que é canalizado para wc .

    
por 18.04.2013 / 00:38
1

minha opção favorita:

program | grep "" -c
    
por 16.05.2018 / 21:47
0
tail -f /var/log/squid/access.log | ( c=0; pl() { echo $c; c=0; }; trap pl SIGHUP; while read a; do (( c=c+1 )); done ) & ( trap 'kill $! ; exit' SIGINT; trap '' SIGHUP; while true; do kill -HUP $! ; sleep 1; done)
    
por 31.08.2015 / 14:19
0

Isso pode ser tarde. Mas eu gostaria de abordar sua pergunta de acompanhamento sobre como capturar o número contado em uma variável.

Isso é o que você quer YOUR_VAR=$(PROGRAM | tee /dev/stderr | wc -l) .

Aproveitamos tee gerando dois fluxos aqui e direcionamos um para /dev/stderr , que apareceria na tela, e o outro para wc -l , que informaria o número de linhas.

    
por 29.05.2018 / 22:52