tail 是什么
tail 输出文件末尾若干行,默认 10 行,与 head 互为对偶。它有两种典型用法:静态取样(-n 指定行数、-c 指定字节数)与动态跟随(-f 跟随文件描述符、-F 跟随文件名并在轮转或短暂消失后重新打开)。其中 -n +N 是从第 N 行开始输出到文件末尾,与 -n N 的含义差别很大,写脚本时容易混淆,需要特别留意。
基本信息
| 适用平台 | Linux、macOS、BSD(GNU coreutils / BSD tail) |
|---|---|
| 命令语法 | tail [选项] [文件...] |
| 常用选项 | -n N 末尾 N 行、-n +N 从第 N 行到末尾、-c N 末尾 N 字节、-f 跟随描述符、-F 跟随文件名并重试、-q 多文件不显示文件名头、-v 强制显示文件名头、--pid 指定进程退出后结束 |
| 实现特点 | tail 从文件末尾向前定位,不读取全文,所以查看几十 GB 日志的最后几行同样很快 |
| 权限要求 | 需要文件的读权限;系统日志通常只对 root 与特定组合开放 |
典型使用场景
- 查看最新记录:取最后几十行确认最近一次操作的结果
- 定位报错:从大日志尾部往前找最近的异常堆栈
- 实时观察:写日志的同时用 -f 或 -F 跟随输出,验证改动是否生效
- 按行号截取:用 -n +N 跳过开头大量内容,只看某一行之后的部分
- 多文件汇总:同时列出多个日志的尾部,快速比较不同组件的最新状态
- 脚本取数:取末尾固定行数交给后续处理,例如解析最近一条统计记录
常用示例
常用示例
tail -n 50 app.log
tail -f app.log # 实时跟随(Ctrl+C 退出)
tail -F app.log # 跟随轮转:文件被切走后自动追新文件
tail -n +100 app.log # 从第 100 行开始到结尾
tail -c 200 app.log # 取末尾 200 字节
tail -q app.log error.log # 多文件但不打印文件名分隔头
tail -F --pid=1234 app.log # 目标进程退出后自动停止
less +F app.log # 既能跟随又能翻页(Ctrl+C 暂停跟随)选项对照
| 选项 | 作用 | 注意 |
|---|---|---|
| -n N | 输出末尾 N 行 | N 前加 + 时含义变为「从第 N 行开始」 |
| -n +N | 从第 N 行输出到文件末尾 | 常用于跳过头部说明后再处理 |
| -f | 跟随文件描述符 | 日志轮转后会停留在旧文件 |
| -F | 跟随文件名并在失败后重试 | 线上看日志的标准选择 |
| -q / -v | 是否输出文件名分隔头 | 多文件跟随时用来区分来源 |
| --pid | 指定进程退出后结束跟随 | 配合服务启动观察很实用 |
要在文件头尾之间来回查看,用 less 更顺手:less 打开后按 G 跳到末尾、按 g 回到开头,用 +F 参数启动可以直接进入跟随模式,按 Ctrl+C 暂停跟随即可向上翻页。单纯只想取末尾几行时 tail 仍是开销最小的选择。用 -c 按字节截取时注意多字节字符可能被切断,处理中文日志建议改用行模式 -n。
跟随的目标由谁写决定了工具选择:应用自己写文件用 tail -F,应用把日志交给 systemd 则用 journalctl -f -u 单元名,后者还能按时间窗与优先级过滤。方向选错会以为日志没有输出。另外 tail 可以一次跟随多个文件,输出里会用 ==> 文件名 <== 标明来源,方便同时观察应用日志与网关日志。
在 NFS 等网络文件系统上,跟随的实时性受客户端属性缓存影响,远端写入不一定立刻可见;跨主机看日志应直接连到源主机执行,而不是挂在共享目录上 tail -F。
常见组合
| 组合 | 用途 | 注意 |
|---|---|---|
| tail -F 日志 | grep --line-buffered 关键词 | 只看关心的行 | 不加缓冲参数会看起来卡住 |
| tail -n 200 日志 | less | 先取样再分页翻 | 静态快照,不跟随 |
| journalctl -f -u 单元名 | 服务日志跟随 | 应用把日志交给 systemd 时首选 |
| tail -F 日志 >> 归档文件 | 边看边留档 | 注意磁盘占用 |
在不能使用内核事件通知的环境里,跟随模式会按固定间隔(默认约 1 秒)轮询重试打开文件,所以文件刚被轮转时可能有极短断点。对完全不能断档的高频日志,应优先用 journal 或让应用直接输出到已重定向的管道。