Wie kann ich die gesamte Datei anzeigen und warten, bis der Datei weitere Daten hinzugefügt wurden?

21

Ich möchte die gesamte Datei lesen und auf die Eingabe warten lassen, genau wie tail -f aber mit der vollständigen angezeigten Datei.

Die Länge dieser Datei ändert sich immer, da es sich um eine .logDatei handelt.

Wie kann ich das machen, wenn ich die Länge der Datei nicht kenne?

Malworm
quelle
2
Sie wissen bereits, dass der Schwanz nah an dem ist, was Sie wollen. Hast du die Manpage dafür gelesen?
njzk2
1
lesshat die "F" -Taste. Nützlich, wenn Sie Interaktion benötigen.
Thorbjørn Ravn Andersen

Antworten:

33

tailkönnen Sie hinzufügen -n, um die Anzahl der Zeilen festzulegen, die ab dem Ende angezeigt werden sollen und die in Verbindung mit verwendet werden können -f. Wenn das Argument für -nbeginnt mit +, ist dies die Anzahl der Zeilen von Anfang an ( 0und die 1Anzeige der gesamten Datei, 2wobei angezeigt wird , dass die erste Zeile übersprungen wird, wie durch @Ben angegeben). Also mach einfach:

tail -f -n +0 filename

Wenn Ihre Log - Dateien gedreht, können Sie hinzufügen --retry(oder kombinieren -f and --retryin -Fals @Hagen vorgeschlagen)

Beachten Sie auch, dass Sie in einem Grafikterminal mit der Maus und PageUp/ oder PageDownzum Zurückblättern in den Verlauf (vorausgesetzt, Ihr Puffer ist groß genug) diese Informationen beibehalten können, auch wenn Sie Ctrl+ Czum Beenden verwenden tail. Wenn Sie lessdies verwenden, ist es weitaus unbequemer und AFAIK müssen Sie die Tastatur zum Scrollen verwenden, und ich kenne keine Mittel, um zu verhindern, dass lessTermcap deinitialisiert wird, wenn Sie vergessen, damit zu beginnen -X.

Anthon
quelle
1
+1 Deine Antwort erschien, sobald ich meine gepostet habe und obwohl meine funktioniert, ist deine besser.
Julie Pelletier
1
Ich habe die Nachricht erhalten, als ich noch schrieb, dass eine andere Antwort vorhanden ist und ich zum Aktualisieren klicken sollte. Ihre Antwort würde die Arbeit erledigen, aber ich wäre nicht überrascht, dass das Zählen von Anfang an (mit dem erzwungen +) effizienter implementiert wird.
Anthon
1
+1dafür, dass du mir etwas beigebracht hast +0. Vielleicht möchten Sie -Fstatt -ffür rotierende Logfiles
Hagen von Eitzen
Ich glaube, hier ist ein Einzelgänger. tail -n +1zeigt mir den Dateianfang und tail -n +2überspringt eine Zeile. Ich denke, die Nummer ist die Zeilennummer der ersten angezeigten Zeile.
Ben Millwood
1
@Anthon danke! Genau das brauche ich!
Malworm
37

Es gibt einen besseren Weg, dies zu erreichen:

less +F <file>

Es zeigt Ihnen die gesamte Datei, hat die volle Leistung lessund wartet auf neue Eingaben. Wenn Sie nicht mehr auf Eingaben warten und einen bestimmten Teil lesen möchten, können Sie ihn mit beenden ^Cund mit fortsetzen F.

Der FBefehl ist immer in verfügbar less. Wenn Sie beim Öffnen einer Datei auf Änderungen lessachten, Fwird er durch Drücken von aktiviert. Vielen Dank an hiergiltdiestfu und wildcard für den Hinweis.

Leandros
quelle
2
Das ist in der Tat viel besser als tail. Danke für den Tipp; Daran hätte ich nie gedacht less. Hinweis für andere: Sie können auch einfach ausführen less <file>und dann eingeben F.
Wildcard
3

Zusätzlich zu / u / Anthons Antwort können Sie Folgendes tun:

{ cat filename; tail -0f filename; }

Diese -0Option zum -n 0Beenden entspricht , was bedeutet: 0 Zeilen anzeigen. Aber die -fwerden neue Zeilen anzeigen.

Du brauchst keine Zahnspange { }. Ich habe sie verwendet, weil Sie manchmal die Filedeskriptoren auf irgendeine Weise umleiten möchten. Zum Beispiel:

{ cat ; tail -0f -; } < /var/log/messages

Bemerkung von Ben Milwood: Sie könnten einen Rennzustand haben, in dem die Datei zwischen dem Ende des catVorgangs und dem Beginn des tailVorgangs wächst . Aber auch dies ist ein "akademisches" Problem für eine akademische Lösung.

Otheus
quelle
3
Wenn die Datei zwischen dem catEnde und dem tailBeginn wächst , werden diese Zeilen nicht angezeigt. Es ist unwahrscheinlich, dass es sich um eine große Sache handelt, aber ein Grund, die reine tailLösung zu bevorzugen .
Ben Millwood
Ich denke { cat; tail -n +0 -f; } < file, das Rennen könnte repariert werden, da der Schweif alle neuen Daten druckt, die zwischen catdem Beenden und taildem Starten von angezeigt werden . Natürlich macht es das catüberflüssig. Die Umleitung findet nur einmal statt, und tailstdin ist der Dateideskriptor, der catbereits an EOF ausgelesen wurde, sodass die aktuelle Position dort ist, wo sie catgestoppt wurde. Sie können es testen, indem Sie einen echo foo >> filein das einfügen {}, um das Rennen jedes Mal zu erstellen.
Peter Cordes
2

watch Befehl sollte das für Sie tun.

Sie können es auch versuchen

less +FG 

Sie haben mehr Optionen mit dem lessBefehl, um durch Ihre Datei zu scrollen, da Sie sagen, dass es sich um eine große Datei handelt.

RajuBhai
quelle
Less folgt auch keiner wachsenden Datei.
Shadur
7
@ Shadur, es tut, das ist, was die +FOption ist für
Glenn Jackman