linux/重定向与管道.md
2025-03-19 12:27:51 +08:00

5.4 KiB
Raw Permalink Blame History

重定向与管道


一:重定向

重定向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

核心功能

  • 将输入转换为参数:将管道传递的数据分割成多个参数,传递给后续命令(如 rmcpgrep 等)。
  • 处理超长参数列表:当参数数量超过命令行限制时,自动分批执行。
  • 灵活控制参数位置:通过 -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 -print0xargs -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