如何在 Linux 上使用 tail 命令

Linux tail 命令详解

Linux 中的 tail 命令用于展示文件的末尾数据。它不仅可以显示文件末尾的内容,还能实时展示文件中新增的更新。本文将详细介绍如何使用这个强大的工具。

systemd 对 tail 命令的影响

tail 命令的主要功能是显示文件的尾部内容。通常,新数据会添加到文件的末尾,因此 tail 命令常被用来快速查看最近添加到文件中的信息,尤其是日志文件。此外,它还可以监视文件,并在文件有新文本条目时立即显示,这使其成为监控日志的理想选择。

许多现代 Linux 发行版采用 systemd 作为系统和服务管理器。systemd 是第一个启动的进程,拥有进程 ID 1,是所有其他进程的父进程。此角色以前由 init 系统承担。

随着 systemd 的引入,系统日志文件的格式发生了变化。它们不再以纯文本形式创建,而是以二进制格式记录。要读取这些日志,必须使用 journalctl 工具。而 tail 命令主要用于纯文本格式的文件,无法直接读取二进制文件。那么,这是否意味着 tail 命令已经过时了呢? 答案是否定的。

tail 命令的功能远不止实时显示更新,仍然有大量的日志文件并非由系统生成,而是以纯文本形式创建的,例如应用程序生成的日志文件,它们的格式没有改变。

tail 命令的使用方法

将文件名传递给 tail 命令,它会默认显示该文件的最后十行。例如,我们使用一个包含排序单词列表的文件,每行都有编号,方便观察各种选项的效果。

tail word-list.txt

若要查看不同数量的行,可以使用 -n(行数)选项:

tail -n 15 word-list.txt

实际上,可以省略 -n,直接使用连字符 - 和数字,例如 -12,但要注意它们之间没有空格。虽然这是一种过时的命令形式,但它仍然有效。

tail -12 word-list.txt

处理多个文件

tail 命令可以同时处理多个文件,只需在命令行中列出文件名即可:

tail -n 4 list-1.txt list-2.txt list-3.txt

每个文件输出前都有一个小标题,标明该部分输出属于哪个文件。

显示文件开头的行

使用 +(从开头计数)修饰符,tail 命令可以从文件的开头开始显示指定行及其之后的行。 如果文件很大,且指定的行数靠近文件开头,输出量可能很大,这时可以将 tail 命令的输出通过管道传递给 less 命令进行分页查看。

tail +440 list-1.txt

通过 less 命令,您可以 以受控方式浏览文本

因为示例文件恰好有 20,445 行,所以上述命令等同于使用 -6 选项:

tail +20440 list-1.txt

按字节显示

可以使用 -c (bytes) 选项,让 tail 命令以字节为单位进行偏移。 这对于按固定大小记录格式化的文本文件非常有用。 值得注意的是,换行符也算作一个字节。 以下命令将显示文件中的最后 93 个字节:

tail -c 93 list-2.txt

-c 选项还可以与 + 修饰符结合使用,指定从文件开头开始计数的字节偏移量:

tail -c +351053 list-e.txt

管道操作

前面已经提到过将 tail 的输出传递给 less 命令。 还可以将其他命令的输出通过管道传递给 tail

例如,要查找最近修改的五个文件或目录,可以使用 ls 命令的 -t(按修改时间排序)选项,并将输出通过管道传递给 tail

ls -tl | tail -5

head 命令 用于列出文件开头的行,可以将其与 tail 命令结合使用,提取文件的中间部分。 例如,以下命令使用 head 命令提取文件的前 200 行,然后将其传递给 tail 命令,提取最后 10 行,从而得到文件的第 191 行到第 200 行。

head -n 200 list-1.txt | tail -10

以下命令列出五个最占用内存的进程:

ps aux | sort -nk +4 | tail -5

分解一下:

ps 命令 用于显示正在运行的进程的信息,此处使用的选项包括:

  • a: 列出所有进程,不仅仅是当前用户的。
  • u: 显示面向用户的输出格式。
  • x: 列出所有进程,包括不在 TTY 中运行的进程。

sort 命令 对输出进行排序,此处使用的选项包括:

  • n: 按数字排序。
  • k +4: 按第四列排序。

tail -5 命令显示排序输出中的最后五个进程,即五个最消耗内存的进程。

实时跟踪文件

tail 命令可以通过 -f (follow) 选项,轻松跟踪文件中新增的文本条目,尤其适用于日志文件。

tail -f geek-1.log

每当新的日志条目添加到日志文件中时,tail 命令都会更新终端窗口的显示。

为了只显示特定的行,可以使用 grep 命令进行过滤,例如,以下命令只显示包含“average”一词的行:

tail -f geek-1.log | grep average

要跟踪多个文件的更改,只需在命令行中列出文件名即可:

tail -f -n 5 geek-1.log geek-2.log

每个条目都会标有一个标题,指示文本来自哪个文件。

为了指定更新周期,可以使用 -s(睡眠周期)选项。 这告诉 tail 在两次文件检查之间等待指定的秒数,如下例所示,每次检查会间隔5秒钟。

tail -f -s 5 geek-1.log

尽管无法通过屏幕截图观察,但文件更新的频率为每两秒一次。 新的文件条目每五秒钟在终端窗口中显示一次。

若要隐藏显示文本来自哪个日志文件的标题,可以使用 -q (quiet) 选项:

tail -f -q geek-1.log geek-2.log

此时,来自多个文件的输出会无缝混合显示,没有标题指示每个条目来自哪个日志文件。

tail 命令的价值

尽管 systemd 的 journalctl 工具提供了对系统日志文件的访问,tail 命令仍然非常有用。 当与其他命令结合使用,通过管道进行输入或输出时,尤其如此。

尽管 systemd 改变了 Linux 的格局,像 tail 这样的传统工具仍然有其存在的价值,符合 Unix “只做一件事并把它做好” 的理念。