Esiste un comando Unix / Linux per contare le righe al secondo da stdin?


22

Sto provando a contare il numero di query SQL al secondo da un file di registro e voglio farlo in tempo reale reindirizzando stdout da grep in alcuni comandi. (Sto facendo alcuni test delle prestazioni)

Potrei scriverlo da solo, ma ho pensato che sarebbe esistito.

Ho guardato wc ma non ho visto un'opzione per consentire questo.

Potrei anche usarlo per contare le richieste al secondo eseguendo il piping di una coda dal registro di accesso.



Sto cercando qualcosa di più utile in generale a cui si riferisca quella domanda.
digidigo,

Risposte:


2
watch -n 3 "wc -l logfile"

pagina man

watch - esegue periodicamente un programma, mostrando l'output a schermo intero Per impostazione predefinita, il programma viene eseguito ogni 2 secondi; usare -n o --interval per specificare un intervallo diverso.


45

pvè il tuo comando! P ipe V del visualizzatore stampe statistiche circa i dati che lo attraversa, e può essere eseguito in qualsiasi punto della tubazione, dal momento che le tubazioni stdin direttamente verso stdout. Per esempio:

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

Il pvcomando stampa su stderr il numero corrente di righe al secondo (il valore predefinito è byte al secondo), che, per questa particolare origine dati (file di registro predefinito di Nginx), equivale alle richieste Web in entrata al secondo. Mi importa solo dei conteggi, quindi installo stdout /dev/null. Ci sono anche opzioni come:

  • -b (numero totale di righe),
  • --average-rate (tasso medio dall'inizio) e
  • --timer (tiene traccia della durata del tubo).

Se non lo dici --line-mode, conterà i byte, che probabilmente non è quello che desideri per i log del server, ma potrebbe essere utile altrove.

Nota finale: ... | pv -lb > file.txtè molto simile ... | tee file.txt | awk '{printf "\r%lu", NR}', utile anche per il conteggio delle linee, ma la pvchiamata è molto più breve, anche se l'output non è altrettanto entusiasmante: si pvaggiorna ogni secondo per impostazione predefinita, mentre quel awkcomando si aggiorna continuamente.


È possibile ottenere un solo valore da PV? Ho bisogno di un valore medio per un periodo di tempo a scopo di monitoraggio. Quindi devo assegnare un valore alla variabile.
Sonique,

@Sonique è un kludge, dal momento che non pvè quello per cui è costruito (lo raggiungerei awkse fossi in te), ma ovviamente è possibile. Supponiamo che twilight stream --timeout 5è un comando che campionare dal spritz Twitter per 5 secondi e quindi chiudere: RATE="$(twilight stream --timeout 5 | pv --line-mode --rate --force 2>&1 1>/dev/null | tr -s '\r\n' '\n' | tail -1)", quindi echo $RATEproduce qualcosa come "[40,8 / s]" (notare l'ulteriore --forcebandiera, dal momento che pv's stderrnon è più un TTY).
chbrown,

Non sembra funzionare in modo affidabile per me per tutti i programmi; la rimozione di > /dev/nullmostra che l'output è ora "blocco in blocco" e non scorre più senza problemi. Forse unbufferè necessario su alcuni programmi di produzione in modo che non passino al blocco del buffering di output quando rilevano che sono in fase di piping?
nh2


1
watch -n 5 "mysqladmin status | awk -F'  ' '{ print \$NF }'"

Non sono riuscito a farlo funzionare. Sei sicuro della sintassi?
digidigo,

Quale errore ricevi? Hai configurato ~/.my.cnfper l'esecuzione mysqladminsenza richiedere la password?
quantità
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.