Linux tail 命令超详细保姆级教程
一、命令基础作用
tail 用于查看文件末尾内容 ,最常用场景:实时监控日志(系统日志、应用日志、Nginx/Java日志)。
默认输出文件最后 10 行。
基础语法
bash
tail [参数] 文件名
二、默认用法(无参数)
直接读取文件最后10行
bash
tail app.log
三、核心常用参数大全
1. -n:指定显示末尾多少行
格式:-n 数字,简写 -数字
bash
# 查看最后20行
tail -n 20 app.log
# 简写写法(最常用)
tail -20 app.log
# 特殊:+数字,从第N行开始输出到文件结尾
# 从第50行开始打印全部内容
tail -n +50 app.log
2. -f:实时跟踪文件新增内容(日志监控核心)
文件新增一行,终端立刻刷新输出,不会退出,适合看实时日志。
bash
tail -f app.log
退出监控快捷键:Ctrl + C
补充:-F 比 -f 更强大
-f 缺陷:日志文件被日志切割(logrotate 重命名/新建)后,会停止跟踪;
-F 会持续监听文件名,文件重建/切割后自动切换新文件。
线上监控日志必用 -F
bash
tail -F app.log
3. -c:按字节显示末尾内容
bash
# 输出文件最后500个字节
tail -c 500 app.log
# +500:从第500字节输出到结尾
tail -c +500 app.log
4. -q:静默模式,多文件时不打印文件名
同时查看多个文件时,默认会输出 ==> 文件名 <== 分隔,-q 取消头部文件名:
bash
# 同时看两个日志,不显示文件名
tail -q -f app.log nginx.log
5. -v:强制打印文件名(多文件场景)
bash
tail -v -10 app.log nginx.log
6. -s:设置 -f 刷新间隔(单位秒)
默认0.1秒刷新一次,可自定义延迟,减少CPU占用:
bash
# 每2秒刷新一次日志
tail -s 2 -F app.log
7. -pid:配合 -f,进程结束自动退出tail
监控程序日志,程序进程挂了,tail自动停止,不用手动Ctrl+C
bash
# 12345为目标进程PID
tail -F --pid=1234 app.log
四、高频组合实战命令(工作最常用)
1. 实时监控日志,只看最后100行
bash
tail -n 100 -F app.log
# 简写
tail -100F app.log
2. 实时日志 + grep 过滤关键词(排查报错)
只打印包含 error 的实时日志
bash
tail -F app.log | grep -i error
# -i 忽略大小写 Error/ERROR 都匹配
# -A5 匹配行后多打印5行日志
tail -F app.log | grep -i -A5 error
# -B5 匹配行前5行
tail -F app.log | grep -i -B5 error
# -C5 前后各5行
tail -F app.log | grep -i -C5 error
3. 同时监控多个日志文件
bash
tail -F app.log nginx.log mysql.log
4. 从文件第1000行查看全部内容(跳过前面垃圾日志)
bash
tail -n +1000 app.log
5. 只看日志末尾1000字节
bash
tail -c 1000 app.log
五、高级进阶用法
1. 管道结合其他命令
实时日志分页查看(配合less)
bash
tail -F app.log | less
# less内快捷键:Shift+F 持续跟踪日志
统计实时报错行数
bash
tail -F app.log | grep error | wc -l
2. 输出到新文件保存实时日志
bash
tail -F app.log > new_log.txt
3. 后台静默监控(不占用终端)
bash
nohup tail -F app.log > monitor.log 2>&1 &
# 关闭终端依然持续收集日志
# 查看后台任务:jobs
# 关闭任务:kill %1
六、-f 和 -F 核心区别(重点避坑)
| 参数 | 行为 | 适用场景 |
|---|---|---|
-f |
跟踪文件句柄,文件改名/切割后失效 | 临时测试、不会切割的小文件 |
-F |
按文件名持续寻找文件,切割自动重连 | 线上生产日志(logrotate自动切割) |
线上服务器一律使用 -F,否则日志分割后看不到新日志。
七、常见问题与排错
- tail -f 看不到新日志
- 原因1:日志被logrotate切割,改用
tail -F - 原因2:程序缓冲区未刷新,部分程序需要手动flush日志
- 原因1:日志被logrotate切割,改用
- tail 读取超大文件卡顿
优先用-n限制行数,不要直接读取全量;或使用less - 监控大量日志CPU过高
使用-s 1延长刷新间隔,降低轮询频率
八、配套对比:head / cat / less
tail:看尾部、实时监控日志head:查看文件头部(默认前10行)cat:一次性输出整个文件,大文件慎用less:分页浏览,支持上下翻页
head+tail组合:查看中间指定区间行
示例:查看文件100~120行
bash
head -n 120 app.log | tail -n 20