Linux管道(|)将前命令输出作为后命令输入,支持高效组合基础命令实现过滤、提取、统计等任务,但嵌套过深或逻辑复杂时应改用脚本。

Linux管道(|)是把前一个命令的输出直接作为后一个命令的输入,实现轻量级、高灵活性的命令组合。掌握好管道,不用写脚本也能快速完成数据筛选、格式转换、统计分析等任务。
用管道串联基础命令做精准过滤
单独用 ls 或 ps 输出信息太多,配合 grep、awk、sed 就能快速定位目标:
- ps aux | grep nginx:查所有进程里含“nginx”的行(注意可能匹配到 grep 自身,可加 -v grep 排除)
- ls -l /etc | awk '$1 ~ /^-r/ {print $9, $5}':列出 /etc 下普通文件名和大小($1 是权限列,以“-r”开头代表可读普通文件)
- df -h | sed -n '/\/$/p':只显示挂载在根目录(/)的磁盘使用情况(sed -n 关闭自动打印,/\/$/ 匹配以 / 结尾的行)
管道中多次过滤与字段提取的实用顺序
多个管道符连用时,顺序决定效率和结果。一般按“缩小范围 → 提取字段 → 格式整理”来组织:
- 查当前登录用户中 shell 是 /bin/bash 的用户名:
cut -d: -f1,7 /etc/passwd | grep '/bin/bash$' | cut -d: -f1
先切出用户名+shell字段,再过滤 bash 行,最后只留用户名——比先 grep '/bin/bash' 再切更安全(避免误匹配注释或路径中的 bash) - 统计访问日志里访问次数最多的前 3 个 IP:
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -3
sort | uniq -c 必须成对出现,且 sort 要在 uniq 前;sort -nr 按数字逆序排计数
用管道配合 while read 处理逐行逻辑
当需要对每行执行较复杂操作(比如调用其他命令、条件判断),单纯靠 awk/sed 不够时,可用 while read:
- 批量检查一批域名是否可解析:
cat domains.txt | while read d; do echo -n "$d: "; nslookup "$d" >/dev/null 2>&1 && echo "OK" || echo "FAIL"; done - 注意:管道会创建子 shell,while 内部变量无法传回外部。如需汇总结果,建议改用重定向:
while read d; do ...; done
避免常见陷阱:管道中的错误处理与性能提示
管道看似简洁,但几个细节不注意就容易出错或低效:
-
错误输出不进管道:默认只有 stdout(文件描述符 1)通过管道,stderr(2)仍输出到终端。要一起捕获,加 2>&1,例如:
find /tmp -name "*.log" 2>&1 | grep "Permission denied" - 管道不是万能替代脚本:嵌套过深(如超过 4–5 个命令)、逻辑分支多、需反复引用中间结果时,建议写成 shell 脚本,更易读、调试和复用
- 大文件慎用 cat 开头:cat file | grep ... 比 grep ... file 多启一个进程,纯属冗余。除非要合并多个文件(cat f1 f2 | ...)才合理


















