Als Linux-Benutzer arbeiten wir oft mit lang laufenden Hintergrund-Linux-Prozessen, die als Daemons oder Dienste bezeichnet werden. Einige der üblichen Beispiele für diese Dienste sind Secure Shell (sshd), Network Manager (networkd), Volume Manager (LVM), Cron und so weiter.
Oft müssen wir die Protokolle dieser Dienste überwachen, um Systemprobleme zu debuggen. Eine der Hauptherausforderungen besteht jedoch darin, dass diese Dienste viele Protokolle generieren und es oft umständlich ist, diese Protokolle durchzugehen. Hier können wir den tail-Befehl verwenden.
Der tail-Befehl ist ein Befehlszeilen-Dienstprogramm, ähnlich dem head-Befehl, das eine Datei liest und die letzten 10 Zeilen (Inhalt) einer oder mehrerer Dateien auf die Standardausgabe druckt.
In diesem praktischen Leitfaden werden wir den tail-Befehl kennenlernen. Am Ende dieses Leitfadens werden Linux-Benutzer der Befehlszeile in der Lage sein, den tail-Befehl effektiv zu verwenden.
Inhaltsverzeichnis
tail Befehl Syntax
Die Syntax des tail Befehls ist ähnlich zu anderen Linux Befehlen:
$ tail [OPTIONS] [FILE-1] [FILE-2] ...
1. Die letzten 10 Zeilen einer Datei in Linux ausgeben
Standardmäßig gibt der tail Befehl die letzten 10 Zeilen der angegebenen Datei aus, wie gezeigt.
$ tail /var/log/secure Apr 2 14:17:24 TecMint sshd[201178]: Disconnected from user tecmint 192.168.0.162 port 59774 Apr 2 14:17:24 TecMint sshd[201165]: pam_unix(sshd:session): session closed for user tecmint Apr 2 14:29:12 TecMint sshd[201366]: Accepted password for tecmint from 192.168.0.162 port 56378 ssh2 Apr 2 14:29:12 TecMint systemd[201371]: pam_unix(systemd-user:session): session opened for user tecmint(uid=1002) by (uid=0) Apr 2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session opened for user tecmint(uid=1002) by (uid=0) Apr 2 14:29:12 TecMint sshd[201382]: Received disconnect from 192.168.0.162 port 56378:11: disconnected by user Apr 2 14:29:12 TecMint sshd[201382]: Disconnected from user tecmint 192.168.0.162 port 56378 Apr 2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session closed for user tecmint Apr 2 15:12:55 TecMint sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2 Apr 2 15:12:55 TecMint sshd[202049]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)
Hier sehen wir, dass der obige Befehl die letzten zehn Zeilen aus der /var/log/secure Datei anzeigt.
2. Die letzten N Zeilen einer Datei in Linux ausgeben
In dem letzten Beispiel gibt der Befehl die letzten 10 Zeilen der angegebenen Datei aus. Wir können jedoch die -n
Option verwenden, um die Anzahl der auf dem Bildschirm auszugebenden Zeilen zu begrenzen, wie gezeigt.
$ tail -n 3 /var/log/secure Apr 2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session closed for user tecmint Apr 2 15:12:55 TecMint sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2 Apr 2 15:12:55 TecMint sshd[202049]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)
In diesem Beispiel sehen wir, dass der Befehl jetzt nur noch die letzten drei Zeilen anstatt der zehn Zeilen anzeigt.
3. Die ersten N Zeilen einer Datei in Linux ignorieren
Hier können wir das Pluszeichen (+)
mit der Option -n
verwenden, um den Startpunkt aus der angegebenen Datei zu steuern.
Um dies zu verstehen, verwenden wir den Wert +5
, um die Ausgabe ab der 5. Zeile zu starten:
$ tail -n +5 /var/log/secure Apr 2 14:17:24 TecMint sshd[201178]: Disconnected from user tecmint 192.168.0.162 port 59774 Apr 2 14:17:24 TecMint sshd[201165]: pam_unix(sshd:session): session closed for user tecmint Apr 2 14:29:12 TecMint sshd[201366]: Accepted password for tecmint from 192.168.0.162 port 56378 ssh2 Apr 2 14:29:12 TecMint systemd[201371]: pam_unix(systemd-user:session): session opened for user tecmint(uid=1002) by (uid=0) Apr 2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session opened for user tecmint(uid=1002) by (uid=0) Apr 2 14:29:12 TecMint sshd[201382]: Received disconnect from 192.168.0.162 port 56378:11: disconnected by user Apr 2 14:29:12 TecMint sshd[201382]: Disconnected from user tecmint 192.168.0.162 port 56378 Apr 2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session closed for user tecmint Apr 2 15:12:55 TecMint sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2 Apr 2 15:12:55 TecMint sshd[202049]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)
4. Zeige die letzten N Zeichen der Datei
Ähnlich wie bei den Zeilen können wir auch den Befehl verwenden, um die letzten N
Zeichen der Datei mit der Option -c
wie unten gezeigt anzuzeigen:
$ tail -c 7 /var/log/secure (uid=0)
In diesem Beispiel können wir sehen, dass der Befehl die letzten sieben ASCII-Zeichen der angegebenen Datei anzeigt.
5. Entferne die ersten N Zeichen der Datei
Auf ähnliche Weise können wir das Pluszeichen (+)
mit der Option -c
verwenden, um die ersten N
Zeichen zu überspringen. Lassen Sie uns also die erste Zeile der Datei mit dem folgenden Befehl überspringen:
$ tail -c +5 /var/log/secure Apr 2 03:02:59 TecMint sudo[162801]: root : TTY=pts/2 ; PWD=/root ; USER=root ; COMMAND=/bin/dnf install R Apr 2 03:02:59 TecMint sudo[162801]: pam_unix(sudo:session): session opened for user root(uid=0) by root(uid=0) Apr 2 03:03:02 TecMint sudo[162801]: pam_unix(sudo:session): session closed for user root Apr 2 03:11:17 TecMint groupadd[163602]: group added to /etc/group: name=avahi, GID=70 Apr 2 03:11:18 TecMint groupadd[163602]: group added to /etc/gshadow: name=avahi Apr 2 03:11:18 TecMint groupadd[163602]: new group: name=avahi, GID=70 Apr 2 03:11:19 TecMint useradd[163610]: new user: name=avahi, UID=70, GID=70, home=/var/run/avahi-daemon, shell=/sbin/nologin, from=none Apr 2 03:13:41 TecMint groupadd[163704]: group added to /etc/group: name=colord, GID=986 Apr 2 03:13:41 TecMint groupadd[163704]: group added to /etc/gshadow: name=colord
Hier sehen wir, dass der Befehl alle Zeilen außer der ersten Zeile anzeigt.
6. Zeige den Dateinamen im Header an
Wir können den Befehl tail anweisen, den aktuellen Dateinamen als Anzeigeheader anzuzeigen, was beim Arbeiten mit mehreren Dateien nützlich ist.
Also, lassen Sie uns die Option -v
verwenden, um den Anzeigeheader zu aktivieren:
$ tail -n 3 -v /var/log/secure ==>/var/log/secure <== Apr 2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session closed for user tecmint Apr 2 15:12:55 TecMint sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2 Apr 2 15:12:55 TecMint sshd[202049]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)
In der obigen Ausgabe repräsentiert ==> /var/log/secure <==
den Anzeigeheader.
7. Dateiname als Header in mehreren Dateien anzeigen
Wie bei jedem anderen Dateiverarbeitungsbefehl können wir auch mehrere Dateien mit dem Befehl tail verwenden. In solchen Fällen wird der Anzeigeheader verwendet, um die Dateiinhalte zu trennen.
$ tail -n 3 -v /var/log/secure /var/log/secure-20230402 ==> /var/log/secure <== Apr 2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session closed for user tecmint Apr 2 15:12:55 TecMint sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2 Apr 2 15:12:55 TecMint sshd[202049]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0) ==> /var/log/secure-20230402 <== Mar 31 03:50:53 TecMint groupadd[156163]: new group: name=docker, GID=987 Mar 31 04:46:11 TecMint sshd[159403]: Accepted password for root from 192.168.0.162 port 46480 ssh2 Mar 31 04:46:11 TecMint sshd[159403]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)
In der obigen Ausgabe können wir den Anzeigeheader für jede Datei sehen.
8. Anzeigeheader in Datei deaktivieren
Im vorherigen Beispiel haben wir gesehen, dass der Befehl den Anzeigeheader aktiviert, während wir mit mehreren Dateien arbeiten. Wir können jedoch dieses Standardverhalten mit der Option -q
unterdrücken.
$ tail -q -n 3 /var/log/secure /var/log/secure-20230402 Apr 2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session closed for user tecmint Apr 2 15:12:55 TecMint sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2 Apr 2 15:12:55 TecMint sshd[202049]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0) Mar 31 03:50:53 TecMint groupadd[156163]: new group: name=docker, GID=987 Mar 31 04:46:11 TecMint sshd[159403]: Accepted password for root from 192.168.0.162 port 46480 ssh2 Mar 31 04:46:11 TecMint sshd[159403]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)
Hier sehen wir, dass der Befehl jetzt die Dateiinhalte nacheinander ohne Anzeigeheader anzeigt.
9. Wie man eine Datei auf Änderungen überwacht
Bisher haben wir gesehen, dass der tail-Befehl beendet, sobald er die erforderliche Anzahl von Zeilen oder Zeichen verarbeitet hat. Manchmal möchten wir jedoch auch die neu generierten Protokolle anzeigen.
In solchen Fällen können wir die Option -f
mit dem Befehl verwenden, um die Datei in Echtzeit auf Änderungen zu überwachen.
Um dies zu verstehen, führen wir zuerst den unten stehenden Befehl im ersten Terminal aus:
$ tail -f /var/log/messages Apr 2 15:13:28 TecMint NetworkManager[741]: [1680462808.8441] policy: set-hostname: current hostname was changed outside NetworkManager: 'TecMint' Apr 2 15:13:28 TecMint systemd[1]: Starting Network Manager Script Dispatcher Service... Apr 2 15:13:28 TecMint systemd[1]: Started Network Manager Script Dispatcher Service. Apr 2 15:13:37 TecMint arpwatch[11001]: rename arp.dat -> arp.dat-: Operation not permitted Apr 2 15:13:38 TecMint systemd[1]: NetworkManager-dispatcher.service: Deactivated successfully. Apr 2 15:13:58 TecMint systemd[1]: systemd-hostnamed.service: Deactivated successfully. Apr 2 15:18:03 TecMint systemd[1]: Starting dnf makecache... Apr 2 15:18:03 TecMint dnf[202235]: Metadata cache refreshed recently. Apr 2 15:18:03 TecMint systemd[1]: dnf-makecache.service: Deactivated successfully. Apr 2 15:18:03 TecMint systemd[1]: Finished dnf makecache.
Hier können wir sehen, dass das Befehl unendlich wartet, nachdem er die letzten zehn Zeilen angezeigt hat.
Nächstens, öffnen wir ein weiteres Terminal und fügen etwas Text zur Datei numbers-2.txt hinzu:
$ echo "View Logs in Real-Time" >> /var/log/messages
Jetzt wechseln wir zum ersten Terminal, um den neu hinzugefügten Text anzusehen:
$ tail -f /var/log/messages Apr 2 15:13:28 TecMint NetworkManager[741]: [1680462808.8441] policy: set-hostname: current hostname was changed outside NetworkManager: 'TecMint' Apr 2 15:13:28 TecMint systemd[1]: Starting Network Manager Script Dispatcher Service... Apr 2 15:13:28 TecMint systemd[1]: Started Network Manager Script Dispatcher Service. Apr 2 15:13:37 TecMint arpwatch[11001]: rename arp.dat -> arp.dat-: Operation not permitted Apr 2 15:13:38 TecMint systemd[1]: NetworkManager-dispatcher.service: Deactivated successfully. Apr 2 15:13:58 TecMint systemd[1]: systemd-hostnamed.service: Deactivated successfully. Apr 2 15:18:03 TecMint systemd[1]: Starting dnf makecache... Apr 2 15:18:03 TecMint dnf[202235]: Metadata cache refreshed recently. Apr 2 15:18:03 TecMint systemd[1]: dnf-makecache.service: Deactivated successfully. Apr 2 15:18:03 TecMint systemd[1]: Finished dnf makecache. View Logs in Real-Time
Hier können wir sehen, dass der tail-Befehl den neu hinzugefügten Text zeigt.
Kennen Sie ein weiteres gutes Beispiel für den tail-Befehl in Linux? Teilen Sie uns Ihre Ansichten unten in den Kommentaren mit.