Der Linux-Befehl `tail` ist ein Werkzeug, das Daten vom Ende einer Datei extrahiert. Er ist in der Lage, Aktualisierungen, die einer Datei hinzugefügt werden, in Echtzeit darzustellen. In diesem Artikel zeigen wir Ihnen, wie Sie ihn effektiv einsetzen können.
Hat systemd die Rolle von tail verändert?
Der Befehl `tail` ermöglicht es, die letzten Zeilen einer Datei einzusehen. Da neue Daten typischerweise am Ende einer Datei ergänzt werden, ist `tail` eine praktische Methode, um die aktuellsten Ergänzungen zu betrachten. Er kann auch eine Datei überwachen und jeden neuen Text, der zu dieser Datei hinzugefügt wird, anzeigen, sobald er erscheint. Dadurch wird er zu einem wichtigen Hilfsmittel bei der Beobachtung von Logdateien.
Viele aktuelle Linux-Distributionen verwenden systemd als System- und Service-Manager. Dies ist der erste Prozess, der ausgeführt wird, er hat die Prozess-ID 1 und ist das übergeordnete Element aller anderen Prozesse. Zuvor wurde diese Aufgabe vom älteren init-System übernommen.
Mit diesem Wandel einhergehend ist ein neues Format für Systemprotokolldateien entstanden. Anstatt im Klartext zu sein, werden diese unter systemd binär aufgezeichnet. Um diese Protokolldateien zu lesen, ist das Dienstprogramm `journalctl` erforderlich. Der Befehl `tail` hingegen arbeitet nur mit Textformaten und kann keine Binärdateien interpretieren. Bedeutet dies, dass `tail` an Bedeutung verloren hat? Hat er noch eine Funktion?
Tatsächlich bietet `tail` mehr als nur Echtzeit-Aktualisierungen. Zudem existieren weiterhin zahlreiche Protokolldateien, die nicht vom System erstellt werden und nach wie vor im Klartextformat geschrieben sind. Beispielsweise haben von Anwendungen erzeugte Protokolldateien ihr Format beibehalten.
Die Verwendung von tail
Übergibt man den Namen einer Datei an `tail`, gibt er die letzten zehn Zeilen dieser Datei aus. Die in diesem Artikel verwendeten Beispieldateien enthalten Listen sortierter Wörter. Jede Zeile ist nummeriert, um die verschiedenen Auswirkungen der Optionen besser nachvollziehen zu können.
tail word-list.txt
Um eine andere Zeilenanzahl auszugeben, verwenden Sie die Option `-n` gefolgt von der gewünschten Anzahl:
tail -n 15 word-list.txt
Es ist auch möglich, die Option `-n` wegzulassen und nur einen Bindestrich `-` mit der Zahl zu verwenden, wobei sichergestellt sein muss, dass keine Leerzeichen dazwischenliegen. Obwohl diese Befehlsform als veraltet gilt, ist sie weiterhin in der man-Seite dokumentiert und funktioniert nach wie vor.
tail -12 word-list.txt
Tail mit mehreren Dateien
Der Befehl `tail` kann auch mit mehreren Dateien gleichzeitig arbeiten. Geben Sie einfach die Dateinamen in der Befehlszeile an:
tail -n 4 list-1.txt list-2.txt list-3.txt
Für jede Datei wird eine kleine Kopfzeile angezeigt, die den Dateinamen kennzeichnet, zu der die angezeigten Zeilen gehören.
Anzeigen von Zeilen vom Anfang einer Datei
Der Modifikator `+` (Zählen vom Start) bewirkt, dass `tail` Zeilen ab einer bestimmten Zeilennummer vom Anfang der Datei anzeigt. Wenn die Datei sehr lang ist, kann dies zu einer großen Ausgabe im Terminalfenster führen. In solchen Fällen ist es ratsam, die Ausgabe von `tail` an das Programm `less` weiterzuleiten.
tail +440 list-1.txt
Auf diese Weise können Sie den Text kontrolliert durchblättern.
Da die Datei 20.445 Zeilen enthält, ist dies dasselbe wie die Verwendung der Option `-6`:
tail +20440 list-1.txt
Verwenden von Bytes mit tail
Sie können `tail` anweisen, Offsets in Bytes statt in Zeilen zu verwenden, indem Sie die Option `-c` (Bytes) nutzen. Dies ist besonders nützlich, wenn Sie eine Textdatei mit Datensätzen fester Größe haben. Beachten Sie, dass ein Zeilenumbruchzeichen als ein Byte zählt. Der folgende Befehl zeigt die letzten 93 Bytes der Datei an:
tail -c 93 list-2.txt
Die Option `-c` (Bytes) kann mit dem Modifikator `+` kombiniert werden, um einen Byte-Offset ab Dateianfang zu definieren:
tail -c +351053 list-e.txt
Pipes mit tail
Wir haben zuvor die Ausgabe von `tail` an `less` weitergeleitet. Es ist auch möglich, die Ausgabe anderer Befehle an `tail` weiterzuleiten.
Um die fünf Dateien oder Verzeichnisse mit den ältesten Änderungszeiten zu finden, verwenden Sie die Option `-t` (Sortieren nach Änderungszeit) mit `ls` und leiten die Ausgabe an `tail` weiter.
ls -tl | tail -5
Der Befehl `head` listet Textzeilen vom Anfang einer Datei auf. Wir können diesen Befehl mit `tail` kombinieren, um einen Abschnitt aus einer Datei zu extrahieren. Hier verwenden wir `head`, um die ersten 200 Zeilen einer Datei zu extrahieren. Diese Ausgabe wird an `tail` weitergeleitet, das die letzten zehn Zeilen extrahiert, also die Zeilen 191 bis 200:
head -n 200 list-1.txt | tail -10
Dieser Befehl listet die fünf Prozesse mit der höchsten Speichernutzung auf:
ps aux | sort -nk +4 | tail -5
Lassen Sie uns diesen Befehl genauer ansehen.
Der `ps`-Befehl zeigt Informationen über laufende Prozesse an. Die verwendeten Optionen sind:
`a`: Alle Prozesse anzeigen, nicht nur die des aktuellen Benutzers.
`u`: Eine benutzerorientierte Ausgabe anzeigen.
`x`: Alle Prozesse anzeigen, auch die, die nicht in einem TTY ausgeführt werden.
Der Befehl `sort` sortiert die Ausgabe von `ps`. Die Optionen für `sort` sind:
`n`: Numerisch sortieren.
`k +4`: Nach der vierten Spalte sortieren.
Der Befehl `tail -5` zeigt die letzten fünf Einträge der sortierten Ausgabe an. Dies sind die fünf Prozesse, die am meisten Speicher beanspruchen.
Verwenden von tail zur Echtzeitverfolgung von Dateien
Das Überwachen neuer Einträge in einer Datei, üblicherweise einer Protokolldatei, ist mit `tail` einfach. Geben Sie den Dateinamen in der Befehlszeile an und verwenden Sie die Option `-f` (folgen):
tail -f geek-1.log
Wenn der Protokolldatei ein neuer Eintrag hinzugefügt wird, aktualisiert `tail` seine Anzeige im Terminalfenster.
Sie können die Ausgabe filtern, um nur Zeilen anzuzeigen, die von besonderem Interesse sind. Hier verwenden wir `grep`, um nur Zeilen mit dem Wort „average“ anzuzeigen:
tail -f geek-1.log | grep average
Um die Änderungen in zwei oder mehr Dateien zu verfolgen, übergeben Sie die Dateinamen in der Befehlszeile:
tail -f -n 5 geek-1.log geek-2.log
Jeder Eintrag ist mit einer Kopfzeile versehen, die angibt, aus welcher Datei der Text stammt.
Die Anzeige wird jedes Mal aktualisiert, wenn ein neuer Eintrag in einer der überwachten Dateien erscheint. Um den Aktualisierungszeitraum festzulegen, nutzen Sie die Option `-s` (Schlafperiode). Dies weist `tail` an, zwischen den Dateiprüfungen eine bestimmte Anzahl von Sekunden zu warten, in diesem Beispiel fünf.
tail -f -s 5 geek-1.log
Obwohl es anhand eines Screenshots schwer zu erkennen ist, werden die Dateiaktualisierungen alle zwei Sekunden durchgeführt. Die neuen Einträge in der Datei werden alle fünf Sekunden im Terminal angezeigt.
Wenn Sie Textaktualisierungen in mehr als einer Datei verfolgen, können Sie die Kopfzeilen unterdrücken, die angeben, aus welcher Protokolldatei der Text stammt. Verwenden Sie dazu die Option `-q` (leise):
tail -f -q geek-1.log geek-2.log
Die Ausgabe der Dateien wird nun in einer zusammenhängenden Mischung dargestellt. Es gibt keinen Hinweis, aus welcher Protokolldatei ein Eintrag stammt.
Tail hat weiterhin seine Berechtigung
Auch wenn `journalctl` nun den Zugriff auf Systemprotokolldateien übernimmt, bietet `tail` nach wie vor einen Mehrwert. Dies gilt insbesondere in Kombination mit anderen Befehlen, indem man die Ausgaben in `tail` hinein- oder aus `tail` herausleitet.
systemd mag die Landschaft verändert haben, aber es gibt immer noch einen Platz für traditionelle Werkzeuge, die der Unix-Philosophie entsprechen, eine Aufgabe gut zu erfüllen.