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 \r
lugar de un \n
al final de la línea.
cat
producción de tuberíaswc
tambié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 -f
mano en shell:(tenga en cuenta que se ejecuta hasta uno
wc
y unsleep
comando por segundo que no todos los shells han incorporado. Conksh93
whilesleep
está incorporado, para obtener un incorporadowc
(al menos en Debian), debe agregar/opt/ast/bin
al 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 | awk
solución. Conozca sus opciones:-n +0
no 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}'
awk
es un superconjunto degrep
.tail -n +0 -f file | awk '/mystring/ {printf "\r%lu", ++n}'
END{print ""}
paraawk
imprimir una nueva línea al final.Intenta contarlo con puro
bash
sinwc
: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 -l
lo hace en la solución de la envoltura sugerí), no los registros devueltos por<$fh>
. No creo que necesites usartell
oseek
nada.<$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, siperl
está 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$count
se 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