bash – ¿Cómo hacer un 'wc -l' continuo con gnu texttools?

Pregunta:

Yo se por supuesto que

cat logfile.txt | wc -l
120

me dirá el número de líneas en un archivo.

Mientras que

tail -f logfile.txt

me mostrará las nuevas líneas que otro programa escribe en logfile.txt .

¿Es posible combinar ambos para obtener un recuento de líneas de actualización continua de logfile.txt con utilidades de texto estándar?

Yo se acerca de

watch wc -l logfile.txt

pero no quiero volver a contar todo el archivo cada vez, eso parece ser un desperdicio. Uno necesitaría un recuento solo adjunto cada segundo más o menos y probablemente una \r lugar de una \n al final de la línea.

Respuesta:

Quizás:

tail -n +1 -f file | awk '{printf "\r%lu", NR}'

Tenga en cuenta que generará un número por cada línea de entrada (aunque anula el valor anterior si se envía a una terminal).

O puede implementar la tail -f a mano en shell:

n=0
while :; do 
  n=$(($n + $(wc -l)))
  printf '\r%s' "$n"
  sleep 1
done < file

(tenga en cuenta que se ejecuta hasta un wc y un comando de sleep por segundo que no todos los shells han incorporado. Con ksh93 mientras que la sleep está integrada, para obtener un wc integrado (al menos en Debian), debe agregar /opt/ast/bin al principio de $PATH (independientemente de si ese directorio existe o no) o use el command /opt/ast/bin/wc (no pregunte …)).

Podría usar pv , como en:

tail -n +1 -f file | pv -bl > /dev/null

Pero tenga en cuenta que agrega k , M … sufijos cuando el número es superior a 1000 (y no parece haber una forma de evitarlo ).

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım