Der Linux-Tail-Befehl gibt den letzten Teil der Dateien aus. Es besteht die Möglichkeit, die Datei für weitere Eingaben geöffnet zu lassen. Dies macht es sehr nützlich, mit Protokolldateien zu arbeiten, in denen wir die Protokolle in Echtzeit überprüfen können, wenn ein Ereignis eintritt.
1. Linux-Tail-Befehlssyntax
Die Syntax des tail-Befehls lautet:
$ tail [OPTION]... [FILE]...
Alle Optionen und Dateinamen sind optional.
2. Was wird tail tun, wenn keine Datei bereitgestellt wird?
Wenn Sie den Dateinamen nicht nachliefern oder als Bindestrich (-) angeben, wird die Standardeingabe gelesen.
3. Lesen der letzten 10 Zeilen einer Datei
Wenn wir keine Option angeben, liest der Schwanz die letzten 10 Zeilen einer Datei.
# tail error.log
2019-10-29 11:31:09.887840 [INFO] [16169] [APVH_recipes_Sulsphp73:]: locked pid file [/tmp/lshttpd/APVH_recipes_Suphp73.sock.pid].
2019-10-29 11:31:09.887968 [INFO] [16169] [APVH_recipes_Sulsphp73:] remove unix socket for detached process: /tmp/lshttpd/APVH_recipes_Suphp73.sock
2019-10-29 11:31:09.896280 [INFO] [16169] [APVH_recipes_Sulsphp73:] add child process pid: 27035, procinfo: 0x2c5e2b0
2019-10-29 11:31:09.896396 [INFO] [16169] [APVH_recipes_Sulsphp73:]: unlocked pid file [/tmp/lshttpd/APVH_recipes_Suphp73.sock.pid].
2019-10-29 11:31:17.182067 [INFO] [16169] [APVH_golangd_Sulsphp73:]: locked pid file [/tmp/lshttpd/APVH_golangd_Suphp73.sock.pid].
2019-10-29 11:31:17.182116 [INFO] [16169] [APVH_golangd_Sulsphp73:] remove unix socket for detached process: /tmp/lshttpd/APVH_golangd_Suphp73.sock
2019-10-29 11:31:17.182991 [INFO] [16169] [APVH_golangd_Sulsphp73:] add child process pid: 27067, procinfo: 0x447cff0
2019-10-29 11:31:17.183048 [INFO] [16169] [APVH_golangd_Sulsphp73:]: unlocked pid file [/tmp/lshttpd/APVH_golangd_Suphp73.sock.pid].
2019-10-29 11:31:20.641690 [INFO] [16169] [149.56.101.239:45604] [ACL] Access to context [/] is denied!
2019-10-29 11:31:27.245789 [INFO] [16169] [198.199.83.232:46876] [ACL] Access to context [/] is denied!
#
4. Linux-Tail-Befehlsoptionen
Kurze Option | Lange Option | Beschreibung |
---|---|---|
-c | –bytes=K | gibt die letzten KBytes der Datei aus. Wir können „-c +K“ verwenden, um Bytes auszugeben, die mit dem K-ten jeder Datei beginnen. |
-f | –follow[={name|descriptor}] | angehängte Daten ausgeben, wenn die Datei wächst. Wenn wir -F angeben, ist dies dasselbe wie „–follow=name –retry“ |
-n | –lines=K | gibt die letzten K Zeilen aus, statt der letzten 10; oder verwenden Sie '-n +K', um mit der K-ten Zeile beginnend auszugeben. |
-q | –leise, –leise | Kopfzeilen mit Dateinamen niemals ausgeben |
–Wiederholen | versuchen Sie weiterhin, eine Datei zu öffnen, wenn Sie nicht darauf zugreifen können | |
-s | –sleep-interval=N | wird mit -f verwendet, um ungefähr N Sekunden (Standard 1.0) zwischen Iterationen zu schlafen. |
-v | –ausführlich | Kopfzeilen immer mit Dateinamen ausgeben |
–Version | Versionsinformationen ausgeben und beenden. |
- Wenn das erste Zeichen von K (die Anzahl der Bytes oder Zeilen) ein '+' ist, drucke beginnend mit dem K-ten Element vom Anfang jeder Datei, andernfalls drucke die letzten K-Elemente in der Datei.
- K kann ein Multiplikator-Suffix haben:b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024, GB 1000*1000*1000, G 1024*1024*1024 und so weiter für T, P , E, Z, Y.
- Mit –follow (-f) folgt tail standardmäßig dem Dateideskriptor, was bedeutet, dass selbst wenn eine Datei mit Tails umbenannt wird, das Tail weiterhin ihr Ende verfolgt. Dieses Standardverhalten ist nicht wünschenswert, wenn Sie wirklich den tatsächlichen Namen der Datei verfolgen möchten, nicht den Dateideskriptor (z. B. Protokollrotation).
- Verwenden Sie in diesem Fall –follow=name. Das bewirkt, dass der Schwanz die benannte Datei auf eine Weise verfolgt, die das Umbenennen, Entfernen und Erstellen ermöglicht.
5. Beispiele für Linux-Tail-Befehle
Sehen wir uns einige Beispiele für die Verwendung von tail-Befehlen an.
5.1) Begrenzen Sie die Anzahl der Zeilen in der Tail-Ausgabe
Wir können die Optionen -n oder –lines verwenden, um die Anzahl der Zeilen in der Endausgabe zu begrenzen.
# tail -n 5 error.log
# tail --lines=5 error.log
Wenn wir + Präfix mit dem Optionswert verwenden, wird die Ausgabe ab dieser Zeilennummer in der Datei gestartet.
# wc -l error.log
27360 error.log
# tail -n +27358 error.log
2019-10-29 13:09:35.142604 [INFO] [16169] [APVH_javastr_Sulsphp73:] remove unix socket for detached process: /tmp/lshttpd/APVH_javastr_Suphp73.sock
2019-10-29 13:09:35.144320 [INFO] [16169] [APVH_javastr_Sulsphp73:] add child process pid: 18132, procinfo: 0x367c520
2019-10-29 13:09:35.144389 [INFO] [16169] [APVH_javastr_Sulsphp73:]: unlocked pid file [/tmp/lshttpd/APVH_javastr_Suphp73.sock.pid].
# tail --lines=+27358 error.log
2019-10-29 13:09:35.142604 [INFO] [16169] [APVH_javastr_Sulsphp73:] remove unix socket for detached process: /tmp/lshttpd/APVH_javastr_Suphp73.sock
2019-10-29 13:09:35.144320 [INFO] [16169] [APVH_javastr_Sulsphp73:] add child process pid: 18132, procinfo: 0x367c520
2019-10-29 13:09:35.144389 [INFO] [16169] [APVH_javastr_Sulsphp73:]: unlocked pid file [/tmp/lshttpd/APVH_javastr_Suphp73.sock.pid].
#
5.2) Begrenzen Sie die Anzahl der Bytes in der Tail-Ausgabe
Wir können die Option -c oder –bytes verwenden, um die angegebenen Bytes vom Ende der Datei auszugeben.
# tail -c 100 error.log
[16169] [APVH_android_Sulsphp73:]: unlocked pid file [/tmp/lshttpd/APVH_android_Suphp73.sock.pid].
# tail --bytes=100 error.log
[16169] [APVH_android_Sulsphp73:]: unlocked pid file [/tmp/lshttpd/APVH_android_Suphp73.sock.pid].
#
Wenn wir + mit dem Optionswert verwenden, werden die Dateidaten von diesem Byte an die Konsole ausgegeben.
# ls -ltr error.log
-rw-r--r--. 1 nobody nobody 3475359 Oct 29 13:15 error.log
# tail -c +3475350 error.log
ock.pid].
#
5.3) Linux-Tail-Befehl mit mehreren Dateien
Wir können mehrere Dateinamen übergeben und die Ausgabe hat einen Header mit dem Dateinamen, gefolgt von der Ausgabe.
# tail -n 2 error.log error.log.2019_10_27
==> error.log <==
2019-10-29 13:17:24.356633 [INFO] [16169] [APVH_golangd_Sulsphp73:] add child process pid: 19670, procinfo: 0x27af560
2019-10-29 13:17:24.356789 [INFO] [16169] [APVH_golangd_Sulsphp73:]: unlocked pid file [/tmp/lshttpd/APVH_golangd_Suphp73.sock.pid].
==> error.log.2019_10_27 <==
2019-10-27 20:26:31.050022 [INFO] [16169] [176.9.99.9:34084] [ACL] Access to context [/] is denied!
2019-10-27 20:26:31.216835 [INFO] [16169] [176.9.99.9:34118] [ACL] Access to context [/] is denied!
#
Wir können die Option -q für die stille Ausgabe verwenden. Es ist nützlich, die Ausgabe mehrerer Dateien zusammenzuführen.
# tail -n 2 -q error.log error.log.2019_10_27
2019-10-29 13:18:44.095709 [INFO] [16169] [APVH_javastr_Sulsphp73:] add child process pid: 19947, procinfo: 0x4312b50
2019-10-29 13:18:44.095766 [INFO] [16169] [APVH_javastr_Sulsphp73:]: unlocked pid file [/tmp/lshttpd/APVH_javastr_Suphp73.sock.pid].
2019-10-27 20:26:31.050022 [INFO] [16169] [176.9.99.9:34084] [ACL] Access to context [/] is denied!
2019-10-27 20:26:31.216835 [INFO] [16169] [176.9.99.9:34118] [ACL] Access to context [/] is denied!
#
5.4) Überwachen einer Datei auf Änderungen
Wir können die Option -f verwenden, um die Datei auf weitere Änderungen zu überwachen. Dies ist die am weitesten verbreitete Option mit dem tail-Befehl. Es ist nützlich, Protokolle in Echtzeit zu verfolgen und zu debuggen.
[root@li1197-217 logs]# tail -f error.log
2019-10-29 13:22:31.719103 [INFO] [16169] [APVH_cultwpc_Sulsphp73:] add child process pid: 20640, procinfo: 0x384a9a0
2019-10-29 13:22:31.719172 [INFO] [16169] [APVH_cultwpc_Sulsphp73:]: unlocked pid file [/tmp/lshttpd/APVH_cultwpc_Suphp73.sock.pid].
2019-10-29 13:22:32.176946 [INFO] [16169] [APVH_android_Sulsphp73:]: locked pid file [/tmp/lshttpd/APVH_android_Suphp73.sock.pid].
2019-10-29 13:22:32.176979 [INFO] [16169] [APVH_android_Sulsphp73:] remove unix socket for detached process: /tmp/lshttpd/APVH_android_Suphp73.sock
2019-10-29 13:22:32.177901 [INFO] [16169] [APVH_android_Sulsphp73:] add child process pid: 20645, procinfo: 0x2df6830
2019-10-29 13:22:32.177955 [INFO] [16169] [APVH_android_Sulsphp73:]: unlocked pid file [/tmp/lshttpd/APVH_android_Suphp73.sock.pid].
2019-10-29 13:22:39.634710 [INFO] [16169] [APVH_javastr_Sulsphp73:]: locked pid file [/tmp/lshttpd/APVH_javastr_Suphp73.sock.pid].
2019-10-29 13:22:39.634755 [INFO] [16169] [APVH_javastr_Sulsphp73:] remove unix socket for detached process: /tmp/lshttpd/APVH_javastr_Suphp73.sock
2019-10-29 13:22:39.641576 [INFO] [16169] [APVH_javastr_Sulsphp73:] add child process pid: 20677, procinfo: 0x286e3b0
2019-10-29 13:22:39.641694 [INFO] [16169] [APVH_javastr_Sulsphp73:]: unlocked pid file [/tmp/lshttpd/APVH_javastr_Suphp73.sock.pid].
Mit der Option -f können wir auch mehrere Dateien ansehen.
[root@li1197-217 logs]# tail -f error.log lsrestart.log
==> error.log <==
2019-10-29 13:22:31.719103 [INFO] [16169] [APVH_cultwpc_Sulsphp73:] add child process pid: 20640, procinfo: 0x384a9a0
2019-10-29 13:22:31.719172 [INFO] [16169] [APVH_cultwpc_Sulsphp73:]: unlocked pid file [/tmp/lshttpd/APVH_cultwpc_Suphp73.sock.pid].
2019-10-29 13:22:32.176946 [INFO] [16169] [APVH_android_Sulsphp73:]: locked pid file [/tmp/lshttpd/APVH_android_Suphp73.sock.pid].
2019-10-29 13:22:32.176979 [INFO] [16169] [APVH_android_Sulsphp73:] remove unix socket for detached process: /tmp/lshttpd/APVH_android_Suphp73.sock
2019-10-29 13:22:32.177901 [INFO] [16169] [APVH_android_Sulsphp73:] add child process pid: 20645, procinfo: 0x2df6830
2019-10-29 13:22:32.177955 [INFO] [16169] [APVH_android_Sulsphp73:]: unlocked pid file [/tmp/lshttpd/APVH_android_Suphp73.sock.pid].
2019-10-29 13:22:39.634710 [INFO] [16169] [APVH_javastr_Sulsphp73:]: locked pid file [/tmp/lshttpd/APVH_javastr_Suphp73.sock.pid].
2019-10-29 13:22:39.634755 [INFO] [16169] [APVH_javastr_Sulsphp73:] remove unix socket for detached process: /tmp/lshttpd/APVH_javastr_Suphp73.sock
2019-10-29 13:22:39.641576 [INFO] [16169] [APVH_javastr_Sulsphp73:] add child process pid: 20677, procinfo: 0x286e3b0
2019-10-29 13:22:39.641694 [INFO] [16169] [APVH_javastr_Sulsphp73:]: unlocked pid file [/tmp/lshttpd/APVH_javastr_Suphp73.sock.pid].
==> lsrestart.log <==
Thu Oct 10 17:45:33 UTC 2019
restart, LSWS running: 1
Wed Oct 23 08:53:16 UTC 2019
restart, LSWS running: 1
Wed Oct 23 09:03:02 UTC 2019
restart, LSWS running: 1
Wir können auch die Anzahl der Zeilen in der Ausgabe mit der Option -f angeben.
# tail -2f error.log
2019-10-29 13:28:46.086130 [INFO] [16169] [APVH_cultwpc_Sulsphp73:] add child process pid: 21976, procinfo: 0xd032210
2019-10-29 13:28:46.086193 [INFO] [16169] [APVH_cultwpc_Sulsphp73:]: unlocked pid file [/tmp/lshttpd/APVH_cultwpc_Suphp73.sock.pid].
5.5) Verwendung des tail-Befehls mit Pipe und grep
Manchmal sind wir nur an bestimmten Nachrichten in der Tail-Ausgabe interessiert. Wir können den tail-Befehl mit pipe und grep verwenden, um die spezifischen Nachrichten in der Ausgabe zu filtern.
# tail -100f error.log | grep 'denied'
2019-10-29 13:21:49.170651 [INFO] [16169] [159.65.53.153:38448] [ACL] Access to context [/] is denied!
2019-10-29 13:22:00.991330 [INFO] [16169] [182.71.209.203:22089] [ACL] Access to context [/] is denied!
2019-10-29 13:25:47.188167 [INFO] [16169] [79.137.42.145:36674] [ACL] Access to context [/] is denied!
2019-10-29 13:25:52.668213 [INFO] [16169] [162.144.60.165:52886] [ACL] Access to context [/] is denied!
5.6) Verwenden des tail-Befehls zum Filtern einer anderen Befehlsausgabe
Wir können den tail-Befehl mit einem anderen Befehl verwenden, um die Ausgabezeilen zu filtern. Es ist nützlich, wenn wir nur an den wenigen Zeilen einer Befehlsausgabe interessiert sind.
# ls -ltr | tail -n 3
-rw-r--r--. 1 nobody nobody 24406 Oct 23 09:08 error.log.2019_10_23.02
-rw-r--r--. 1 nobody nobody 10486279 Oct 27 20:26 error.log.2019_10_27
-rw-r--r--. 1 nobody nobody 3494794 Oct 29 13:29 error.log
#
# ls -ltr | tail -n +15
-rw-r--r--. 1 nobody nobody 10490954 Oct 21 09:42 error.log.2019_10_21
-rw-r--r--. 1 nobody nobody 10485856 Oct 22 07:44 error.log.2019_10_22
-rw-r--r--. 1 nobody nobody 10485809 Oct 22 14:16 error.log.2019_10_22.01
-rw-r--r--. 1 nobody nobody 5398751 Oct 23 08:29 error.log.2019_10_23
-rw-r--r--. 1 nobody nobody 61485 Oct 23 08:58 error.log.2019_10_23.01
-rw-r--r--. 1 root root 162 Oct 23 09:03 lsrestart.log
-rw-r--r--. 1 nobody nobody 24406 Oct 23 09:08 error.log.2019_10_23.02
-rw-r--r--. 1 nobody nobody 10486279 Oct 27 20:26 error.log.2019_10_27
-rw-r--r--. 1 nobody nobody 3499801 Oct 29 13:34 error.log
5.7) Endversion drucken
Wir können –version verwenden, um die Version des tail-Befehls auszugeben.
# tail --version
tail (GNU coreutils) 8.22
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later .
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Paul Rubin, David MacKenzie, Ian Lance Taylor,
and Jim Meyering.
#
5.8) Ausführliche Ausgabe des tail-Befehls
Wenn wir die Verbose-Option verwenden, hat die Ausgabe einen Header mit dem Dateinamen.
# tail -v -n 2 error.log
==> error.log <==
2019-10-29 13:39:30.769561 [INFO] [16169] [APVH_javastr_Sulsphp73:] add child process pid: 24454, procinfo: 0x405b840
2019-10-29 13:39:30.769618 [INFO] [16169] [APVH_javastr_Sulsphp73:]: unlocked pid file [/tmp/lshttpd/APVH_javastr_Suphp73.sock.pid].
#
6. Fazit
Der Linux-Tail-Befehl ist sehr nützlich, um Protokollmeldungen in Echtzeit zu debuggen. Es ist ein großartiges Tool für Entwickler, um mit Protokolldateien zu arbeiten.
Referenz :Wikipedia-Seite