
🐧 Linux 从零到实战 · 第1阶段 · 第1.3章:文件内容查看与管道重定向
🎨 核心概念可视化 · AI 生成本节目标
学完本章后,你将能够:
- ✅ 熟练使用 cat、less、head、tail 查看文件内容
- ✅ 理解 Linux 三大标准流:STDIN(0)、STDOUT(1)、STDERR(2)
- ✅ 掌握输出重定向 >、>>、2> 及组合用法
- ✅ 熟练使用管道符 | 将多个命令串联成"数据流水线"
- ✅ 能独立分析日志、过滤关键信息并保存到文件
核心概念
一、三大标准流(Standard Streams)
Linux 标准输入、输出与标准错误流示意图
Linux 中每个命令在启动时都会自动打开三个"数据通道",用数字 0、1、2 表示:
| 编号 | 名称 | 缩写 | 方向 | 默认去向 | 用途 |
|---|---|---|---|---|---|
| 0 | 标准输入 | STDIN | 输入 → 命令 | 键盘 | 命令读取的数据来源 |
| 1 | 标准输出 | STDOUT | 命令 → 输出 | 屏幕 | 命令正常执行后的结果 |
| 2 | 标准错误 | STDERR | 命令 → 错误 | 屏幕 | 命令出错时的提示信息 |
关键理解:STDOUT 和 STDERR 虽然默认都显示在屏幕上,但它们是两个独立的通道。这正是我们可以分别重定向它们的原因。
类比:把命令想象成一台榨汁机: - STDIN = 你放进去的水果(输入数据) - STDOUT = 榨出来的果汁(正常输出) - STDERR = 榨出来的渣/报错(错误信息)
二、重定向的本质
重定向就是改变数据流的默认去向——不让它去屏幕,而是让它去文件、去另一个命令、或者直接丢弃。
三、管道的哲学
管道符将多个命令串联成数据流水线
管道的核心思想是"组合小工具,解决大问题"。每个命令只做一件事,通过 | 把上一个命令的 STDOUT 接到下一个命令的 STDIN,像工厂流水线一样一环扣一环。
命令与操作
一、文件内容查看四件套
cat, less, head, tail 的查看范围对比
1. cat —— 一次性显示整个文件
cat 文件名
示例:
cat /etc/os-release # 查看系统版本信息
cat file1.txt file2.txt # 连续显示多个文件
cat -n /etc/passwd # -n 显示行号
⚠️ 注意:cat 会一次性把整个文件输出到屏幕。如果文件有几十万行,你的屏幕会被瞬间淹没——这时候要用 less。
2. less —— 分页浏览(大文件救星)
less 文件名
进入 less 后常用操作:
- 空格 / f:向下翻一页
- b:向上翻一页
- /关键词:向下搜索(按 n 下一个,N 上一个)
- g:跳到文件开头
- G:跳到文件末尾
- q:退出 less
示例:
less /var/log/syslog # 慢慢翻看系统日志
💡 记忆技巧:less is more(less 比 cat 更强大,是对经典 Unix 工具 more 的升级)。
3. head —— 只看文件开头
head 文件名 # 默认显示前 10 行
head -n 20 文件名 # 显示前 20 行
head -c 100 文件名 # 显示前 100 个字节
示例:
head -n 5 /etc/passwd # 快速看一眼 passwd 文件的前 5 行
4. tail —— 只看文件末尾(日志监控神器)
tail 文件名 # 默认显示最后 10 行
tail -n 50 文件名 # 显示最后 50 行
tail -f 文件名 # -f = follow,实时追踪新增内容
tail -f 是运维人员最常用的命令之一——当你想实时监控日志时:
tail -f /var/log/syslog # 实时看系统日志,有新内容会自动刷出来
# 按 Ctrl+C 退出
二、输出重定向
1. > 覆盖写入(STDOUT → 文件)
命令 > 文件名
输出重定向覆盖与追加的区别
示例:
echo "Hello Linux" > hello.txt # 把输出写入 hello.txt(覆盖原有内容)
ls /home > home_list.txt # 把 ls 结果写入文件
⚠️ 高危警告:> 会完全覆盖目标文件原有内容!如果文件已存在,里面的内容会瞬间消失,且无法恢复。
2. >> 追加写入
命令 >> 文件名
示例:
echo "第二行" >> hello.txt # 在 hello.txt 末尾追加,不覆盖
date >> log.txt # 把当前时间追加到日志文件
💡 最佳实践:写日志、记录数据时,几乎都用 >> 追加,而不是 > 覆盖。
3. 2> 重定向 STDERR(错误输出)
命令 2> 错误文件
示例:
find / -name "passwd" 2> /tmp/errors.txt
# 在根目录搜索 passwd 文件,权限不足的报错写入 errors.txt
# 正常的搜索结果仍然显示在屏幕上
4. 同时重定向 STDOUT 和 STDERR
命令 > 正确.log 2> 错误.log # 分别写入两个文件
命令 > 全部.log 2>&1 # STDOUT 和 STDERR 都写入同一个文件
命令 &> 全部.log # 简写形式(Bash 4.0+)
命令 >> 全部.log 2>&1 # 追加模式
示例:
apt update > /tmp/apt_out.log 2>&1 # 把 apt 更新的所有输出都记录到文件
5. 丢弃输出:/dev/null
/dev/null 是 Linux 的"黑洞"——任何数据写进去就消失了。
命令 > /dev/null # 丢弃正常输出
命令 > /dev/null 2>&1 # 丢丢所有输出(静默执行)
命令 &> /dev/null # 简写
示例:
ping -c 1 google.com > /dev/null 2>&1 && echo "网络通" || echo "网络断"
# 只关心 ping 是否成功,不需要看到输出
三、管道符 |
管道符把前一个命令的 STDOUT 连接到后一个命令的 STDIN。
命令1 | 命令2 | 命令3
示例:
ls -l /etc | head -n 10 # 列出 /etc 文件,只看前 10 个
cat /etc/passwd | grep "root" # 在 passwd 中搜索包含 root 的行
ps aux | grep nginx # 查看 nginx 进程是否在运行
history | tail -n 20 # 查看最近 20 条历史命令
管道组合拳实战
场景1:找出系统中占用空间最大的 10 个目录
du -sh /* 2>/dev/null | sort -rh | head -n 10
拆解:
- du -sh /*:统计根目录下每个文件夹的大小
- 2>/dev/null:丢弃权限不足的报错
- sort -rh:按数字逆序排序(-r 逆序,-h 识别 K/M/G 单位)
- head -n 10:只取前 10 个
场景2:统计当前有多少个用户在登录
who | wc -l
who:列出所有登录用户wc -l:计算行数(word count -lines)
场景3:查看某个端口被谁占用
ss -tlnp | grep :80
四、echo 与命令替换
echo 是最简单的输出命令:
echo "Hello World" # 输出文字
echo "当前目录:$(pwd)" # $() 执行命令并替换为结果
echo "今天是 $(date +%Y-%m-%d)" # 输出:今天是 2026-07-09
echo $PATH # 输出环境变量的值
速查表
文件查看命令
| 命令 | 用途 | 常用参数 |
|---|---|---|
cat |
显示整个文件 | -n 显示行号 |
less |
分页浏览 | / 搜索、q 退出、空格 翻页 |
head |
看开头 | -n 行数、-c 字节数 |
tail |
看末尾 | -n 行数、-f 实时追踪 |
重定向符号
| 符号 | 含义 | 示例 |
|---|---|---|
> |
覆盖写入 STDOUT | ls > out.txt |
>> |
追加写入 STDOUT | echo hi >> log.txt |
2> |
覆盖写入 STDERR | cmd 2> err.txt |
2>> |
追加写入 STDERR | cmd 2>> err.txt |
&> |
覆盖写入 STDOUT+STDERR | cmd &> all.txt |
2>&1 |
把 STDERR 合并到 STDOUT | cmd > out.txt 2>&1 |
/dev/null |
丢弃输出 | cmd > /dev/null 2>&1 |
管道与辅助命令
| 命令 | 用途 | 示例 |
|---|---|---|
\| |
管道:前者输出 → 后者输入 | ls \| grep txt |
wc |
统计行数/字数/字节数 | wc -l file(行数) |
sort |
排序 | sort -rn(数字逆序) |
uniq |
去重(需先排序) | sort file \| uniq |
tee |
同时输出到屏幕和文件 | cmd \| tee out.txt |
避坑指南
🚨 坑1:> 误清空重要文件
警告:使用 > 覆盖写入时请务必小心
事故现场:
echo $PATH > /etc/passwd # 本想追加,结果覆盖了整个密码文件!
防护:
- 写入重要文件前,先 cp 备份
- 用 >> 代替 >,除非你明确要覆盖
- Bash 可开启 set -o noclobber,防止 > 意外覆盖(用 >| 强制覆盖)
🚨 坑2:管道数据方向搞反
错误:
grep "root" | cat /etc/passwd # ❌ grep 没收到输入,在等键盘
正确:
cat /etc/passwd | grep "root" # ✅ 数据从 cat 流向 grep
记忆口诀:数据从左往右流,像河水一样——源头 | 过滤器 | 出口
🚨 坑3:tail -f 退出方式不对
新手常按 Ctrl+Z 想退出,结果进程被挂起到后台,还在偷偷占资源。
正确做法:按 Ctrl+C 终止。
🚨 坑4:管道只传递 STDOUT,STDERR 不进入管道
find / -name "passwd" | grep "root"
# 报错信息(STDERR) songs direct display on screen, won't be grep filtered
解决:先把 STDERR 合并到 STDOUT:
find / -name "passwd" 2>&1 | grep "root"
# 或者 Bash 4.0+ 简写:
find / -name "passwd" |& grep "root"
🚨 坑5:less 中搜索后忘记退出
less 是全屏程序,新手有时不知道怎么退出来。记住:按 q 退出(quit 的首字母)。
课后练习
练习1:基础查看(5 分钟)
- 用
cat查看/etc/hostname文件 - 用
less查看/var/log/syslog,搜索关键词 "error" - 用
head -n 3查看/etc/passwd的前 3 行 - 用
tail -n 5查看/etc/passwd的最后 5 行
练习2:重定向实战(10 分钟)
- 把
ls -l /etc的输出保存到/tmp/etc_list.txt - 把
date命令的输出追加到/tmp/my_log.txt - 执行
find /root -name "*.conf",把错误信息保存到/tmp/find_err.txt,正确结果保存到/tmp/ok.txt - 把
echo "test"的输出同时显示在屏幕并保存到/tmp/tee_test.txt(提示:用tee)
练习3:管道组合拳(15 分钟)
- 统计
/etc目录下有多少个.conf结尾的文件(提示:find | grep | wc) - 列出当前系统中所有正在运行的 bash 进程(提示:
ps aux | grep) - 找出
/var/log目录下最大的 5 个文件(提示:find | xargs ls -lhS | head) - 查看你的命令历史记录中最近 10 条(提示:
history | tail)
🌟 挑战题
写一条命令,实时统计 /var/log/syslog 中每分钟出现 "error" 的次数(提示:tail -f | grep | wc,结合 --line-buffered)。
参考
- GNU Coreutils 手册 - cat/less/head/tail:https://www.gnu.org/software/coreutils/manual/
- Bash 参考手册 - 重定向:https://www.gnu.org/software/bash/manual/html/node/Redirections.html
- Linux 手册 - stdio(3):https://man7.org/linux/man-pages/man3/stdio.3.html
- Ubuntu 官方文档 - 命令行基础:https://help.ubuntu.com/community/CommandlineHowto
- 《Linux 命令行与 shell 脚本编程大全》第 4-5 章
下一章预告:第 2.1 章《APT 包管理:安装、更新与卸载》——学会用 APT 装软件、更新系统、卸载程序,从此告别"软件怎么装"的困惑。