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 “只做一件事并把它做好” 的理念。