¿Existe un comando Unix / Linux para contar líneas por segundo desde stdin?

22

Estoy tratando de contar el número de consultas SQL por segundo desde un archivo de registro y quiero hacerlo en tiempo real canalizando stdout desde grep a algún comando. (Estoy haciendo algunas pruebas de rendimiento)

Podría escribirlo yo mismo, pero pensé con seguridad que esto existiría.

Miré wc pero no vi una opción para permitir esto.

También podría usarlo para contar las solicitudes por segundo al extraer una cola del registro de acceso.

digidigo
fuente
Estoy buscando algo más útil en general que a lo que se refiere esa pregunta.
digidigo

Respuestas:

2
watch -n 3 "wc -l logfile"

página man

watch: ejecuta un programa periódicamente, mostrando la salida a pantalla completa Por defecto, el programa se ejecuta cada 2 segundos; use -n o --interval para especificar un intervalo diferente.

Nim
fuente
45

pves tu comando! P ipe V iewer imprime estadísticas sobre los datos que pasan a través de él y puede ejecutarse en cualquier lugar de su canalización, ya que canaliza stdin directamente hacia stdout. Por ejemplo:

tail -f /var/log/nginx/access.log | pv --line-mode --rate > /dev/null

El pvcomando imprime para stderr el número actual de líneas por segundo (el valor predeterminado es bytes por segundo), lo que, para esta fuente de datos en particular (el archivo de registro predeterminado de Nginx), equivale a las solicitudes web entrantes por segundo. Solo me importan los recuentos, así que me conecto con stdout /dev/null. También hay opciones como:

  • -b (número total de líneas),
  • --average-rate (tasa promedio desde el inicio), y
  • --timer (rastrea cuánto tiempo ha estado funcionando la tubería).

Si no lo dice --line-mode, contará bytes, lo que probablemente no sea lo que desea para los registros del servidor, pero podría ser útil en otros lugares.

Nota final: ... | pv -lb > file.txtes muy similar ... | tee file.txt | awk '{printf "\r%lu", NR}', lo que también es útil para contar líneas, pero la pvllamada es mucho más corta, aunque el resultado no es tan emocionante: las pvactualizaciones se realizan cada segundo por defecto, mientras que ese awkcomando se actualiza continuamente.

marrón
fuente
¿Es posible obtener solo un valor de pv? Necesito un valor promedio para el período de tiempo para fines de monitoreo. Entonces necesito asignar valor a la variable.
Sonique
@Sonique es un error, ya que no pves para lo que está diseñado (lo alcanzaría awksi fuera tú), pero por supuesto que es posible. Supongamos que twilight stream --timeout 5es un comando que muestreará desde el spritzer de Twitter durante 5 segundos y luego se cerrará:, RATE="$(twilight stream --timeout 5 | pv --line-mode --rate --force 2>&1 1>/dev/null | tr -s '\r\n' '\n' | tail -1)"luego echo $RATEproduce algo como "[40.8 / s]" (tenga en cuenta la --forcebandera adicional , ya que pvs stderrya no es un TTY).
chbrown
No parece funcionar de manera confiable para mí para todos los programas; eliminando los > /dev/nullprogramas de que la salida ahora está "bloqueada en bloques" y ya no se transmite sin problemas. ¿Quizás unbuffersea ​​necesario en algunos programas productores para que no cambien a bloquear el búfer de salida cuando detectan que están siendo canalizados?
nh2
13

Tal vez deberías intentarlo logtop?

tail -f foobar.log |logtop
klocek
fuente
¿Es este el registro superior al que te refieres? github.com/JulienPalard/logtop
digidigo
Sí, si está utilizando Debian, hay un paquete en el repositorio packages.debian.org/wheezy/logtop
klocek
dang Creo que esto es lo que necesito, pero no pude conseguir que se compilara en CentOs
digidigo 02 de
1
watch -n 5 "mysqladmin status | awk -F'  ' '{ print \$NF }'"
quanta
fuente
No pude hacer que esto funcione. ¿Estás seguro de la sintaxis?
digidigo
¿Qué error obtienes? ¿Ha configurado ~/.my.cnfpara ejecutarse mysqladminsin solicitar contraseña?
quanta