Linux中tail命令的9个实用示例

作為 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命令示例嗎?在下面的評論中告訴我們您的觀點。

Source:
https://www.tecmint.com/tail-command-linux/