一、cat:小文件的"一锅端"查看器
cat 是 concatenate(连接) 的缩写,它最朴素的用法就是一次性把文件内容全部输出到屏幕。
语法格式
cat [选项] [文件...]
常用参数说明
| -n | 显示行号(包括空行) |
| -b | 仅给非空行编号 |
| -A | 显示所有不可见字符(如 $ 表示行尾、^I 表示 Tab) |
| -s | 压缩连续空行为一行 |
| -E | 在每行行尾显示 $ |
示例与预期输出
示例 1:查看文件并带行号
cat -n /etc/hostname
预期输出:
1web-server-01
示例 2:把多个文件拼接成一个
cat part1.txt part2.txt > full.txt
wc -l full.txt
预期输出:
8 full.txt
⚠️ 注意事项
cat 适合小文件,一旦文件超过几千行,内容就会刷屏,前面的内容根本来不及看。此时应该换 less。另外用 cat 查看二进制文件会出现乱码并可能干扰终端,除非用 -v 等选项,否则别这么干。
常见错误:cat file 后面误加管道符号 | 再接一个不存在的命令,导致文件内容丢失进黑洞?其实不会——管道只会报错,但如果你写成 cat file > newfile 而 newfile 拼错了名字,原文件内容才会真的被覆盖。重定向要格外小心(第 18 篇会细讲)。
二、less:大文件的"翻页浏览器"
less 的名字来自对早期 more 的调侃——“less is more”(少即是多)。它的核心优势是只加载当前屏幕需要的内容,所以几十 GB 的日志也能秒开。
语法格式
less [选项] 文件
交互式操作速查
| 空格 / f | 下一页 |
| b | 上一页 |
| g / G | 跳到文件开头 / 末尾 |
| /关键词 | 向下搜索,n 下一个,N 上一个 |
| ?关键词 | 向上搜索 |
| q | 退出 |
| -N(进入后按) | 切换行号显示 |
示例与预期输出
示例:打开系统日志搜索报错
less /var/log/syslog
进入后输入 /mysql,文件会高亮并跳到第一个匹配位置。按 n 继续找下一个。
常见启动参数:
less -N file.log # 进入即显示行号
less -i file.log # 搜索时忽略大小写
less +G file.log # 直接打开文件末尾(看最新日志)
less +/ERROR file.log # 打开后直接定位到第一个 ERROR
+G 这个技巧非常实用:less +G app.log 相当于"打开文件直接看最后",配合 /关键词 回搜,排查线上问题效率极高。
💡 场景说明
less 是查看日志的主力工具。它不会像 cat 那样把终端刷爆,也支持搜索、跳转、甚至用 v 键直接调用 vim 编辑当前文件。
三、tail:盯着文件"尾巴"看更新
tail 输出文件的末尾内容,它的看家本领是 -f 模式——实时跟踪文件追加的新内容。
语法格式
tail [选项] 文件
常用参数说明
| -n 数字 | 显示最后 N 行(-n 50 等价于 -50) |
| -f | 持续跟踪文件新增内容(follow) |
| -F | 跟踪并处理文件被轮转(rename)的情况 |
| -q | 同时跟踪多个文件时不打印文件头 |
示例与预期输出
示例 1:查看最后 20 行
tail -n 20 /var/log/nginx/access.log
预期输出(节选):
192.168.1.5 – – [16/Sep/2026:10:00:01 +0800] "GET / HTTP/1.1" 200 6120
192.168.1.5 – – [16/Sep/2026:10:00:02 +0800] "GET /css/style.css HTTP/1.1" 200 8841
示例 2:实时跟踪日志
tail -f /var/log/myapp/app.log
此时终端会"挂住",新日志一行行冒出来。按 Ctrl + C 退出跟踪。
⚠️ -f 与 -F 的区别
这是面试高频考点。当日志按天轮转(比如 app.log 被重命名为 app.log.1,新文件重新创建为 app.log)时:
- tail -f app.log:只盯着旧文件的 inode,轮转后不再输出新内容;
- tail -F app.log:按文件名重新打开,自动切换到新文件继续跟踪。
生产环境排障请无脑用 -F,避免日志轮转后"假死"。
四、vim:命令行编辑器中的"瑞士军刀"
vim 是 vi 的增强版,几乎所有主流 Linux 发行版都内置了 vi,Ubuntu 等发行版也默认安装了 vim。它是你修改配置文件的唯一"正牌武器"。
三种模式(核心中的核心)
| 普通模式 | 移动光标、复制删除 | 启动即进入 |
| 插入模式 | 输入文字 | 普通模式按 i(当前字符前)/ a(后)/ o(下方新行) |
| 命令行模式 | 保存、退出、搜索 | 普通模式按 : 或 / |
最小可用操作集
| 进入插入模式 | i |
| 返回普通模式 | Esc |
| 保存 | :w |
| 退出 | :q |
| 保存并退出 | :wq 或 ZZ |
| 不保存强制退出 | :q! |
| 撤销 | u |
| 搜索 | /关键词 回车,n 下一个 |
| 跳转到某行 | :100 回车 |
示例与预期输出
示例:修改 Nginx 端口
vim /etc/nginx/sites-available/default
进入后:
⚠️ vim 异常退出的 swap 文件
如果 vim 崩溃或 SSH 断线,再次打开文件会提示 .file.swp 已存在。此时:
- 按 R 恢复上次未保存的内容;
- 确认文件没问题后,用 rm .file.swp 删除交换文件(注意是隐藏文件,以 . 开头)。
五、四个工具怎么选?一张表说清
| 查看几十行的小文件 | cat | 快、简单,还能拼接文件 |
| 翻看几百 MB 的日志 | less | 分页加载、可搜索、可跳转 |
| 盯着日志实时输出 | tail -F | 实时跟踪,轮转也不怕 |
| 修改配置文件 | vim | 编辑器,功能全面 |
| 快速创建小文件 | cat > file <<EOF | 无编辑器也能写内容 |
六、知识扩展:tail 实时跟踪背后的原理
tail -f 之所以能"实时",早期实现是轮询:每秒去检查文件有没有变大。现代 Linux 上,tail 会优先使用 inotify 机制——内核在文件被写入时主动发通知,tail 收到通知立刻读出新数据,既省资源又即时。
而"文件被写入"的本质,是写入者持有一个指向 inode 的文件描述符。tail -F 能处理轮转,是因为它记住了文件名 → inode 的映射,一旦发现当前 inode 不再增长,就重新按文件名打开新文件。理解了 inode,你就同时理解了 tail -F 和软/硬链接(第 16 篇会展开)。
顺带一提,tail -f 也可以直接接多个文件,比如 tail -F /var/log/nginx/*.log,多文件会打印各自的文件头。




