Estoy tratando de contar el número de líneas de salida que produce un determinado programa. El problema es que el programa tarda mucho en ejecutarse y quiero mostrar el resultado al usuario. ¿Hay alguna manera de contar el número de líneas que emitió el último comando?
Podría hacerlo, program | wc -lpero eso no mostraría el resultado al usuario. Por lo que sé, tengo que hacerlo program; program | wc -l, pero el programa tarda al menos un minuto en ejecutarse, por lo que no quiero tener que hacerlo más de una vez solo para mostrar un recuento de líneas en la parte inferior.
EDITAR:
- ¿Hay alguna forma de mostrar el resultado tal como sucede (línea por línea) y luego devolver un conteo al final?
bash
shell
debian
command-line
Libbux
fuente
fuente

STDOUT_WRITE_COUNT), o lo registre en un archivo / API, al final del programa. WDYT?Respuestas:
Puede usar
teepara dividir el flujo de salida enviando una copiawcy la otra copia a STDOUT como de costumbre.La
>(cmd)sintaxis es bash, lo que significa ejecutarcmdy reemplazar el>(cmd)bit con la ruta a (una tubería con nombre conectada a) el STDIN de ese programa.fuente
>(cmd)estakshsintaxis también es reconocida porzshybashy solo usa canalizaciones con nombre en sistemas que no tienen/dev/fd/n.bashinvención, ya que la redacción de su respuesta podía dejarle creer.sedyawkson solo uno. Peroteeywcson extremadamente pequeños (mucho más pequeños quesedyawk).sedyawk. (Le didd100mb/dev/urandoma un archivo y luego ejecuté ese archivo a través de cada método varias veces)Una opción es usar awk, que puede contar e imprimir en stdout.
En
awk, NR es el número de línea actual. Puedes lograr lo mismo con perl:O
sed:fuente
Puede clonar stdout en stderr.
De esa manera,
programel stdout se canaliza parateeescribirse en stderr, que está impreso en la consola.teetambién escribe los datos canalizados a él en su stdout, que se canaliza awc.fuente
mi opción favorita:
fuente
fuente
Esto puede llegar tarde. Pero solo abordaría su pregunta de seguimiento sobre cómo atrapar el número contado en una variable.
Esto es lo que quieres
YOUR_VAR=$(PROGRAM | tee /dev/stderr | wc -l).Aprovechamos la
teegeneración de dos secuencias aquí y dirigimos una a/dev/stderr, que aparecería en su pantalla, y la otra awc -l, que informaría el número de líneas.fuente