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 -l
pero 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
tee
para dividir el flujo de salida enviando una copiawc
y la otra copia a STDOUT como de costumbre.La
>(cmd)
sintaxis es bash, lo que significa ejecutarcmd
y reemplazar el>(cmd)
bit con la ruta a (una tubería con nombre conectada a) el STDIN de ese programa.fuente
>(cmd)
estaksh
sintaxis también es reconocida porzsh
ybash
y solo usa canalizaciones con nombre en sistemas que no tienen/dev/fd/n
.bash
invención, ya que la redacción de su respuesta podía dejarle creer.sed
yawk
son solo uno. Perotee
ywc
son extremadamente pequeños (mucho más pequeños quesed
yawk
).sed
yawk
. (Le didd
100mb/dev/urandom
a 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,
program
el stdout se canaliza paratee
escribirse en stderr, que está impreso en la consola.tee
tambié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
tee
generació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