Ich versuche zu sehen, wie oft innerhalb einer beliebigen Zeitspanne auf einem Remote-Server foo bar
angezeigt wird /var/log/foo.log
, aber nichts, was ich bisher ausprobiert habe, hat funktioniert.
Ich habe bereits ein Timer-Skript, mit dem ich nachverfolgen kann /var/log/foo.log
, wie lange es her ist, seit ich mit dem Tailing begonnen habe , und jetzt möchte ich nur noch wissen , wie oft die Tailing- foo bar
Ausgabe aufgetreten ist.
Ich habe in Google gesucht, aber in den ersten 10 Ergebnisseiten nichts Passendes gefunden.
Folgendes habe ich mit frustrierenden Ergebnissen versucht:
## works on local machine, but doesn't work as expected on remote
tail -f /var/log/foo.log | grep foo\ bar | sed '='
## works on local, but not remote
tail -f /var/log/foo.log | grep foo\ bar | cat -n -
## works on local, but not remote
tail -f /var/log/foo.log | grep foo\ bar | awk -F'\n' '{printf "[%d]> ", NR; print $1}'
Ich habe sogar versucht, ein Sed-Skript zu schreiben, das sich so verhält tail -f
, aber ich habe damit fast keine Fortschritte gemacht.
HINWEIS
der Remote - Server ist eine ältere Version von coreutils ausgeführt wird , und Modernisierung ist eine Option, aber ist nicht in irgendeiner Weise die gewünschte Lösung.
quelle
--line-buffered
Option zugrep
. Odertail -f ... | awk '/foo bar/{print ++n, $0}'
tail -f /var/log/log.log | awk '{ printf "[%d]> %s\n", NR+1 ,$0; fflush(stdout); }'
Antworten:
funktioniert bei mir und ist das erste, woran ich gedacht habe - das heißt, wenn Sie wirklich wollen, dass die Zeilen von 1 nummeriert werden und nicht mit der tatsächlichen Zeilennummer aus der Datei überwacht werden. Fügen Sie diese
grep
gegebenenfalls an der entsprechenden Stelle hinzu (entweder vorher oder nachhernl
). Denken Sie jedoch daran, dass möglicherweise eine Pufferung auftritt. In meinem speziellen Fallgrep
hat die--line-buffered
Option, abernl
puffert seine Ausgabe und hat keine Option, um das auszuschalten. Dahertail | nl | grep
fließt die Combo nicht wirklich gut.Das gesagt,
funktioniert auch bei mir Die Nummerierung beginnt wieder am Anfang des "Tailings" und nicht am Anfang der gesamten Protokolldatei.
quelle
-n
Option.--line-number
:tail -f /var/log/foo.log | grep foo\ bar --line-number
funktioniert!Ich denke das ist besser ..
quelle
Sie können die Ausgabe auch an leiten
less
. Sie verfügt über eine Zeilennummernfunktion, mit-N
der Sie im Protokoll vor- und zurückblättern können.Beispiel
HINWEIS: Beachten Sie die Ausgabe. Möglicherweise gefällt Ihnen diese Funktion nicht, es werden jedoch lange Zeilen benötigt, um sie zu zerschneiden, sodass sie in der nächsten Zeile fortgesetzt werden, wobei jedoch die entsprechende Zeilennummer beibehalten wird. Ich finde diese Funktion von unschätzbarem Wert beim Parsen von Protokolldateien, die breit sind! Sie können den Effekt dieser Funktion in den Zeilen 6 und 8 sehen .
quelle
tail
. Bei den langen Zeilen wird dieses Verhalten innerhalb vonless
using umgeschaltet-S
.Um neue Zeilen nur in der Protokolldatei zu erfassen, wie sie mit ihrer Zeilennummer geliefert werden, können Sie Folgendes tun:
(Mit
mawk
möchten Sie die-Winteractive
Option hinzufügen , um die Eingabepufferung (!) zu verhindern ).wc -l
Liest die Zeilen , die schon da waren und zählt sie (die Zeilenumbrüche, was bedeutet, dass es immer noch funktioniert, auch wenn die letzte Zeile noch nicht voll ist), und dann geben wirtail -f
den Rest (beginnend mit demwc
Aufhören des Lesens) an und gebenawk
die Zeilennummer an der erste, den es sieht.quelle
l
des Variablennamens ließ mich die Augen auf $ 1 blinzeln und dachte, es sei$1
^^ (aber da ich Sie kenne (und zu 100% vertraue), habe ich die Wahrheit noch einmal gelesen und gesehen). Nur aus Neugier: Um eine "Race Condition" zwischen demwc -l
und dem zu vermeidentail -f
(wenn die Datei schnell wächst, kann man einige Zeilen verwerfen und die NR beginnt mit der falschen Nummer),$l
können stattdessen Zeilen übersprungen werden? (und welche Grenze gibt es-n
in posix & in gnu zum Schwanz ?). Vielleicht mit einer temporären Zwischendatei?tail -n +1
(liest irgendetwas von der Startposition) spricht die Bedenken bezüglich der Rennbedingungen an. Die Zeilen, die sich zum Zeitpunkt derwc -l
Beendigung nicht in der Datei befanden , werden von der exakten Position gelesen, an der sie sich befandenwc
. Somit hat NR die richtige Position, unabhängig davon, wie viele Zeilen zwischenwc
Ende undtail
Anfang geschrieben wurden. Wenn Sie aufgefordert werdentail
, von einer Position relativ zum Ende der Datei zu beginnen, treten Probleme auf.tail -n +1
), für reguläre Dateien haben die meisten Implementierungen keine, da sie vom Ende undseek
zurück beginnen können, bis sie die n-te Zeile finden, ohne mehr als einen Buf-Wert speichern zu müssen von Daten im Speicher. Bei nicht suchbaren Eingaben können Sie an Grenzen stoßen. Für POSIX müssen Implementierungen in der Lage sein, mindestens 10 x LINE_MAX-Bytes zu speichern (LINE_MAX muss mindestens 2048 sein). GNU Tail hat keine andere Grenze als Speicher AFAIKWenn Sie von Anfang an nummerieren möchten, müssen Sie grep -n auf alle Zeilen anwenden.
Wenn Sie dann nur die letzten 10 anzeigen wollten, hätte ich gedacht, Sie könnten die Datei erneut anpassen:
Der erste ist praktisch, zeigt aber zu viel Leistung. Ich weiß nicht, warum der zweite nicht funktioniert.
quelle
tail -n +1 -f
von Anfang an beschatten.tail
Person erst dann etwas ausgeben kann, wenn sie die letzte Zeile ihrer Eingabe gesehen hat (wie würde sie wissen, welche die zehntletzte Zeile ist?), Was niemals passieren wird, datail -f
niemals aufhört.Der Befehl
cat -n [filename] | tail
wird eine schnelle Zählung und Anzeige der neuesten Datensätze erhalten, wenn Sie danach suchen.Das
-f
Schalter hält ihn bis zum Escape-Vorgang an - was in Ihrem Szenario wirklich nicht zutreffend oder redundant klingt.wc -l [filename]
wird eine Zählung der Linien im Ziel erhaltenwc -l [filenameprefix]*
zählt alle Zeilen in allen Dateien, die mit dem Muster übereinstimmen, und gibt am Ende sogar eine Gesamtsumme aus.Vollständigeres Detail kann zu vollständigeren Antworten führen.
quelle
Es ist das Argument
n
oder--lines
(wird etwas anders verwendet, siehe unten):Siehe auch die Hilfe:
quelle