主题
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.txttext
41
42
43
44
45
46
47
48
49
50示例 2:指定看最后 3 行
bash
tail -3 long.txttext
48
49
50
tail -3和tail -n 3等价。
示例 3:从第 N 行一直看到结尾
bash
tail -n +48 long.txttext
48
49
50
-n +48的加号是关键:从第 48 行开始打印到结尾,这是tail独有的"切中段"用法。
示例 4:按字节看结尾
bash
tail -c 16 long.txttext
46
47
48
49
50取文件末尾 16 个字节(含换行符)。
示例 5:一次看多个文件
bash
tail -n 2 nums.txt demo.txttext
==> 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都能正确跟新文件。
七、新手易错点
-f不会自己退出:它会一直挂着跟踪,看完按Ctrl+C退出。- 日志轮转后
-f可能"哑火":旧日志被改名后,tail -f还盯着已改名的旧文件,新内容进新文件它看不到——改用tail -F。 -n +N和-n N方向相反:-n N是倒数 N 行;-n +N是从第 N 行到结尾,别混。- 实时跟踪大文件别用
-c:-f配-c行为反直觉,一般只配-n。 tail只读不写:它不会改日志文件本身,可放心Ctrl+C。- 想"看完历史再实时跟":先
tail -n 100看历史,再tail -f;tail -f默认会先打印最后 10 行再进入跟踪。
八、相关命令与文档
- 速查页:Linux 命令速查
- 看文件开头:
head(详解见 head) - 大文件分页翻:
less(详解见 less 与 more) - 从日志里筛关键词:
grep(详解见 grep) - 管道组合:见 重定向与管道