Linux 系统管理(三):重定向与 Vim
掌握 IO 重定向、管道、输入重定向以及 Vim 基础操作,是构建高效 Linux 自动化脚本、日志分析流程和系统管理任务的核心能力。
一、标准输入输出(Standard I/O)与文件描述符
每个 Linux 进程启动时默认关联三个标准流(Standard Streams):
|
流名称 |
文件描述符 |
默认来源/目标 |
说明 |
|
STDIN(标准输入) |
0 |
键盘 |
程序读取输入的地方 |
|
STDOUT(标准输出) |
1 |
终端 |
正常输出内容 |
|
STDERR(标准错误) |
2 |
终端 |
错误信息输出 |
关键点:这些流可通过重定向机制改变其输入或输出目标。
二、输出重定向
1. 常用重定向符号
|
符号 |
作用 |
示例 |
|
|
覆盖写入标准输出到文件 |
|
|
|
追加写入标准输出到文件 |
|
|
|
覆盖写入标准错误到文件 |
|
|
|
追加写入标准错误到文件 |
|
|
|
覆盖写入所有输出(stdout + stderr)到文件 |
|
|
|
追加写入所有输出到文件 |
|
说明:
&>和&>>是 Bash 扩展语法。- 其等价 POSIX 写法为:
> file 2>&1和>> file 2>&1。 - 在可移植脚本中,建议使用 POSIX 兼容语法。
2. & 的多重含义
|
上下文 |
含义 |
示例 |
|
命令末尾 |
后台运行进程 |
|
|
重定向中 |
引用文件描述符 |
|
|
重定向简写(Bash) |
表示“所有输出” |
|
|
条件语句 |
逻辑与操作符 |
|
3. 重定向顺序的重要性
Shell 从左到右解析重定向命令。
正确写法:
command > output.log 2>&1
执行过程:
> output.log:将 stdout(fd=1)指向output.log。2>&1:将 stderr(fd=2)指向 fd=1 当前的位置(即output.log)。
错误写法:
command 2>&1 > output.log
执行过程:
2>&1:此时 fd=1 仍指向终端,因此 fd=2 也指向终端。> output.log:仅将 fd=1 指向文件,fd=2 仍指向终端。
结果:
- 正常输出 → 写入
output.log - 错误信息 → 仍显示在终端
4. 合并标准错误与标准输出的方式对比
|
方法 |
说明 |
兼容性 |
|
|
分步重定向(先重定向 stdout,再将 stderr 指向 stdout) |
POSIX 标准 |
|
|
一步合并(Bash 扩展) |
Bash 特有,非 POSIX |
内部等价:&> file ≡ > file 2>&1
5. 实用技巧
(1) 合并错误与正常输出用于管道
find /etc -name passwd 2>&1 | wc -l
→ 将错误和正常输出统一送入管道,统计总行数。
(2) 静默执行(丢弃所有输出)
ping -c 2 192.168.1.1 &> /dev/null
/dev/null是系统提供的“黑洞”设备,所有写入内容被丢弃。- 常用于脚本中避免干扰日志或终端。
三、管道(Pipe)
1. 基础用法:|
- 将前一个命令的 标准输出 作为后一个命令的 标准输入。
- 不传递标准错误,需显式合并:
2>&1
示例:
cat /etc/passwd | grep root
ps aux | sort -k 3 -r | head -n 5
2. 管道与重定向组合
(1) 捕获错误信息
find / -name "*.log" 2>&1 | grep "No such file"
(2) 统计全部输出行数(含错误)
command 2>&1 | wc -l
四、输入重定向
1. <:从文件读取输入
将文件内容作为命令的标准输入。
示例:
cat < /etc/hosts
tr 'a-z' 'A-Z' < /etc/issue
mail user@example.com < email_content.txt
适用场景:当命令不支持直接传文件名参数,只能从 stdin 读取时(如 tr)。
2. <<:Here Document(内嵌文档)
允许在命令中直接嵌入多行文本,直到遇到指定终止符(如 EOF)。
示例:
cat > config.txt << EOF
line 1
line 2
line 3
EOF
要求:
- 终止符必须单独成行且前后一致。
- 常用于脚本中生成配置文件、远程命令块等。
3. < 与 << 对比
|
符号 |
输入来源 |
典型用途 |
|
|
已存在的文件 |
使用文件内容作为命令输入 |
|
|
命令后内嵌的多行文本 |
动态生成配置、脚本块或指令序列 |
简言之:
<是“读文件”<<是“写文本块”
4. cat 与重定向的原理
cat(concatenate)的核心功能是:
从标准输入(stdin)读取数据,并将其输出到标准输出(stdout)。
- 若指定文件:
cat file.txt→ 从文件读取并输出到终端。 - 若无参数:
cat→ 从键盘读取(stdin),原样输出到终端,直到收到 EOF(Ctrl+D)。
cat > file 的工作机制
cat > myfile.txt
Shell 执行步骤:
- 启动
cat命令; - 将
cat的 stdout 重定向到myfile.txt(覆盖写入); cat从 stdin(默认为键盘)读取用户输入,按Ctrl + D(EOF 信号);- 用户输入内容经
cat输出至 stdout,最终写入文件。
此方式可用于交互式创建文件。
cat > file << EOF 的工作机制
cat > config.txt << EOF
server_port=8080
log_level=info
EOF
Shell 执行步骤:
> config.txt:准备将 stdout 写入文件(覆盖模式);<< EOF:构造一段虚拟输入流(stdin);cat从 stdin 读取内嵌文本;- 输出到 stdout,即
config.txt。
关键理解:
cat本身只是“搬运工”——它把 stdin 的内容搬到 stdout。- stdin 来源和 stdout 目标由 Shell 的重定向机制决定,而非
cat自身控制。
五、实战应用场景
1. 日志分析
提取 Apache 访问日志中的 404 请求并统计:
grep "404" /var/log/httpd/access_log | awk '{print $7}' | sort | uniq -c | sort -nr > 404_errors.txt
2. 端口检测(静默模式)
nc -z -w 2 192.168.1.1 80 &> /dev/null
if [ $? -eq 0 ]; then
echo "Port 80 is open"
else
echo "Port 80 is closed"
fi
3. 批量文件处理
压缩所有 .txt 文件并分别记录成功与失败日志:
find . -name "*.txt" | while read -r file; do
gzip "$file" 2>> compress_error.log
echo "Compressed $file" >> compress_success.log
done
六、核心原理与注意事项
1. 重定向本质
- 是文件描述符的重映射。
- 例如
2>&1表示:将 fd=2 指向 fd=1 当前所指向的目标(不是复制内容)。
2. 管道限制
- 默认仅传递 STDOUT。
- 处理大文件时,建议分块处理(如使用
split或awk 'NR<=N'),避免内存缓冲区溢出。
3. 安全建议
>会覆盖文件内容,建议先检查文件是否存在或使用>>。- 在启用
set -e的脚本中,确保重定向产生的错误能通过$?正确捕获。
七、Vim 编辑器常用操作
1. 命令模式(Normal Mode)
|
命令 |
功能 |
|
|
显示行号 |
|
|
取消行号 |
|
|
跳至文件末尾 |
|
|
跳至第一行 |
|
或 |
跳至第 30 行 |
|
|
跳至行尾 |
|
|
删除当前行 |
|
|
删除从当前行起共 2 行 |
|
/ |
复制 1 行 / 2 行 |
|
|
粘贴(光标后) |
|
|
撤销上一步操作 |
|
|
删除当前行并进入插入模式 |
|
|
全文替换 |
|
或 |
删除全部内容 |
|
|
搜索忽略大小写 |
|
|
搜索区分大小写 |
|
|
启用粘贴模式(防止自动缩进干扰) |
2. 插入模式(Insert Mode)
|
按键 |
功能 |
|
|
在光标当前位置进入插入模式 |
|
|
在当前行下方插入新行并进入插入模式 |
|
|
在当前行上方插入新行并进入插入模式 |
3. 可视化模式(Visual Mode)
|
按键 |
功能 |
|
|
字符级选择 |
|
|
行级选择 |
|
|
块选择(列模式) |
4. 交换文件(Swap File)处理

当 Vim 检测到 .filename.swp 文件时,可能原因包括:
- 其他 Vim 实例正在编辑该文件;
- 上次编辑异常退出,留下恢复文件。
操作选项:
(O)pen Read-Only:只读打开;(E)dit anyway:强制编辑(有冲突风险);(R)ecover:尝试从交换文件恢复内容;(D)elete it:删除交换文件;(Q)uit:退出;(A)bort:放弃打开。
建议:若确认无需恢复,应手动删除 .swp 文件以避免重复提示。
八、核心符号速查表
|
符号 |
作用 |
|
|
标准输出覆盖重定向 |
|
|
标准输出追加重定向 |
|
|
标准错误覆盖重定向 |
|
|
标准错误追加重定向 |
|
|
所有输出覆盖重定向(Bash 扩展) |
|
|
所有输出追加重定向(Bash 扩展) |
|
|
将标准错误重定向到标准输出 |
|
|
从文件读取输入 |
|
|
Here Document(多行内嵌输入) |
总结
掌握 IO 重定向、管道、输入重定向以及 Vim 基础操作,是构建高效 Linux 自动化脚本、日志分析流程和系统管理任务的核心能力。
更多推荐


所有评论(0)