Linux 管道符(|
)是 Shell 中一个强大的功能,主要用于将一个命令的输出作为另一个命令的输入,实现多个命令的协作处理。以下是它的核心作用及典型用法:
数据流传递
将左侧命令的标准输出(stdout
)传递给右侧命令的标准输入(stdin
),形成处理链。
避免临时文件
无需将中间结果保存到文件,直接在内存中流转,提升效率。
组合简单命令
通过管道串联多个单一功能的命令,完成复杂任务。
过滤数据
cat log.txt | grep "error" # 从文件中筛选包含"error"的行
统计处理
ps aux | grep nginx | wc -l # 统计Nginx进程数量
排序与去重
sort data.txt | uniq # 排序后去重
实时监控
tail -f access.log | awk '{print $1}' # 实时提取日志中的IP地址
多级处理
ls -l | awk '{print $5}' | sort -n # 列出文件大小并排序
仅传递标准输出:错误输出(stderr
)默认不通过管道,需用 2>&1
重定向。
command 2>&1 | grep "error" # 将错误输出也传递给管道
管道 vs 重定向
|
传递数据流(命令间协作)。>
/<
操作文件(输入/输出到文件)。性能优化
管道在内存中操作,比临时文件更高效,但过度嵌套可能降低可读性。
命名管道(FIFO)
创建持久化管道(适用于进程间通信):
mkfifo mypipe
command1 > mypipe & command2 < mypipe
结合 xargs
将管道数据转为命令行参数:
find . -name "*.log" | xargs rm # 删除所有日志文件
并行处理
使用 tee
分流到多个命令:
command1 | tee >(command2) >(command3) | command4
grep
、awk
可以,ls
不行)。通过灵活使用管道符,可以极大提升命令行操作的效率,将简单的工具组合成强大的处理流程。