Linux 课堂笔记 Day 4:帮助系统、Vim 编辑器与 I/O 重定向

在这里插入图片描述

日期:2026-07-16
作者:课堂笔记整理
标签Linux Vim 重定向 Man手册


前言

今天的课程内容非常扎实,涵盖了 Linux 日常使用中三个核心主题:

  1. 如何获取帮助 — Linux 自带的文档体系(man 手册、/usr/share/doc)
  2. Vim 编辑器 — 每个运维必备的文本编辑利器
  3. 输入输出重定向 — 理解进程的数据流,灵活控制输入输出

掌握了这些内容,你在命令行的操作效率会有一个质的飞跃。下面逐一梳理。


一、Linux 中获取帮助

Linux 自带了非常丰富的文档,学会查阅文档是脱离"死记命令"的第一步。

1.1 Man 手册

manmanual 的缩写,是 Linux 最核心的帮助系统。它用不同的 section(章节号) 区分手册类别:

Section内容类型
1用户命令(可执行命令和 shell 程序)
2系统调用(从用户空间调用的内核例程)
3库函数(由程序库提供)
4特殊文件(如设备文件)
5文件格式(配置文件和结构)
6游戏(历史遗留的有趣程序章节)
7惯例、标准和其他(协议、文件系统)
8系统管理和特权命令(维护任务)
9Linux 内核 API(内核调用)

记忆技巧:最常用的是 1、5、8。用一句话记:1 是命令怎么用,5 是配置文件怎么写,8 是管理员怎么管。

基本用法
# 查看 passwd 命令的用法(section 1)
man 1 passwd

# 查看 /etc/passwd 文件的格式说明(section 5)
man 5 passwd

# 查看英文原版手册(中文翻译有时不完整)
LANG=en_US.utf8 man gedit

man 命令底层调用 less 程序打开 /usr/share/man/ 下的手册文件。在 man 页面中的交互操作和 less 一样:

按键作用
Space / PageDown向下翻一屏
PageUp向上翻一屏
/ 向下/向上滚动一行
/string向下搜索 string
n重复上一次搜索(向下)
N重复上一次搜索(向上)
g跳到第一行
G跳到最后一行
q退出 man
按关键字搜索手册
# -k 选项:搜索包含关键字的所有手册页
man -k passwd
# 输出示例:
# chpasswd (8)         - 批量更新密码
# gpasswd (1)          - administer /etc/group and /etc/gshadow
# passwd (5)           - (未知的主题)

man -k ext4 | grep resizer
# resize2fs (8)        - ext2/ext3/ext4 file system resizer
更新 man page 数据库

如果 man -k 搜不到内容,先更新数据库:

sudo mandb

补充:命令来源有两种——安装软件包获得的外部命令(用 man 查),以及 Shell 自带的内部命令(用 help 查,不要用 man)。

# Shell 内部命令 → 用 help
help history

# 外部命令 → 用 man
man ls

通用后路:几乎所有命令都支持 --help 选项,这是最快捷的查看方式。


1.2 /usr/share/doc

很多软件包在 /usr/share/doc/ 下提供了示例配置文件、模板和说明文档:

# 浏览 DHCP 客户端配置示例
cat /usr/share/doc/dhclient-4.2.5/dhclient.conf.example

可以通过浏览器访问 file:///usr/share/doc 来浏览。


1.3 which 与 whereis

想知道某个命令的实际路径和相关信息:

# which:显示命令的实际路径(包括别名)
which vi
# alias vi='vim'
#     /usr/bin/vim

# whereis:同时显示程序路径、手册、源码位置
whereis passwd
# passwd: /usr/bin/passwd /etc/passwd
#         /usr/share/man/man1/passwd.1.gz
#         /usr/share/man/man5/passwd.5.gz

二、Vim 编辑器

每个 Linux 系统管理员都应该至少熟悉一个终端编辑器。Vim 可以说是最"保险"的选择——因为它在任何 Linux 发行版上都可用。

2.1 Vim 的三个版本

版本说明
vim-minimal仅提供 vi 和相关基本命令
vim-enhanced提供完整 vim,支持语法高亮拼写检查
vim-X11图形界面版 gvim,带菜单栏
# 安装增强版
sudo yum install -y vim

2.2 Vim 的四种模式

这是 Vim 区别于普通编辑器的核心设计:

         ┌──────────────────────────────┐
         │       Command Mode           │
         │   (默认模式,按键=命令)        │
         └──────┬───────┬───────┬───────┘
          i/I/a/A│   v/V │   :   │  Esc
          o/O    │Ctrl+v │       │
    ┌────────┐ ┌┴──────┐┌┴──────┐
    │ Insert │ │Visual ││Extended│
    │  Mode  │ │ Mode  ││Command │
    │ (编辑)  │ │(选择)  ││  Mode  │
    └────────┘ └───────┘│(:,/,?) │
                        └────────┘
  • Command 模式:默认模式,键盘字母是命令gg 跳首行,G 跳末行,dd 删一行)
  • Insert 模式:按 i 进入,真正"输入文字",按 Esc 返回 Command 模式
  • Extended Command 模式:按 : 进入,执行保存退出等操作(:w 保存,:q 退出,:wq 保存退出,:q! 强制退出)
  • Visual 模式:按 v(字符选中)、V(行选中)、Ctrl+v(矩形选中),用于选中后复制/删除

2.3 Command 模式常用快捷键速查

光标移动
命令作用
w跳到下一个单词开头
e跳到下一个单词末尾
b跳到上一个单词开头
0 / ^跳到行首
$跳到行尾
gg跳到文件第一行
G跳到文件最后一行
{ / }上/下一个自然段
进入插入模式
命令作用
i光标前插入 (insert)
I行首插入
a光标后追加 (append)
A行末追加
o下方新开一行
O上方新开一行
复制粘贴删除
命令作用
yy复制当前行(y2y 复制 2 行,y2w 复制 2 个单词)
p / P粘贴到光标后 / 前
x删除当前字符(5x 删 5 个)
dw删除一个单词(d5wd$ 删到行尾)
dd删除当前行
D从光标删到行尾(等价 d$
修改(删除 + 进入插入模式)
命令作用
s删除当前字符并进入插入模式
S删除当前行并进入插入模式
cw删除当前单词并进入插入模式
C从光标删到行尾并进入插入模式
撤销与替换
命令作用
u撤销
U撤销整行修改
Ctrl+r重做(反向撤销)
r替换单个字符后自动回 Command 模式
R进入替换模式,直到按 Esc

2.4 实战示例:编辑 DHCP 配置文件

下面是一个综合练习,把前面学的命令串联起来:

# 1. 准备文件
cp /usr/share/doc/dhcp*/dhcpd.conf.example ~/dhcpd.conf
vim ~/dhcpd.conf

在 Vim 中依次执行:

步骤操作说明
1:set number showcmd显示行号和当前命令
2gg跳到第一行
3d46d删除第 1-46 行(当前行 + 后面 45 行)
4:11,28d删除第 11-28 行
5/You搜索 “You” 并定位
6dG从当前位置删到最后
7:%s/10.5.5/10.1.8/g全局替换 IP 地址
8/224cw → 输入 0Esc定位并替换一个单词
9ZZ保存退出

:s 命令解读:%s/旧/新/g% 表示所有行,s 表示替换 (substitute),g 表示替换行内所有匹配 (global)。


2.5 Vim 配置文件

想让 Vim 更好用?写一个 ~/.vimrc

vim ~/.vimrc
set number          " 显示行号
set showcmd         " 右下角显示正在输入的命令
set ai ts=2         " 自动缩进,tab 宽度为 2 个空格
set cursorcolumn    " 列高亮对齐线
set cursorline      " 行高亮对齐线
  • 全局配置:/etc/vimrc(对所有用户生效)
  • 个人配置:~/.vimrc(只对当前用户生效)

三、Linux 输入输出重定向

这部分是 Linux "一切皆文件"哲学的集中体现。理解了它,你就理解了管道和 Shell 编程的基石。

3.1 标准流 (Standard Streams)

每个进程默认有三个数据流:

                     ┌──────────┐
  键盘 ──stdin(0)──▶ │          │ ──stdout(1)──▶ 终端屏幕
                     │  PROCESS │
                     │          │ ──stderr(2)──▶ 终端屏幕
                     └──────────┘
编号方向默认目的地用途
stdin0输入 ←键盘程序读取数据
stdout1输出 →终端屏幕正常结果输出
stderr2输出 →终端屏幕错误信息输出

重定向就是把这些默认的"目的地"改掉——输出到文件、从文件读取、或者传给另一个程序。


3.2 标准输出重定向到文件

覆盖写入 (>)
# 只重定向 stdout(1> 可简写为 >)
find /etc -name 'passwd' > passwd.list
# stderr 仍然显示在屏幕上
# stdout 写入了 passwd.list

# 只重定向 stderr
find /etc -name 'passwd' 2> passwd.err
# stdout 仍然显示在屏幕上
# stderr 写入了 passwd.err

# 丢弃错误信息(扔进 /dev/null 黑洞)
find /etc -name 'passwd' 2> /dev/null

# 分别重定向到不同文件
find /etc -name 'passwd' > passwd.list 2> passwd.err
追加写入 (>>)
# 追加不覆盖
find /etc -name 'passwd' >> passwd.list 2>> passwd.err
合并写入 (&>&>>)
# stdout 和 stderr 覆盖写入同一个文件
find /etc -name 'passwd' &> passwd.all

# 追加写入同一个文件
find /etc -name 'passwd' &>> passwd.all
快速创建 / 清空文件
> testfile      # 文件存在则清空,不存在则创建
>> testfile     # 不存在则创建,存在则不做任何事

3.3 管道符 (|):标准输出重定向到程序

管道是 Linux 命令行最强大的特性之一——把前一个命令的 stdout 作为后一个命令的 stdin

# 不用管道:两步操作
man -k ext4 > ext4.man
grep resizer ext4.man

# 用管道:一行搞定
man -k ext4 | grep resizer
# resize2fs (8)    - ext2/ext3/ext4 file system resizer
实战:提取 IP 地址
ip addr | grep 'ens33$' | awk '{print $2}' | cut -d/ -f1
# 10.1.8.88

一步一步解读这条命令链:

  1. ip addr — 输出所有网络接口信息
  2. grep 'ens33$' — 过滤出 ens33 那一行
  3. awk '{print $2}' — 取第二个字段(IP 地址/CIDR)
  4. cut -d/ -f1 — 去掉 /24 这种子网掩码

重要:管道后面的命令必须能接收标准输入。像 ls 就不接收管道数据——echo /etc/passwd | ls -l 只会列出当前目录的内容。

|&:错误也一起传
# 普通管道只传 stdout,不传 stderr
ls -l file-{01..06} | grep file-06
# 错误信息直接显示,不会被 grep 处理

# |& 把 stdout 和 stderr 都传给下一个命令
ls -l file-{01..06} |& grep file-06
# 错误信息也能被 grep 到了

3.4 tee 命令:分叉你的数据流

tee 相当于管道中的一个"三通接头"——接收 stdin,一份继续输出(给下一个管道),一份保存到文件。

# 既在屏幕上看到输出,又保存到文件
find /etc -name 'passwd' 2>/dev/null | tee passwd.list

# 追加模式
find /etc -name 'passwd' 2>/dev/null | tee -a passwd.list

# 继续往下传
man -k passwd | tee passwd.man | grep passwd

3.5 标准输入重定向

# <  将文件内容作为命令的 stdin
cat < /etc/hosts

# << EOF  多行文本输入(Here Document)
cat > multi_lines.txt << EOF
hello world
hello python
hello linux
EOF

# <<<  单行字符串输入(Here String)
cat <<< 'hello world'
判断命令是否接收 stdin

最简单的测试:把一个文件的内容重定向给它,看它是否处理。


3.6 实用技巧:一次性写入多行

# 方法一:echo 中使用换行符
echo 'hello world
hello python
hello linux' > multi_lines.txt

# 方法二:cat + Here Document(推荐)
cat > multi_lines.txt << EOF
hello world
hello python
hello linux
EOF

总结与反思

今天的内容量很大,但逻辑清晰:

  1. 帮助系统让我不再需要死记命令——man--help/usr/share/doc 三管齐下,总能找到答案。

  2. Vim 的学习曲线确实陡峭,但一旦掌握 Command 模式的肌肉记忆,编辑效率远超图形化编辑器。核心就是记住:大多数时候在 Command 模式,按 i 进去编辑,按 Esc 出来操作。

  3. I/O 重定向是 Linux 哲学的集中体现。理解了 0/1/2 三个文件描述符,>>>|tee 这些操作就不再神秘——无非是把数据流"掰"到不同的方向。

课后任务:完成笔记中的实验练习,并预习 Shell 基础(变量范围、条件判断、循环等),为下一节课做准备。


本文整理自 2026 年 7 月 16 日课堂笔记,内容涵盖 Red Hat Enterprise Linux (CentOS 7) 环境下的实操。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐