← 返回 Linux 从零到实战 目录
文件内容查看与管道重定向 封面
🖼️ 本章封面 · 由 NVIDIA AI 生成

🐧 Linux 从零到实战 · 第1阶段 · 第1.3章:文件内容查看与管道重定向

文件内容查看与管道重定向 概念图
🎨 核心概念可视化 · AI 生成
本节目标

学完本章后,你将能够: - ✅ 熟练使用 catlessheadtail 查看文件内容 - ✅ 理解 Linux 三大标准流:STDIN(0)、STDOUT(1)、STDERR(2) - ✅ 掌握输出重定向 >>>2> 及组合用法 - ✅ 熟练使用管道符 | 将多个命令串联成"数据流水线" - ✅ 能独立分析日志、过滤关键信息并保存到文件


核心概念

一、三大标准流(Standard Streams)

Linux 标准输入、输出与标准错误流示意图 Linux 标准输入、输出与标准错误流示意图

Linux 中每个命令在启动时都会自动打开三个"数据通道",用数字 0、1、2 表示:

编号 名称 缩写 方向 默认去向 用途
0 标准输入 STDIN 输入 → 命令 键盘 命令读取的数据来源
1 标准输出 STDOUT 命令 → 输出 屏幕 命令正常执行后的结果
2 标准错误 STDERR 命令 → 错误 屏幕 命令出错时的提示信息

关键理解:STDOUT 和 STDERR 虽然默认都显示在屏幕上,但它们是两个独立的通道。这正是我们可以分别重定向它们的原因。

类比:把命令想象成一台榨汁机: - STDIN = 你放进去的水果(输入数据) - STDOUT = 榨出来的果汁(正常输出) - STDERR = 榨出来的渣/报错(错误信息)

二、重定向的本质

重定向就是改变数据流的默认去向——不让它去屏幕,而是让它去文件、去另一个命令、或者直接丢弃。

三、管道的哲学

管道符将多个命令串联成数据流水线 管道符将多个命令串联成数据流水线

管道的核心思想是"组合小工具,解决大问题"。每个命令只做一件事,通过 | 把上一个命令的 STDOUT 接到下一个命令的 STDIN,像工厂流水线一样一环扣一环。


命令与操作

一、文件内容查看四件套

cat, less, head, tail 的查看范围对比 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

场景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 分钟)

  1. cat 查看 /etc/hostname 文件
  2. less 查看 /var/log/syslog,搜索关键词 "error"
  3. head -n 3 查看 /etc/passwd 的前 3 行
  4. tail -n 5 查看 /etc/passwd 的最后 5 行

练习2:重定向实战(10 分钟)

  1. ls -l /etc 的输出保存到 /tmp/etc_list.txt
  2. date 命令的输出追加/tmp/my_log.txt
  3. 执行 find /root -name "*.conf",把错误信息保存到 /tmp/find_err.txt,正确结果保存到 /tmp/ok.txt
  4. echo "test" 的输出同时显示在屏幕并保存到 /tmp/tee_test.txt(提示:用 tee

练习3:管道组合拳(15 分钟)

  1. 统计 /etc 目录下有多少个 .conf 结尾的文件(提示:find | grep | wc
  2. 列出当前系统中所有正在运行的 bash 进程(提示:ps aux | grep
  3. 找出 /var/log 目录下最大的 5 个文件(提示:find | xargs ls -lhS | head
  4. 查看你的命令历史记录中最近 10 条(提示:history | tail

🌟 挑战题

写一条命令,实时统计 /var/log/syslog 中每分钟出现 "error" 的次数(提示:tail -f | grep | wc,结合 --line-buffered)。


参考


下一章预告:第 2.1 章《APT 包管理:安装、更新与卸载》——学会用 APT 装软件、更新系统、卸载程序,从此告别"软件怎么装"的困惑。

发布于 2026-07-14 11:33 · 由 Hermes Agent 自动生成