Yo sé por supuesto que
cat logfile.txt | wc -l
120
me dirá el número de líneas en un archivo.
Mientras
tail -f logfile.txt
me mostrará las nuevas líneas en las que escribe otro programa logfile.txt.
¿Es posible combinar ambos para obtener un recuento continuo de líneas de actualización de logfile.txt con utilidades de texto estándar?
Yo sé sobre
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 de solo adjuntos cada segundo más o menos y probablemente un en \rlugar de un \nal final de la línea.

catproducción de tuberíaswctambién es un gran desperdicio!Respuestas:
Tal vez:
Tenga en cuenta que generará un número para cada línea de entrada (aunque anula el valor anterior si se envía a un terminal).
O puede implementarlo a
tail -fmano en shell:(tenga en cuenta que se ejecuta hasta uno
wcy unsleepcomando por segundo que no todos los shells han incorporado. Conksh93whilesleepestá incorporado, para obtener un incorporadowc(al menos en Debian), debe agregar/opt/ast/binal frente$PATH(independientemente de si ese directorio existe o no) o usecommand /opt/ast/bin/wc(no pregunte ...)).Podrías usar
pv, como en: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 ).fuente
tail | awksolución. Conozca sus opciones:-n +0no se me habría ocurrido en esta combinación.pv- Otra herramienta nueva y útil. gracias un montón.tail -n +0 -f <my.log> | grep --line-buffered <mystring> | awk '{printf "\r%lu", NR}'awkes un superconjunto degrep.tail -n +0 -f file | awk '/mystring/ {printf "\r%lu", ++n}'END{print ""}paraawkimprimir una nueva línea al final.Intenta contarlo con puro
bashsinwc:o incluso así para reescribir el valor anterior:
fuente
No creo que haya algo así. Pero debería ser fácil preparar algo como:
(Idea general cunada de
perlfunc(1))fuente
printf foo >> file. Que había necesidad de contar los caracteres de nueva línea (comowc -llo hace en la solución de la envoltura sugerí), no los registros devueltos por<$fh>. No creo que necesites usartelloseeknada.<$fh>lee una línea por defecto, no registra. La página de manual de Perl citada dice que lo haga de esta manera en aras de un entorno posiblemente no cooperativo (podría depender del sistema de archivos, supongo que NFS u otros sistemas de archivos montados en red pueden requerir un poco de insistencia).<$fh>devolverá un registro incluso si no está terminado por un carácter de nueva línea. Entonces, siperlestá sentado al final del archivo, y alguien más tarde hace unprintf foo >> file, entonces<$fh>regresaráfoo(no una línea ya que no termina con un carácter de nueva línea), y$countse incrementará aunque no se haya agregado una línea adicional al archivo.Continuando con la solución basada en awk: es posible que no necesite ver el contador marcando cada línea en su registro; Si ese es el caso, puede tenerlo así (el número cambiaría por cada 10 líneas):
fuente