1.6 文件查看与文本编辑

预计阅读时间:18 分钟

📖 目录

学习目标

学完本章后,你将能够:

  • 使用 catlessheadtail 查看文件内容
  • tail -f 实时跟踪日志文件
  • 用 Nano 编辑文件(Ctrl 快捷键体系)
  • 在 Vim 中切换三种模式并完成基本编辑
  • wcsortuniqcuttr 处理文本数据
  • 理解文本文件与二进制文件的区别

核心知识

  • cat——连接文件并输出(concatenate),最直接的文本查看命令
  • less——分页查看器,支持上下滚动和搜索,是 more 的增强替代品
  • head / tail——查看文件的开头/结尾部分,tail -f 是监控日志的利器
  • Nano——最简单的终端文本编辑器,所有操作显示在屏幕底部
  • Vim——模式编辑器(普通/插入/可视/命令模式),学习曲线陡峭但效率极高
  • wc——统计行数、单词数、字符数(word count)
  • sort / uniq——文本排序和去重,经常配合使用
  • cut——按列或分隔符截取文本字段
  • tr——字符替换和删除(translate)

知识关联

  • 前置知识1.4:基本文件操作命令touchecho 用于创建有内容的文件,供本章练习查看;1.7:用户与权限管理 的权限知识帮你理解为什么有时无法读取某些文件
  • 后续影响1.7:用户与权限管理 的 grep/sed/awk 会大量结合本章命令(如 grep error log | head -20
  • 配套技术1.9:重定向与管道 的管道和重定向会扩展本章命令的组合能力
  • 在整个体系中的位置:查看文件是日常使用频率最高的操作之一——系统日志、配置文件、脚本输出,都需要用到本章工具

原理讲解

1. cat——最直接的查看命令

cat(concatenate 的缩写)将文件内容发送到标准输出(终端)。虽然名字来源于"连接",但它最常用的用法就是查看单个文件。

# 基本用法
cat /etc/os-release          # 查看操作系统信息
# 输出: PRETTY_NAME="Ubuntu 24.04.1 LTS"
# 输出: NAME="Ubuntu"
# 输出: VERSION_ID="24.04"
# 输出: VERSION="24.04.1 LTS (Noble Numbat)"
# 输出: ID=ubuntu
cat /proc/cpuinfo            # 查看 CPU 信息
# 输出: processor	: 0
# 输出: vendor_id	: GenuineIntel
# 输出: cpu family	: 6
# 输出: model		: 158
# 输出: model name	: Intel(R) Core(TM) i7-8700K CPU @ 3.70GHz

# 常用选项
cat -n file.txt              # 带行号显示
cat -b file.txt              # 仅给非空行编号
cat -s file.txt              # 压缩连续空行为一行

# 创建小文件(输入后按 Ctrl+D 结束)
cat > hello.txt
# 输出: (等待输入,Ctrl+D 结束)
Hello Linux!
This is input directly from terminal.
^D

# 合并多个文件
cat header.txt body.txt footer.txt > fullpage.html

# tac = cat 的反向
tac file.txt                 # 按行逆序显示
📝 标准输出(stdout) 在 Linux 中,每个进程都有三个标准数据流:stdin(0,键盘输入)、stdout(1,屏幕输出)、stderr(2,错误输出)。cat file 的本质是把文件内容写入 stdout。这是"一切皆文件"哲学的延伸——程序、键盘、显示器都是"文件"。

2. less——分页浏览大文件

对于大文件(如日志),直接 cat 会刷屏。这时用分页查看器 less("less is more"——比 more 更强)。

less /var/log/syslog         # 查看系统日志(需要 sudo)
# 输出: (进入分页浏览模式,按 q 退出)

# less 内部快捷键(记住这些就够用)
# 方向键 / PageUp / PageDown:上下左右翻页
# g / G:跳到文件开头 / 结尾
# /pattern:向下搜索(n = 下一个,N = 上一个)
# ?pattern:向上搜索
# F:实时跟踪(类似 tail -f),Ctrl+C 停止
# q:退出
# h:帮助

3. head 和 tail——只看文件的开头和结尾

# head:默认显示前 10 行
head /etc/passwd             # 前 10 行
# 输出: root:x:0:0:root:/root:/bin/bash
# 输出: daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
# 输出: bin:x:2:2:bin:/bin:/usr/sbin/nologin
# 输出: sys:x:3:3:sys:/dev:/usr/sbin/nologin
# 输出: sync:x:4:65534:sync:/bin:/bin/sync
# 输出: games:x:5:60:games:/usr/games:/usr/sbin/nologin
# 输出: man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
# 输出: lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
# 输出: mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
# 输出: news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
head -n 20 /etc/group        # 前 20 行
# 输出: (前 20 行 group 内容)
head -20 /etc/group          # 简写形式,同样前 20 行
# 输出: (前 20 行 group 内容)

# tail:默认显示最后 10 行
tail /var/log/syslog         # 最后 10 行
# 输出: Jul 30 14:30:00 ubuntu systemd[1]: Started System Logging Service
# 输出: Jul 30 14:30:05 ubuntu kernel: [    0.000000] Linux version 6.8.0-31-generic
# 输出: ...
tail -n 50 /var/log/syslog   # 最后 50 行
tail -f /var/log/syslog      # 实时跟踪(最常用!)
# 输出: (实时滚动显示日志,Ctrl+C 停止)
# 跟踪日志时在另一个终端操作(如 sudo apt update),观察日志实时更新
# Ctrl+C 停止跟踪

# 组合用法:从第 100 行开始看
tail -n +100 file.txt        # 从第 100 行到末尾
💡 tail -f 是系统管理员最宝贵的命令之一 排错时打开一个终端执行 tail -f /var/log/syslog,另一个终端复现问题,日志会实时滚动,直接看到错误信息。这比反复打开关闭文件高效 10 倍。

4. Nano——最简单的终端编辑器

如果你第一次接触终端编辑器,从 Nano 开始。

nano file.txt
# 输出: (进入 Nano 编辑器界面,底部显示快捷键)

# 屏幕底部显示所有快捷键(^ = Ctrl 键):
# Ctrl+O:保存(Write Out)
# Ctrl+X:退出
# Ctrl+K:剪切当前行
# Ctrl+U:粘贴
# Ctrl+W:搜索
# Ctrl+\:替换
# Ctrl+G:帮助

Nano 唯一的"模式"就是"你在打字"——没有 Vim 的模式切换困扰。当你只想改个配置文件时,Nano 是最快最直接的选择。

5. Vim——模式编辑器的哲学

Vim(Vi Improved)是 Linux 上最强大的文本编辑器,也是学习曲线最陡的工具之一。它的核心思想是模式编辑

四种基本模式

  • 普通模式(Normal):默认模式。按 h/j/k/l 移动光标,按 d/y/p 删除/复制/粘贴。按 i 进入插入模式,按 : 进入命令模式。
  • 插入模式(Insert):输入文本。按 Esc 返回普通模式。
  • 可视模式(Visual):选择文本块。按 v(字符)、V(行)、Ctrl+v(矩形块)。
  • 命令模式(Command-line):输入 : 后进入。`:w` 保存,`:q` 退出,`:wq` 保存并退出。
vim file.txt
# 输出: (进入 Vim 编辑器,默认处于普通模式)

# 第一步:打开文件 → 处于普通模式
# 按 i 进入插入模式 → 输入一些文字
# 按 Esc 回到普通模式

# 导航(普通模式)
h j k l          # 左 下 上 右(比方向键高效)
w b              # 跳到下一个/上一个单词开头
0 ^ $            # 绝对行首、行首(首个非空字符)、行尾
Ctrl+F Ctrl+B    # 下翻一页、上翻一页
gg G             # 文件开头、文件结尾
:42              # 跳到第 42 行

# 编辑(普通模式)
dd               # 删除当前行
yy               # 复制当前行
p P              # 在光标后/前粘贴
u Ctrl+R         # 撤销/重做
x                # 删除光标所在字符
r                # 替换光标所在字符
.                # 重复上一次操作(超强!)

# 搜索和替换
/pattern         # 向下搜索(n = 下一个,N = 上一个)
?pattern         # 向上搜索
:%s/old/new/g    # 全文替换(% = 所有行,g = 所有匹配)
:%s/old/new/gc   # 全文替换但逐个确认

# 保存和退出
:w               # 保存
:q               # 退出(如果文件未保存会报错)
:wq              # 保存并退出
:q!              # 不保存强制退出
ZZ               # 保存并退出(不用按 Shift+:)
💡 学习 Vim 的最佳路径 第一天只记这 7 个操作:i(进入插入模式)、Esc(回普通模式)、:wq(保存退出)、dd(删行)、u(撤销)、/(搜索)、h/j/k/l(移动)。然后运行 vimtutor(30 分钟交互教程)逐步扩展。

Vim vs Nano vs Emacs——为什么有这么多编辑器?

Linux 世界有众多编辑器,每种都有其设计哲学和最佳使用场景:

编辑器设计哲学学习曲线适合场景
Nano简单直观,底部显示快捷键极低(几分钟上手)快速修改配置文件、初学者
Vim模式编辑,手不离键盘陡峭(1-2 周适应)日常编码、服务器维护、远程编辑
Emacs可扩展的 Lisp 环境陡峭(但有图形化入门)重度文本编辑、邮件、调试、项目管理

为什么 Vim 是服务器上的默认选择? Vim 几乎预装在所有 Linux 发行版中(vi 命令通常指向 vim),而 Nano 和 Emacs 不一定预装。在紧急修复服务器配置时,你可能只有一个最小化的 Shell 环境——这时 Vim 是唯一可用的编辑器。这就是为什么即使你日常用 VS Code 或 Emacs,也应该学会 Vim 的基本操作。

为什么程序间用文本流通信?

Unix 的"文本流"哲学是其最强大的设计之一。程序通过标准输入(stdin)、标准输出(stdout)、标准错误(stderr)这三个文本流进行通信。这种设计的核心优势是通用性和可组合性

  • 任意两个程序可以串联cat file | grep error | sort | uniq -c 中,每个程序只关心文本输入输出,不需要知道上游是谁、下游是谁。这就是管道(pipe)的威力
  • 可读可调试:文本是人类可读的。你可以用 cat 查看管道中流动的数据,用 head 截取一部分,用 diff 比较两次运行的差异
  • 跨平台兼容:文本是所有操作系统都能理解的"通用语言"。Linux 服务器的输出可以直接通过 SSH 传到 Windows 终端显示

相比之下,Windows 的 COM/DCOM 组件使用二进制协议,调试困难且需要特殊工具。Unix 的文本流设计使得"小工具组合成强大系统"成为可能。

6. 文本统计与处理——wc、sort、uniq

# wc:统计
wc /etc/passwd               # 行数 单词数 字节数
# 输出:  48   78  2340 /etc/passwd
wc -l /etc/passwd            # 只有行数(最常用)
# 输出: 48 /etc/passwd
wc -w /etc/passwd            # 单词数
# 输出: 78 /etc/passwd
ls -l /usr/bin | wc -l       # 统计 /usr/bin 有多少个文件
# 输出: 2345

# sort:排序
sort names.txt               # 按字母序排序
# 输出: Alice
# 输出: Bob
# 输出: Carol
sort -r names.txt            # 逆序
sort -n numbers.txt          # 按数字排序(不是字母序!)
sort -t: -k3 -n /etc/passwd  # 按 UID(第 3 列以 : 分隔)排序

# uniq:去重(必须先 sort!因为 uniq 只比较相邻行)
sort names.txt | uniq               # 去重
sort names.txt | uniq -c            # 统计每个值的出现次数
sort names.txt | uniq -d            # 只显示重复行

# 经典组合:统计文件中单词出现频率
cat words.txt | sort | uniq -c | sort -rn | head -10

注意:uniq 只消除连续重复的行。这就是为什么需要用 sort 将相同行排在一起——之后 `uniq` 才能正确去重。这是 Linux 命令行"组合小工具"哲学的经典体现。

7. cut 和 tr——按列提取和字符转换

# cut:按列或分隔符提取
cut -d: -f1 /etc/passwd              # 提取用户名(: 分隔的第一列)
# 输出: root
# 输出: daemon
# 输出: bin
# 输出: sys
# 输出: sync
# 输出: ...
cut -d: -f1,3 /etc/passwd            # 提取用户名和 UID
# 输出: root:0
# 输出: daemon:1
# 输出: bin:2
# 输出: ...
cut -c1-10 file.txt                   # 提取每行的前 10 个字符

# tr:字符替换或删除
echo "hello" | tr 'a-z' 'A-Z'        # 转大写:HELLO
# 输出: HELLO
echo "hello world" | tr ' ' '\n'     # 空格替换为换行
# 输出: hello
# 输出: world
cat file.txt | tr -s ' '             # 压缩多个空格为一个
cat file.txt | tr -d '\r'            # 删除 Windows 换行符(\r\n → \n)

8. 文本文件 vs 二进制文件

Linux 不靠文件扩展名区别文件类型。系统通过文件内容("魔数"magic number)来识别:

# file 命令查看文件真实类型
file /etc/passwd               # ASCII text
# 输出: /etc/passwd: ASCII text
file /bin/ls                   # ELF 64-bit LSB pie executable(二进制)
# 输出: /bin/ls: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV)
file photo.jpg                 # JPEG image data
# 输出: photo.jpg: JPEG image data, JFIF standard 1.01
file unknown.data              # 可能显示 data(不确定)
# 输出: unknown.data: data

尝试用 catless 打开二进制文件会显示乱码,因为终端试图把二进制数据解释为文本。这不是 bug——是你用错了工具。查看二进制文件请用 od(八进制转储)或 xxd(十六进制转储)。

示例代码

# 练习 1:先用 echo 和 cat 创建练习文件
cd ~
# 输出: (无输出)
cat > shopping.txt
# 输出: (等待输入,Ctrl+D 结束)
milk
eggs
bread
apples
milk
eggs
^D                  # Ctrl+D 结束输入

# 练习 2:cat 家族
cat shopping.txt
# 输出: milk
# 输出: eggs
# 输出: bread
# 输出: apples
# 输出: milk
# 输出: eggs
cat -n shopping.txt
# 输出:      1	milk
# 输出:      2	eggs
# 输出:      3	bread
# 输出:      4	apples
# 输出:      5	milk
# 输出:      6	eggs
tac shopping.txt
# 输出: eggs
# 输出: milk
# 输出: apples
# 输出: bread
# 输出: eggs
# 输出: milk

# 练习 3:head 和 tail
head -100 /etc/group               # 前 100 组的列表
# 输出: (前 100 行 /etc/group)
tail -20 /var/log/dpkg.log         # 最近 20 条包管理日志(如果有)
# 输出: (最后 20 行 dpkg.log)
# 实时跟踪(在一个终端执行,另一个终端做点操作)
# 终端 1:tail -f /var/log/syslog
# 终端 2:ping -c 1 8.8.8.8

# 练习 4:less 分页
less /etc/services                 # 约 14000 行的服务/端口映射表
# 输出: (进入分页浏览模式)
# 按 / 搜索 "http",按 n 跳到下一个匹配
# 按 g 到文件头,按 G 到文件尾

# 练习 5:wc / sort / uniq
wc -l /etc/passwd                  # 多少用户?
# 输出: 48 /etc/passwd
wc /var/log/syslog                 # 日志有多长?
# 输出: 123456 987654 12345678 /var/log/syslog
sort shopping.txt                  # 排序购物清单
# 输出: apples
# 输出: bread
# 输出: eggs
# 输出: eggs
# 输出: milk
# 输出: milk
sort shopping.txt | uniq -c        # 看买了几个鸡蛋几瓶牛奶
# 输出:   1 apples
# 输出:   1 bread
# 输出:   2 eggs
# 输出:   2 milk

# 练习 6:cut 和 tr
cut -d: -f1,7 /etc/passwd          # 用户名和 SHELL
# 输出: root:/bin/bash
# 输出: daemon:/usr/sbin/nologin
# 输出: ...
echo "user@example.com" | cut -d@ -f1   # 提取用户名部分
# 输出: user
echo "Hello World" | tr 'A-Za-z' 'N-ZA-Mn-za-m'  # ROT13 加密!
# 输出: Uryyb Jbeyq
echo "some,data,from,csv" | tr ',' '\t'          # CSV 转 TSV
# 输出: some	data	from	csv

# 练习 7:Nano 速练
nano ~/nano-test.txt
# 输出: (进入 Nano 编辑器界面)
# 输入几行文字
# Ctrl+O 保存 → Enter → Ctrl+X 退出

# 练习 8:Vim 速练
vim ~/vim-test.txt
# 输出: (进入 Vim 编辑器,普通模式)
# 按 i 进入插入模式 → 输入文字
# 按 Esc 回到普通模式
# 输入 :wq 保存退出

常见错误

错误/误区解决方案
"用 cat 看大文件导致终端卡死"大文件(几百 MB 的日志)用 less 分页查看。如果已经用 cat "刷屏"了,按 Ctrl+C 中断。
"在 Vim 里输入了奇怪的操作退出不了"按 Esc 三次确保在普通模式 → 输入 :q! + Enter 强制退出。如果卡在"记录宏"(recording),按 q 取消。如果不行,按 Ctrl+C 或 Ctrl+[(Esc 的替代键)。
"cat 显示二进制文件导致终端乱码"运行 reset 命令可恢复终端显示。以后查看二进制文件用 file 先判断类型,再用 odxxd 查看。
"在 Nano 里以为 ^X 是 Ctrl+Shift+X"^ 在 Nano 快捷键中始终代表 Ctrl 键。^X = Ctrl+X,^O = Ctrl+O,不是 "Ctrl+Shift"。
"用 uniq 但重复行没去掉"忘记了 uniq 只去"相邻重复"。先用 sort 排序,再通过管道传给 uniqsort file | uniq 而不是 uniq file
"wc -l 统计的行数比预期少一行"如果文件最后一行没有换行符,wc -l 不会计数。多数编辑器(包括 Vim)会自动在文件末尾加换行符,但 echo -n 不会。

最佳实践

#建议说明
1看小文件用 cat,看大文件用 less文件 < 50 行用 cat;文件 > 50 行用 less;只看开头结尾用 head/tail。
2监控日志就用 tail -f不要反复 less 打开关闭同一个日志文件。tail -f 实时跟踪新追加的行。
3配置文件修改先用 Nano/Vim 编辑,不要用 echo 重定向覆盖用编辑器可以看到文件原有内容(注释、其他配置),避免破坏已有配置。尽量用编辑器而不是 echo > file
4Vim 至少学到可以编辑配置文件的程度记住 iEsc:wqddu/ 这 6 个操作,就能应对 90% 的日常编辑场景。
5小文本处理在命令行完成,不要复制到 Excelcut + sort + uniq + wc 可以完成大部分日志分析、数据统计工作。一旦习惯,效率远超图形化工具。
6file 命令识别未知文件不要靠扩展名猜测文件类型。file 通过文件头(magic number)精确识别文档、图片、压缩包、可执行文件等。

练习题

  1. (概念)catless 分别适合什么场景?为什么说 lessmore 更强?
  2. (概念)Vim 的四种模式是什么?为什么 Vim 设计成"模式编辑器"而不是像 Nano 一样一直可以输入?
  3. (实操)cat 合并 /etc/hostname/etc/hosts 到一个新文件 ~/network-info.txt
  4. (实操)/var/log/ 中找一个日志文件(如果有权限),用 tail -f 实时监控。在另一个终端中执行 ping 127.0.0.1 -c 3,观察日志变化。
  5. (实操)cut -d:/etc/passwd 中提取所有用户名,按字母序排序,统计总共有多少个不同的 Shell(第 7 列)被使用。
  6. (探究 🔍)运行 file /bin/* | head -30,看看 /bin 目录下有哪些不同类型的文件。注意区分 ELF 可执行文件、脚本(Bourne-Again shell script)、符号链接。
  7. (探究 🔍)od -c file.txt 查看文本文件的底层字节表示。特别注意空格、换行符(\n)、Tab(\t)在 od 输出中的样子。
点击查看答案
  1. (概念)`cat` 适合查看小文件(几十行以内)或快速合并文件,一次性输出全部内容。`less` 适合查看大文件,支持分页、搜索(/ 键)、前后翻页。`less` 比 `more` 强在支持向后翻页(↑/PageUp),`more` 只能向前翻页。
  2. (概念)Vim 四种模式:普通模式(Normal)、插入模式(Insert)、可视模式(Visual)、命令行模式(Command-Line)。Vim 设计成模式编辑器是因为模式分离大幅提升编辑效率——普通模式下用单个按键(dd 删行、yy 复制、p 粘贴)完成操作,无需 Ctrl 组合键。
  3. (实操)`cat /etc/hostname /etc/hosts > ~/network-info.txt`。cat 按文件顺序连接,hostname 在前,hosts 在后。用 `cat ~/network-info.txt` 验证。也可用 `>` 覆盖写入,`>>` 追加写入。
  4. (实操)`sudo tail -f /var/log/syslog`(需 root 读取系统日志)。在另一终端执行 `ping 127.0.0.1 -c 3`,观察 syslog 中是否有 ping 相关记录。tail -f 是实时监控日志的标准方法,按 Ctrl+C 退出。
  5. (实操)命令组合:`cut -d: -f1 /etc/passwd | sort`(提取用户名并排序),`cut -d: -f7 /etc/passwd | sort | uniq -c | sort -rn`(统计各 Shell 使用人数)。uniq 只去相邻重复,所以必须先 sort。
  6. (探究 🔍)`file /bin/* | head -30` 输出文件类型。常见类型:ELF 可执行文件(编译的二进制)、Bourne-Again shell script(Bash 脚本)、symbolic link to ...(符号链接)。`file` 命令识别类型靠文件头魔数而非扩展名。
  7. (探究 🔍)`echo "Hello World" | od -c` 显示每个字节的字符表示。换行符 = `\n`,Tab = `\t`,空格 = 空格。`od -c` 是排查文本编码和空白符问题的利器。配合 `od -A x -t x1z` 可查看十六进制。

学习检查点

学完本章后,请检验自己是否掌握以下内容:

检查项自测问题验证方法
概念理解能用自己的话解释 stdin/stdout/stderr 三个标准数据流尝试向他人讲解
命令操作能不查文档使用 cat、less、head、tail、wc、sort、cut 处理文本在终端实际执行
原理掌握能说出 tail -f 实时跟踪日志的工作原理画出数据流图
故障排查能独立使用 less 和 / 搜索功能在大文件中定位信息模拟查找并定位
最佳实践能说明为什么查看大文件应该用 less 而不是 cat对比不同查看方式

本章总结

查看文件内容是你每天都会做的基本操作。本章覆盖了从快速浏览(cat)到分页查看(less)、从查看开头结尾(head/tail)到实时跟踪(tail -f)、从终端编辑(Nano/Vim)到文本统计处理(wc/sort/uniq/cut/tr)的完整工具链。

速查表

概念一句话定义
cat连接并显示文件内容(小文件适用)
less分页查看大文件(支持搜索和导航)
tail -f实时跟踪文件追加内容(日志监控利器)
Nano最简单的终端编辑器(快捷键显示在底部)
Vim 模式普通/插入/可视/命令四种模式,模式编辑提高效率
sort | uniq经典组合:先排序再去重(uniq 只去相邻重复)
cut按分隔符或字符位置提取列
tr字符替换和删除(管道处理)

下一步:进入 1.7:用户与权限管理「文本处理三剑客」,深入学习 grep、sed、awk 三个强大的文本处理工具。

延伸阅读

常见问题

cat 查看大文件卡死了怎么办?
不要用 cat 查看大文件!超过几百行的文件用 less(可上下翻页、搜索)或 head/tail(只看首尾)。less 只加载当前屏幕内容,对大文件非常友好。忘记 cat 看文件吧,记住:cat 用于拼接文件,less 用于阅读文件。
vim 怎么退出?
这是每个 vim 新手遇到的第一堵墙。按下 Esc 确保处于正常模式,然后按 :q 回车退出。若有未保存修改用 :q! 强制退出(不保存),保存并退出用 :wq 或 ZZ。配合 vimtutor 命令花 30 分钟做完内置教程,从此不再被 vim 卡住。
nano 和 vim 我应该学哪个?
两个都值得学。nano 上手极快,底部就有快捷键提示,适合快速编辑配置文件。vim 学习曲线陡峭但编辑效率极高,是服务器运维的必备技能。建议先用 nano 处理急事,每天用 vimtutor 学 15 分钟,一个月后你就会主动抛弃 nano。
↑ 回到顶部