作為 Linux 使用者,我們經常使用長時間運行的 背景 Linux 程序,這些被稱為守護程序或服務。一些常見的服務示例包括 安全外殼(sshd)、網絡管理器(networkd)、卷管理器(LVM)、Cron,等等。
很多時候,我們需要 監視這些服務的日誌 來調試系統問題。然而,其中一個主要挑戰是這些服務會產生大量的日誌,大部分時間查看這些日誌會變得繁瑣,這就是我們可以使用 tail 命令 的地方。
tail 命令是一個命令行實用工具,類似於 head 命令,它讀取一個或多個文件並將最後 10 行(內容)輸出到標準輸出。
在這個實用指南中,我們將學習 tail 命令。通過本指南的結尾,Linux 命令行用戶將能夠有效地使用 tail 命令。
目錄
tail 命令語法
tail 命令的語法類似於其他 Linux 命令:
$ tail [OPTIONS] [FILE-1] [FILE-2] ...
1. 在 Linux 中打印文件的最後 10 行
默認情況下,tail 命令打印給定文件的最後 10 行,如下所示。
$ 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)
在此,我們可以看到上述命令顯示了來自 /var/log/secure 文件的最後十行。
2. 在 Linux 中打印文件的最後 N 行
在上一個示例中,該命令打印了給定文件的最後 10 行。然而,我們可以使用 -n
選項,該選項允許我們限制要在屏幕上打印的行數,如下所示。
$ 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)
在此示例中,我們可以看到現在該命令僅顯示了最後三行,而不是十行。
3. 在 Linux 中忽略文件的前 N 行
在這裡,我們可以使用加號 (+)
符號與 -n
選項,這允許我們從給定的文件中控制起始點。
為了理解這一點,讓我們使用 +5
的值來從第 5 行開始輸出:
$ 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. 顯示文件的最後 N 個字符
類似於行,我們也可以使用命令來顯示文件的最後 N
個字符,使用 -c
選項,如下所示:
$ tail -c 7 /var/log/secure (uid=0)
在這個例子中,我們可以看到該命令顯示了給定文件的最後七個 ASCII 字符。
5. 刪除文件的前 N 個字符
同樣,我們可以使用加號符號 (+)
與 -c
選項來跳過前 N
字符。所以讓我們使用下面的命令跳過文件的第一行:
$ 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
在這裡,我們可以看到該命令顯示了除第一行之外的所有行。
6. 在標題中顯示文件名
我們可以指示 tail 命令將當前文件名顯示為顯示標題,這在處理多個文件時非常方便。
所以,讓我們使用 -v
選項來啟用顯示標題:
$ 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)
==> /var/log/secure <==
表示顯示標頭。
7. 在多個檔案中顯示檔案名稱作為標頭
就像任何其他檔案處理命令一樣,我們也可以使用tail命令處理多個檔案。在這種情況下,顯示標頭用於分隔檔案內容。
$ 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)
在上述輸出中,我們可以看到每個檔案的顯示標頭。
8. 如何在檔案中禁用顯示標頭
在前面的例子中,我們看到該命令在處理多個檔案時啟用了顯示標頭。但是,我們可以使用-q
選項來抑制此默認行為。
$ 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)
在這裡,我們可以看到現在命令顯示檔案內容,而不帶任何顯示標頭。
9. 如何觀看檔案的更改
到目前為止,我們看到tail命令在處理所需的行數或字符後退出。但是,有時我們也想查看新生成的日誌。
在這種情況下,我們可以使用命令的-f
選項,它允許我們實時監控檔案的更改。
為了理解這一點,首先讓我們在第一個終端中執行以下命令:
$ 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.
這裡我們可以看到命令在顯示最後十行後無限等待:
接下來,讓我們打開另一個終端並將一些文本附加到numbers-2.txt文件中:
$ echo "View Logs in Real-Time" >> /var/log/messages
現在,讓我們切換到第一個終端以查看新添加的文本:
$ 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
在這裡,我們可以看到tail命令顯示了新添加的文本。
您知道Linux中其他最佳的tail命令示例嗎?在下面的評論中告訴我們您的觀點。