Linux中的重定向、管道和tee
命令是处理输入输出的重要工具,以下是对它们的详细解释及用法示例:
一、重定向(Redirection)
重定向用于改变命令的输入/输出方向,默认情况下,命令从标准输入(stdin,文件描述符0)读取数据,输出到标准输出(stdout,文件描述符1)或标准错误(stderr,文件描述符2)。
常见用法:
-
输出重定向
>
:覆盖写入文件ls > file.txt # 将ls的结果覆盖写入file.txt
>>
:追加到文件末尾echo "new line" >> file.txt # 追加内容到file.txt
-
错误重定向
2>
:重定向错误信息rm non_existent_file 2> error.log # 将错误信息写入error.log
2>>
:追加错误信息command 2>> error.log
-
同时重定向stdout和stderr
&>
或2>&1
:合并输出command &> output.log # 新写法 command > output.log 2>&1 # 传统写法
-
输入重定向
<
:从文件读取输入sort < input.txt # 将input.txt内容作为sort的输入
二、管道(Pipe)
管道符 |
将前一个命令的标准输出作为后一个命令的标准输入,实现命令间的协作。
示例:
-
基本管道
ps aux | grep 'nginx' # 查找nginx进程
-
多级管道
cat access.log | grep '404' | awk '{print $7}' | sort | uniq -c | sort -nr # 分析日志中的404错误,统计出现次数并排序
-
处理标准错误
若需传递错误输出,需合并到stdout:command 2>&1 | grep 'error' # 将stderr合并到stdout后再过滤
三、tee命令
tee
将数据流同时输出到屏幕(stdout)和文件,类似于“T型三通”。
用法:
-
基本用法
command | tee file.txt # 输出到屏幕并写入file.txt(覆盖)
-
追加模式
command | tee -a file.txt # 追加到文件末尾
-
结合管道
command1 | tee file.txt | command2 # 保存数据到文件,同时传递给后续命令
典型场景:
- 实时查看并保存输出
sudo apt-get install package | tee install.log
- 调试复杂命令
script.sh | tee debug.log # 查看实时输出并记录日志
四、关键区别与注意事项
-
重定向顺序敏感
command > file 2>&1
:正确合并stdout和stderr到文件。command 2>&1 > file
:stderr仍输出到终端,stdout写入文件。
-
管道仅传递stdout
默认不处理stderr,需显式合并(2>&1
)。 -
tee的灵活性
在管道链中分流数据,适合需要中间结果的场景。
总结
- 重定向:控制命令的输入/输出源和目标。
- 管道:连接命令,形成数据处理流水线。
- tee:分流输出,同时查看和保存数据。
掌握这三者,可大幅提升命令行操作效率!