Estou tentando contar o número de linhas de saída que um determinado programa produz. O problema é que o programa demora muito 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 emitiu?
Eu poderia fazer, program | wc -l
mas isso não mostraria a saída para o usuário. Tanto quanto eu sei, tenho que fazer program; program | wc -l
- mas o programa leva pelo menos um minuto para ser executado, então não quero fazer isso mais de uma vez apenas para mostrar uma contagem de linhas na parte inferior.
EDITAR:
- Existe uma maneira de mostrar a saída como ela acontece (linha por linha) e depois retornar uma contagem no final?
bash
shell
debian
command-line
Libbux
fonte
fonte
STDOUT_WRITE_COUNT
), ou faça logon em um arquivo / API, no final do programa. WDYT?Respostas:
Você pode usar
tee
para dividir o fluxo de saída enviando uma cópia parawc
e a outra cópia para STDOUT normalmente.A
>(cmd)
sintaxe é bash, o que significa executarcmd
e substituir o>(cmd)
bit pelo caminho para (um pipe nomeado conectado) ao STDIN desse programa.fonte
>(cmd)
éksh
também a sintaxe reconhecida porzsh
ebash
e só está usando pipes nomeados em sistemas que não possuem/dev/fd/n
.bash
invenção, pois o texto da sua resposta poderia permitir que alguém acreditasse.sed
e comoawk
são apenas um. Mastee
ewc
são ambos extremamente pequenos (muito menores quesed
eawk
).sed
eawk
métodos. (Idd
d 100MB de/dev/urandom
para um arquivo e, em seguida, correu esse arquivo através de cada método várias vezes)Uma opção é usar o awk, que pode fazer a contagem e imprimir no stdout.
In
awk
, NR é o número da linha atual. Você pode fazer o mesmo com o perl:Ou
sed
:fonte
Você pode clonar stdout no stderr.
Dessa forma,
program
o stdout do canal é canalizado paratee
ser gravado no stderr, que é impresso no console.tee
também grava os dados canalizados para ele em seu stdout, que é canalizadowc
.fonte
minha opção favorita:
fonte
fonte
Isso pode ser tarde. Mas gostaria de responder à sua pergunta de acompanhamento sobre como capturar o número contado em uma variável.
Isto é o que você quer
YOUR_VAR=$(PROGRAM | tee /dev/stderr | wc -l)
.Aproveitamos a
tee
geração de dois fluxos aqui e direcionamos um para/dev/stderr
, o qual apareceria na tela, e o outro parawc -l
, que reportaria o número de linhas.fonte