5.4 KiB
5.4 KiB
重定向与管道
一:重定向
重定向(Redirection) 是一种通过命令行控制输入(Input)、输出(Output)和错误(Error)流向的机制。它允许你将命令的结果保存到文件、从文件读取输入,或合并/分离不同的数据流。
1. 基本观念
文件描述符(File Description)
Linux 为每个进程分配了三个默认的 I/O 通道:
- 0:标准输入(
stdin
,默认来自键盘)。 - 1:标准输出(
stdout
,默认显示到终端)。 - 2:标准错误(
stderr
,默认显示到终端)。
重定向符号
符号 | 作用 |
---|---|
> 或 1> | 将标准输出重定向到文件(覆盖) |
>> 或1>> | 将标准输出追加到文件 |
< | 将文件内容作为标准输入 |
2> | 将标准错误重定向到文件(覆盖) |
2>> | 将标准错误追加到文件 |
&> 或 > & |
同时重定向标准输出和标准错误 |
| | 管道符,将前一个命令的输出作为后一个命令的输入 |
2. 出重定向
标准输出重定向
覆盖写入文件
[root@wxin ~]# echo "Hello World" > output.txt
追加到文件末尾:
[root@wxin ~]# echo "New line" >> output.txt
标准错误重定向
将错误信息保存到文件:
[root@wxin ~]# ls /invalid-path 2> error.log
同时重定向标准输出和错误
合并输出和错误到同一文件:
[root@wxin ~]# command &> all_output.log
# 或
[root@wxin ~]# command > output.log 2>&1
分离输出和错误到不同文件
[root@wxin ~]# command > output.log 2> error.log
丢弃输出
将输出或错误发送到“黑洞”(/dev/null
):
[root@wxin ~]# command > /dev/null # 丢弃标准输出
[root@wxin ~]# command 2> /dev/null # 丢弃标准错误
[root@wxin ~]# command &> /dev/null # 丢弃所有输出
3. 输入重定向
从文件读取输入
[root@wxin ~]# wc -l < input.txt # 统计文件行数
多行输入(Here Document)
[root@wxin ~]# cat << EOF
Line 1
Line 2
EOF
从字符串读取输入(Here String)
[root@wxin ~]# tr 'a-z' 'A-Z' <<< "hello" # 输出 "HELLO"
二:管道
1. Pipe
简介
管道命令可以将多条命令组合起来,一次性完成复杂的处理任务。
语法
[root@wxin ~]# command1 | command2
命令1的标准输出作为命令2的标准输入
2. tee
简介
三通道管理,即交给另一个程序处理。又保存一份副本。
语法
[root@wxin ~]# command1 |tee 文件名|command2
3. Xargs
核心功能
- 将输入转换为参数:将管道传递的数据分割成多个参数,传递给后续命令(如
rm
、cp
、grep
等)。 - 处理超长参数列表:当参数数量超过命令行限制时,自动分批执行。
- 灵活控制参数位置:通过
-I
指定参数替换的位置。
基本格式
[root@wxin ~]# command1 | xargs [选项] command2
示例:删除所有 .log
文件
[root@wxin ~]# find . -name "*.log" | xargs rm -f
默认行为
- 将输入按空格、制表符、换行符分割为参数。
示例:统计所有 .txt
文件的行数
[root@wxin ~]# find . -name "*.txt" | xargs wc -l
常用选项
选项 | 说明 |
---|---|
-n NUM | 每次执行命令时传递 NUM 个参数(分批处理)。 |
-I {} | 定义替换符号(如 {} ),指定参数插入的位置。 |
-d DELIM | 自定义输入分隔符(默认按空格/换行分割)。 |
-0 | 处理以 \0 分隔的输入(通常与 find -print0 配合处理特殊字符)。 |
-p | 交互式提示确认是否执行命令。 |
-P NUM | 并行执行命令,最多启动 NUM 个进程。 |
示例
处理带空格/特殊字符的文件名
- 安全方式:结合
find -print0
和xargs -0
[root@wxin ~]# find . -name "*.log" -print0 | xargs -0 rm -f
分批传递参数
- 每次传递 2 个参数给
echo
:
[root@wxin ~]# echo "a b c d e" | xargs -n 2
a b
c d
e
指定参数位置
用 -I {}
自定义参数替换符号(常用于需要参数插入中间的场景):
[root@wxin ~]# find . -name "*.txt" | xargs -I {} cp {} /backup/
并行执行命令
使用 -P
启动 4 个并行进程压缩文件:
[root@wxin ~]# find . -name "*.log" | xargs -P 4 -I {} gzip {}
交互式确认
删除文件前提示确认:
[root@wxin ~]# find . -name "*.tmp" | xargs -p rm -f