Gibt es einen Unix / Linux-Befehl, um Zeilen pro Sekunde von stdin zu zählen?


22

Ich versuche, die Anzahl der SQL-Abfragen pro Sekunde aus einer Protokolldatei zu ermitteln, und ich möchte dies in Echtzeit tun, indem ich stdout von grep in einen Befehl weiterleite. (Ich mache einige Leistungstests)

Ich könnte es selbst schreiben, dachte aber, dass es das geben würde.

Ich schaute auf wc, sah aber keine Option, um dies zu ermöglichen.

Ich könnte es auch verwenden, um Anforderungen pro Sekunde zu zählen, indem ich einen Schwanz aus dem Zugriffsprotokoll leite.



Ich suche etwas allgemeines Nützliches, auf das sich diese Frage bezieht.
Digidigo

Antworten:


2
watch -n 3 "wc -l logfile"

Manpage

watch - führt ein Programm in regelmäßigen Abständen aus und zeigt die Ausgabe im Vollbildmodus an. Standardmäßig wird das Programm alle 2 Sekunden ausgeführt. Verwenden Sie -n oder --interval, um ein anderes Intervall anzugeben.


45

pvist dein Befehl! P ipe V iewer drucken Statistiken über die Daten durchqueren, und können überall in Ihrer Pipeline laufen, da es Leitungen direkt über zu stdout stdin. Beispielsweise:

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

Der pvBefehl gibt die aktuelle Anzahl von Zeilen pro Sekunde aus (der Standardwert ist Bytes pro Sekunde), was für diese bestimmte Datenquelle (Nginxs Standardprotokolldatei) eingehenden Webanforderungen pro Sekunde entspricht. Ich kümmere mich nur um die Zählungen, also pfeife ich stdout hinein /dev/null. Es gibt auch Optionen wie:

  • -b (Gesamtzahl der Zeilen),
  • --average-rate (Durchschnittskurs seit Beginn) und
  • --timer (Verfolgt, wie lange die Pfeife gefahren ist).

Wenn Sie das nicht sagen --line-mode, werden die Bytes gezählt. Dies ist wahrscheinlich nicht das, was Sie für Serverprotokolle wünschen, könnte aber an anderer Stelle nützlich sein.

Letzte Anmerkung: ... | pv -lb > file.txtist ähnlich ... | tee file.txt | awk '{printf "\r%lu", NR}', was auch zum Zählen von Zeilen nützlich ist, aber der pvAufruf ist viel kürzer, obwohl die Ausgabe nicht ganz so aufregend ist - pvwird standardmäßig jede Sekunde aktualisiert, während dieser awkBefehl kontinuierlich aktualisiert wird.


Ist es möglich, nur einen Wert aus pv zu erhalten? Ich benötige einen Durchschnittswert für den Zeitraum zu Überwachungszwecken. Also muss ich der Variablen einen Wert zuweisen.
Sonique

@ Sonique Es ist ein Trick, da es nicht das pvist, wofür gebaut wurde (ich würde danach greifen, awkwenn ich du wäre), aber natürlich ist es möglich. Angenommen twilight stream --timeout 5ist ein Befehl, der für 5 Sekunden aus der Twitter Schorle wird probieren und beenden: RATE="$(twilight stream --timeout 5 | pv --line-mode --rate --force 2>&1 1>/dev/null | tr -s '\r\n' '\n' | tail -1)", dann echo $RATEerzeugt so etwas wie „[40,8 / s]“ ( man beachte die zusätzliche --forceFlagge, da pvist stderrnicht mehr ein TTY ist).
Chbrown

Scheint nicht bei allen Programmen zuverlässig zu funktionieren; Entfernen der > /dev/nullShows, dass die Ausgabe jetzt "blockiert" ist und nicht mehr reibungslos streamt. Vielleicht unbufferist es bei einigen produzierenden Programmen erforderlich, dass sie nicht auf Block-Ausgabepufferung umschalten, wenn sie erkennen, dass sie weitergeleitet werden?
nh2


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

Ich konnte das nicht zum Laufen bringen. Sind Sie sich bezüglich der Syntax sicher?
Digidigo

Welchen Fehler bekommst du? Wurde ~/.my.cnfdie Ausführung mysqladminohne Aufforderung zur Kennworteingabe konfiguriert ?
Quanten
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.