Existe-t-il une commande Unix / Linux pour compter les lignes par seconde depuis stdin?


22

J'essaie de compter le nombre de requêtes SQL par seconde à partir d'un fichier journal et je veux le faire en temps réel en redirigeant stdout de grep vers une commande. (Je fais des tests de performances)

Je pourrais l'écrire moi-même, mais je pensais que cela existerait.

J'ai regardé wc mais je n'ai pas vu d'option permettant cela.

Je pourrais également l'utiliser pour compter les demandes par seconde en canalisant une queue à partir du journal d'accès.



Je cherche quelque chose de plus généralement utile que ce à quoi cette question se réfère.
digidigo

Réponses:


2
watch -n 3 "wc -l logfile"

page de manuel

watch - exécute un programme périodiquement, affichant la sortie en plein écran Par défaut, le programme est exécuté toutes les 2 secondes; utilisez -n ou --interval pour spécifier un intervalle différent.


45

pvest votre commande! P ipe V iewer imprime des statistiques sur les données qui le traversent et peut s'exécuter n'importe où dans votre pipeline, car il redirige stdin directement vers stdout. Par exemple:

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

La pvcommande imprime sur stderr le nombre actuel de lignes par seconde (la valeur par défaut est octets par seconde), ce qui, pour cette source de données particulière (fichier journal par défaut de Nginx), équivaut aux requêtes Web entrantes par seconde. Je ne me soucie que des comptes, alors je fais passer la sortie /dev/null. Il existe également des options telles que:

  • -b (nombre total de lignes),
  • --average-rate (taux moyen depuis le début), et
  • --timer (suit depuis combien de temps le tuyau passe).

Si vous ne le dites pas --line-mode, il comptera les octets, ce qui n'est probablement pas ce que vous voulez pour les journaux du serveur, mais pourrait être utile ailleurs.

Remarque finale: ... | pv -lb > file.txtressemble beaucoup à ... | tee file.txt | awk '{printf "\r%lu", NR}', ce qui est également pratique pour compter les lignes, mais l' pvappel est beaucoup plus court, bien que la sortie ne soit pas aussi excitante - se pvmet à jour toutes les secondes par défaut, tandis que cette awkcommande est mise à jour en continu.


Est-il possible d'obtenir une seule valeur de pv? J'ai besoin d'une valeur moyenne pour la période de temps à des fins de surveillance. J'ai donc besoin d'attribuer une valeur à la variable.
Sonique

@Sonique, c'est un coup de foudre, car ce n'est pas ce pvpour quoi je serais (j'atteindrais awksi j'étais vous), mais bien sûr c'est possible. Supposons qu'il s'agisse d' twilight stream --timeout 5une commande qui échantillonnera à partir du spritzer Twitter pendant 5 secondes, puis quittera:, RATE="$(twilight stream --timeout 5 | pv --line-mode --rate --force 2>&1 1>/dev/null | tr -s '\r\n' '\n' | tail -1)"puis echo $RATEproduira quelque chose comme "[40.8 / s]" (notez l' --forceindicateur supplémentaire , car pv's stderrn'est plus un ATS).
chbrown

Ne semble pas fonctionner de manière fiable pour moi pour tous les programmes; la suppression de la > /dev/nullmontre que la sortie est désormais "bloc fragmenté" et ne diffuse plus en douceur. Peut unbuffer- être est-il nécessaire sur certains programmes de production pour qu'ils ne basculent pas sur la mise en mémoire tampon de sortie lorsqu'ils détectent qu'ils sont canalisés?
nh2


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

Je n'ai pas pu faire fonctionner ça. Vous êtes sûr de la syntaxe?
digidigo

Quelle erreur obtenez-vous? Avez-vous configuré ~/.my.cnfpour exécuter mysqladminsans demander de mot de passe?
quanta
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.