Linux 中 Tail 命令的 9 个实用示例
作为 Linux 用户,我们经常使用长时间运行的后台 Linux 进程,这些进程称为守护进程或服务。这些服务的常见示例包括安全 Shell (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 Example sshd[201178]: Disconnected from user example 192.168.0.162 port 59774 Apr 2 14:17:24 Example sshd[201165]: pam_unix(sshd:session): session closed for user example Apr 2 14:29:12 Example sshd[201366]: Accepted password for example from 192.168.0.162 port 56378 ssh2 Apr 2 14:29:12 Example systemd[201371]: pam_unix(systemd-user:session): session opened for user example(uid=1002) by (uid=0) Apr 2 14:29:12 Example sshd[201366]: pam_unix(sshd:session): session opened for user example(uid=1002) by (uid=0) Apr 2 14:29:12 Example sshd[201382]: Received disconnect from 192.168.0.162 port 56378:11: disconnected by user Apr 2 14:29:12 Example sshd[201382]: Disconnected from user example 192.168.0.162 port 56378 Apr 2 14:29:12 Example sshd[201366]: pam_unix(sshd:session): session closed for user example Apr 2 15:12:55 Example sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2 Apr 2 15:12:55 Example 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 Example sshd[201366]: pam_unix(sshd:session): session closed for user example Apr 2 15:12:55 Example sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2 Apr 2 15:12:55 Example 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 Example sshd[201178]: Disconnected from user example 192.168.0.162 port 59774 Apr 2 14:17:24 Example sshd[201165]: pam_unix(sshd:session): session closed for user example Apr 2 14:29:12 Example sshd[201366]: Accepted password for example from 192.168.0.162 port 56378 ssh2 Apr 2 14:29:12 Example systemd[201371]: pam_unix(systemd-user:session): session opened for user example(uid=1002) by (uid=0) Apr 2 14:29:12 Example sshd[201366]: pam_unix(sshd:session): session opened for user example(uid=1002) by (uid=0) Apr 2 14:29:12 Example sshd[201382]: Received disconnect from 192.168.0.162 port 56378:11: disconnected by user Apr 2 14:29:12 Example sshd[201382]: Disconnected from user example 192.168.0.162 port 56378 Apr 2 14:29:12 Example sshd[201366]: pam_unix(sshd:session): session closed for user example Apr 2 15:12:55 Example sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2 Apr 2 15:12:55 Example 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 Example sudo[162801]: root : TTY=pts/2 ; PWD=/root ; USER=root ; COMMAND=/bin/dnf install R Apr 2 03:02:59 Example sudo[162801]: pam_unix(sudo:session): session opened for user root(uid=0) by root(uid=0) Apr 2 03:03:02 Example sudo[162801]: pam_unix(sudo:session): session closed for user root Apr 2 03:11:17 Example groupadd[163602]: group added to /etc/group: name=avahi, GID=70 Apr 2 03:11:18 Example groupadd[163602]: group added to /etc/gshadow: name=avahi Apr 2 03:11:18 Example groupadd[163602]: new group: name=avahi, GID=70 Apr 2 03:11:19 Example 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 Example groupadd[163704]: group added to /etc/group: name=colord, GID=986 Apr 2 03:13:41 Example 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 Example sshd[201366]: pam_unix(sshd:session): session closed for user example Apr 2 15:12:55 Example sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2 Apr 2 15:12:55 Example 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 Example sshd[201366]: pam_unix(sshd:session): session closed for user example Apr 2 15:12:55 Example sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2 Apr 2 15:12:55 Example 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 Example groupadd[156163]: new group: name=docker, GID=987 Mar 31 04:46:11 Example sshd[159403]: Accepted password for root from 192.168.0.162 port 46480 ssh2 Mar 31 04:46:11 Example 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 Example sshd[201366]: pam_unix(sshd:session): session closed for user example Apr 2 15:12:55 Example sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2 Apr 2 15:12:55 Example sshd[202049]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0) Mar 31 03:50:53 Example groupadd[156163]: new group: name=docker, GID=987 Mar 31 04:46:11 Example sshd[159403]: Accepted password for root from 192.168.0.162 port 46480 ssh2 Mar 31 04:46:11 Example 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 Example NetworkManager[741]: [1680462808.8441] policy: set-hostname: current hostname was changed outside NetworkManager: 'Example' Apr 2 15:13:28 Example systemd[1]: Starting Network Manager Script Dispatcher Service... Apr 2 15:13:28 Example systemd[1]: Started Network Manager Script Dispatcher Service. Apr 2 15:13:37 Example arpwatch[11001]: rename arp.dat -> arp.dat-: Operation not permitted Apr 2 15:13:38 Example systemd[1]: NetworkManager-dispatcher.service: Deactivated successfully. Apr 2 15:13:58 Example systemd[1]: systemd-hostnamed.service: Deactivated successfully. Apr 2 15:18:03 Example systemd[1]: Starting dnf makecache... Apr 2 15:18:03 Example dnf[202235]: Metadata cache refreshed recently. Apr 2 15:18:03 Example systemd[1]: dnf-makecache.service: Deactivated successfully. Apr 2 15:18:03 Example 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 Example NetworkManager[741]: [1680462808.8441] policy: set-hostname: current hostname was changed outside NetworkManager: 'Example' Apr 2 15:13:28 Example systemd[1]: Starting Network Manager Script Dispatcher Service... Apr 2 15:13:28 Example systemd[1]: Started Network Manager Script Dispatcher Service. Apr 2 15:13:37 Example arpwatch[11001]: rename arp.dat -> arp.dat-: Operation not permitted Apr 2 15:13:38 Example systemd[1]: NetworkManager-dispatcher.service: Deactivated successfully. Apr 2 15:13:58 Example systemd[1]: systemd-hostnamed.service: Deactivated successfully. Apr 2 15:18:03 Example systemd[1]: Starting dnf makecache... Apr 2 15:18:03 Example dnf[202235]: Metadata cache refreshed recently. Apr 2 15:18:03 Example systemd[1]: dnf-makecache.service: Deactivated successfully. Apr 2 15:18:03 Example systemd[1]: Finished dnf makecache. View Logs in Real-Time
这里我们可以看到tail命令显示了新添加的文本。
你知道 Linux 中 tail 命令的其他最佳示例吗?请在下面的评论中告诉我们你的看法。