¿Cómo mostrar el número de líneas generadas por un comando en tiempo real?

¿Cómo mostrar el número de líneas generadas por un comando en tiempo real?

Lo estoy usando svn exportcomo parte de un script de empaquetado para mi aplicación y parece que este comando, como muchos otros, no tiene ningún tipo de barra de progreso.

Tengo dos opciones en este momento:

  • usarlo sin opciones y verlo imprimir miles de líneas
  • usando --quiety no ver nada hasta que se complete.

¿Hay alguna manera de mostrar al menos el número de líneas generadas por el comando, en tiempo real? Como:

Exporting SVN directory ... 1234 files

Y mira este número1234 incremento en tiempo real? Me imagino canalizando la salida a un comando que haría precisamente esto, pero ¿cuál?

Respuesta1

yourcommand | { I=0; while read; do printf "$((++I))\r"; done; echo ""; }

O coloque la sección entre corchetes en un script de shell. Tenga en cuenta que esto sólo funciona si su shell realmente admite el operador de preincremento, como bash, ksh93 o zsh. De lo contrario, tendrá que incrementarlo $Iy luego imprimirlo (como en I=$((I+1));printf...). Además, si printfno es una función incorporada en su shell (es una función incorporada en bash actual), puede usar echo -neo print -nen su lugar para obtener un mejor rendimiento. Solo desea suprimir la nueva línea y que \r se interprete como un carácter de escape.

Respuesta2

Esta es una idea aproximada, pero puede usar el pvcomando para contar el número de líneas a medida que pasan y mostrarlas en la pantalla. pventre sus muchos interruptores tiene un -linterruptor que cuenta cada línea a medida que pasa.

Ejemplo

Aquí estoy usando un bucle while para simular algunos archivos de tu salida SVN.

$ for i in $(seq 100); do echo "file$i"; sleep 2; done | pv -l -c >/dev/null
   3 0:00:05 [0.99/s ] [      <=>             

Seguirá sobrescribiendo la línea de salida de esta manera:

  18 0:00:36 [   0/s ] [                                     <=>                                                                  ]

  24 0:00:47 [0.991/s ] [                                                <=>                                                      ]

Respuesta3

Puede ejecutar su comando en segundo plano como un trabajo y redirigir su salida estándar (y stderr opcionalmente) a un archivo de registro: command > logfile &donde &designa el trabajo (si también es stderr, diga &>en lugar de >).

Luego puede usar la utilidad wordcount para contar el número de líneas en su archivo de registro con wc -l.

Para mostrar el cambio de estado en una línea que cambia dinámicamente, puede usar algo como while true; do echo -en '\r'; wc -l logfile; sleep 1; done, pero no puedo forzar a bash a dibujar \run retorno de carro para eliminar el contenido de la línea anterior.

Vea esta pregunta, es casi un duplicado:https://stackoverflow.com/questions/2388090/how-to-delete-and-replace-last-line-in-the-terminal-using-bash

información relacionada