在 Linux 命令行环境中,每个程序启动时都会默认打开三个数据流:标准输入(stdin,文件描述符 0)、标准输出(stdout,1) 和 标准错误(stderr,2)。重定向和管道的核心作用,就是灵活改变这些数据流的来源和去向,让原本只与键盘、屏幕交互的程序可以读写文件或与其他程序协作。
1. 输出重定向 > 与 >>
>:将命令的标准输出写入指定文件。若文件不存在则创建,若已存在则清空其原有内容(覆盖)。>>:同样将标准输出写入文件,但采用追加方式,新内容会添加在文件末尾,不会删除已有数据。
实用示例:
ls -l /home > files.txt # 把 /home 目录的文件列表保存到 files.txt(覆盖原内容)
echo "备份完成" >> log.txt # 在 log.txt 末尾追加一行日志
⚠️ 注意:> 只重定向标准输出,错误信息仍会打印到屏幕。若需同时保存错误,可使用 2>(重定向标准错误)或 &>(将标准输出和标准错误都重定向到同一文件)。
2. 输入重定向 <
<:将文件内容作为命令的标准输入,代替从键盘读取。很多命令(如sort、wc)既可以接受文件名参数,也可以通过<从标准输入读取数据,两种写法通常等效,但<能配合其他重定向实现更灵活的组合。
实用示例:
sort < data.txt # 将 data.txt 的内容作为 sort 的输入并排序
wc -l < access.log # 统计 access.log 的行数(输出纯数字,不含文件名)
3. 管道符 |
管道是 Linux 命令行的灵魂。| 将左边命令的标准输出直接变为右边命令的标准输入,二者几乎可以无限串联,像流水线一样处理数据。
实用示例:
cat /var/log/syslog | grep "error" | less
# 查看系统日志中所有含 "error" 的行,并用 less 分页浏览
ps aux | grep nginx | awk '{print $2, $11}'
# 列出所有 Nginx 进程的 PID 和命令路径
find . -name "*.txt" | xargs wc -l
# 找到当前目录下所有 .txt 文件并统计每个文件的行数
管道与重定向经常组合使用,唯一要记住的规则是:管道传递的是两个命令之间的数据流,重定向则是命令和文件之间的数据流。例如:
grep "ERROR" app.log | sort | uniq -c > error_count.txt
这条命令先用 grep 找出错误行,经 sort 排序后由 unig -c 去重计数,最后将结果保存到文件。输入、过滤、处理和存储一气呵成,完全没有临时中间文件。
掌握这几种机制,意味着你可以把任何命令行工具当作可组装的零件,按需搭建出强大且即时的数据处理流程。