tail命令专用于显示文件末尾内容,默认输出最后10行;常用写法为tail -n n(空格分隔),支持实时监控(-f)、轮转跟踪(-f)、多文件区分(-v)及从指定行起输出(-n +k)等特性。

直接用 tail 就行,不用绕弯子——它专为这事设计,比 cat | tail 或 sed 更轻量、更可靠。
tail -n N 是最常用也最容易写错的写法
很多人输成 tail -nN(中间没空格)或 tail -n=N,结果报错:invalid number of lines。正确写法必须是空格分隔:tail -n 100 access.log。
-
tail -n 100和tail -100等价,但前者更明确、更易读,建议统一用带-n的形式 - 省略
-n直接写tail -100在某些老系统(如 BusyBox)里不支持,存在兼容风险 - 如果文件行数少于指定值(比如
tail -n 100 empty.log),tail会输出全部内容,不会报错也不会补空行
实时看日志别只加 -f,得先看最后几行再跟进
单独用 tail -f access.log 只显示最新追加的内容,根本看不到上下文——排查问题时大概率一头雾水。正确做法是组合使用:
-
tail -n 100 -f access.log:先输出最后 100 行,再持续追加新内容 - 如果日志轮转频繁(比如
access.log.1被切走),-f会卡住不动;换用-F(大写 F)可自动跟踪重命名/重建的文件 - 配合
--pid可在目标进程退出后自动停止监听:tail -n 50 -f --pid=$(pgrep nginx) error.log
多文件查看时 -v 不是可选项,是必需项
运行 tail -n 20 app.log error.log,输出会混在一起,根本分不清哪行来自哪个文件。加上 -v 就能立刻区分:
==> app.log error.log
- 默认多文件时会加
==> filename 头,但若某文件为空,<code>tail可能跳过该头——加-v强制显示,避免误判 -
-q(quiet)会压制所有头信息,适合脚本中提取纯数据,但交互式排查时禁用 - 通配符如
tail -n 10 *.log本质也是多文件处理,同样需要-v辨识来源
中文日志或二进制污染时,-n 可能不准
tail -n 按换行符计数,遇到无换行结尾的文件、含 \r\n 的 Windows 日志、或混入二进制数据(如 core dump 截断日志),行数可能偏移甚至卡死。
- 怀疑编码问题时,先用
file -i logfile查 MIME 类型,再用iconv转码后查 - 权限不足导致读取中断?
tail默认静默失败;加--verbose或检查strace tail -n 10 file输出 - 超大文件(>10GB)用
-n依然快,但若需精确从某行起查,-n +500000比反复head/sed更稳
真正麻烦的不是命令记不住,而是看到 tail -n 100 -f 输出一堆重复时间戳时,忘了检查日志是否被多个进程并发写入——这时候行号和时间都不可信,得结合 lsof -p PID 锁定源头。











