Skip to content

tail 命令详解:看文件结尾,还能实时跟踪新日志 ​

本文是 Linux 命令速查 中 tail 的从 0 到 1 详解。 目标:把 tail --help 里的每个选项讲清楚,多看几遍后,你在服务器上敲 tail --help 就知道该用哪个选项。 环境依据:GNU coreutils 8.32(Ubuntu 22.04 自带;RHEL/Rocky 自带版本用法一致)。

一、命令是干什么的 ​

tail 的意思是"尾巴",和 head 正好相反:它只看文件最结尾的一部分(默认后 10 行)。但 tail 真正封神的能力是 -f:文件一边被写入,它一边实时把新内容打印出来,这是看线上日志的标配。

  • 看日志最后几行报了什么错;
  • 用 tail -f 盯着一个正在增长的日志文件,实时滚动看新日志;
  • 用 -n +N 从第 N 行一直看到结尾。

类比:head 是翻书看开头,tail 是直接翻到最后一页看结局。而 tail -f 就像盯着一个还在连载更新的小说,作者每写一段,你屏幕上就自动多出一段。

它属于 GNU coreutils,是 SRE 排查问题时刷得最多的命令之一。

二、命令语法 ​

bash
tail [选项]... [文件]...
  • [选项]:可选,控制看几行、是否实时跟踪;
  • [文件]:可选,指定看谁;不写就从标准输入读。

最简单的用法(默认后 10 行):

bash
tail long.txt

三、选项全表(对照 tail --help) ​

tail 选项比 head 多,核心是围绕"实时跟踪 -f"展开的。

1. 控制看多少行 / 多少字节 ​

选项中文含义什么场景用
-n NUM,--lines=NUM看最后 NUM 行;-n +NUM 表示从第 NUM 行看到结尾最常用,如 tail -n 20
-c NUM,--bytes=NUM看最后 NUM 个字节;-c +NUM 表示从第 NUM 字节看到结尾看文件尾部字节内容时

2. 实时跟踪(-f)相关选项(SRE 高频) ​

选项中文含义什么场景用
-f,--follow[=name|descriptor]文件增长时持续输出新增内容;默认按"文件描述符"跟踪盯实时日志(最常用)
-F等价于 --follow=name --retry日志会被轮转(改名)时用它,能自动跟新文件
--retry文件一开始打不开也不停重试,等它出现跟踪一个还没生成的日志文件时
--pid=PID跟 -f 配合,进程 PID 结束后自动退出跟踪跟踪某个进程的输出,进程死了就停
-s N,--sleep-interval=N-f 时每隔 N 秒检查一次新内容(默认 1 秒)降低轮询频率时
--max-unchanged-stats=N-f=name 模式下,连续 N 次大小没变就重新打开(应对日志轮转)一般用默认值即可

3. 多文件时的显示控制 ​

选项中文含义什么场景用
-q,--quiet,--silent不打印 ==> 文件名 <== 头输出要纯净给脚本时
-v,--verbose总是打印文件名头同时跟踪多个日志时想区分来源
-z,--zero-terminated行分隔符是 NUL 而不是换行处理特殊文件名输入时

四、由浅入深的典型示例 ​

演示文件都在 /tmp/sre_shard_txt 下,long.txt 是 1 到 50 共 50 行。

示例 1:默认看最后 10 行 ​

bash
tail long.txt
text
41
42
43
44
45
46
47
48
49
50

示例 2:指定看最后 3 行 ​

bash
tail -3 long.txt
text
48
49
50

tail -3 和 tail -n 3 等价。

示例 3:从第 N 行一直看到结尾 ​

bash
tail -n +48 long.txt
text
48
49
50

-n +48 的加号是关键:从第 48 行开始打印到结尾,这是 tail 独有的"切中段"用法。

示例 4:按字节看结尾 ​

bash
tail -c 16 long.txt
text
46
47
48
49
50

取文件末尾 16 个字节(含换行符)。

示例 5:一次看多个文件 ​

bash
tail -n 2 nums.txt demo.txt
text
==> nums.txt <==
100
7

==> demo.txt <==
apple
date

示例 6:实时跟踪日志(-f 的精髓) ​

先开一个会被持续写入的文件,另一个进程往里追加内容:

bash
tail -f follow.log

另一个进程每秒往里追加一行后,tail -f 会自动把新行滚出来:

text
line 1 appended
line 2 appended
line 3 appended

这就是线上 tail -f /var/log/nginx/access.log 的原理。按 Ctrl+C 退出跟踪。

示例 7:跟踪会被轮转的日志(-F) ​

bash
tail -F /var/log/nginx/access.log

日志通常每天被 logrotate 改名归档、再新建一个同名文件。-f 默认跟的是旧文件描述符,旧文件被改名后它就跟不到新文件了;用 -F(按文件名跟踪 + 重试),旧文件没了它会自动等待并跟上新建的同名日志。生产环境看日志优先用 -F。

示例 8:跟踪到某个进程结束自动停 ​

bash
tail -f --pid=1234 app.log

进程 1234 一旦退出,tail 自动结束跟踪,不用手动 Ctrl+C。写自动化脚本时很方便。

五、高频组合速记 ​

命令用途
tail 文件看最后 10 行
tail -n 50 文件看最后 50 行
tail -f 日志实时滚动跟踪新日志
tail -F 日志实时跟踪,且日志轮转后自动跟上(生产推荐)
tail -n +100 文件从第 100 行看到结尾
tail -f 日志 | grep ERROR一边跟踪一边只过滤错误行
tail -1000 日志 | less先看最近 1000 行再慢慢翻

六、RHEL 系与 Debian 系差异 ​

tail 属于 GNU coreutils,两系用法一致。仅有的实践差异:

  • 默认日志路径不同:RHEL 系日志常在 /var/log/messages,Debian/Ubuntu 常在 /var/log/syslog;
  • 日志轮转工具都是 logrotate,tail -F 都能正确跟新文件。

七、新手易错点 ​

  1. -f 不会自己退出:它会一直挂着跟踪,看完按 Ctrl+C 退出。
  2. 日志轮转后 -f 可能"哑火":旧日志被改名后,tail -f 还盯着已改名的旧文件,新内容进新文件它看不到——改用 tail -F。
  3. -n +N 和 -n N 方向相反:-n N 是倒数 N 行;-n +N 是从第 N 行到结尾,别混。
  4. 实时跟踪大文件别用 -c:-f 配 -c 行为反直觉,一般只配 -n。
  5. tail 只读不写:它不会改日志文件本身,可放心 Ctrl+C。
  6. 想"看完历史再实时跟":先 tail -n 100 看历史,再 tail -f;tail -f 默认会先打印最后 10 行再进入跟踪。

八、相关命令与文档 ​