管道符 | 的核心作用是将前一个命令的标准输出(stdout)作为后一个命令的标准输入(stdin),构建单向文本处理流水线;它不处理标准错误(stderr),各命令并发执行但数据流严格从左到右顺序传递。

管道符 | 的核心作用是把前一个命令的 stdout(标准输出)直接传给后一个命令的 stdin(标准输入),形成一条单向、自动衔接的文本处理流水线。它不处理 stderr(错误输出),也不改变命令本身逻辑,只负责数据“搬运”。用好它,关键在理解流向和每条命令的输入/输出行为。
管道的基本写法与执行顺序
语法很简单:command1 | command2 | command3。Shell 会并行启动所有命令,并在它们之间建立内存缓冲区(匿名管道)。数据从左到右流动:command1 的输出 → command2 的输入 → command3 的输入 → 最终显示或被重定向。
- command1 必须有 stdout 输出(比如
ls、cat、ps),否则右边命令收不到数据 - command2 必须能从 stdin 读取(比如
grep、sort、awk、head),否则管道会失败或卡住 - 命令执行不是串行等待,而是并发启动;但数据流是严格顺序的——后一命令必须等前一命令吐出内容才能开始处理
常见组合与实用场景
多数日常文本处理都靠几个基础命令搭配合成。记住每条命令的“角色”,就能快速拼装:
一款AI工具,主要用于自动化从本地媒体及云编辑 API生成剪映草稿。当 Codex 需要扫描素材文件夹、请求编辑决策并...时使用,适合需要提升相关任务效率的用户。
-
筛选类:用
grep找含关键词的行,awk '{print $1}'提取字段,sed 's/old/new/g'替换文本 -
排序统计类:用
sort排序,uniq -c去重计数,wc -l数行数 -
分页截断类:用
more或less分屏查看,head -n 10取前10行,tail -n 5取最后5行
例如:ps aux | grep nginx | wc -l 统计 nginx 进程数量;df -h | awk '{print $5,$1}' | sort -n | tail -3 找出使用率最高的三个挂载点。
注意错误流(stderr)不会自动进管道
默认情况下,只有 stdout 走管道,stderr(比如命令报错信息)仍直接打印到终端,可能干扰结果或被遗漏。
- 想让错误也参与筛选:加
2>&1把 stderr 合并到 stdout,再进管道,如find /etc -name "*.conf" 2>&1 | grep "Permission denied" - 只想看错误、屏蔽正常输出:先重定向 stdout 到
/dev/null,再合并 stderr,如curl -I https://example.com 2>&1 >/dev/null(只留错误) - 同时保存日志又实时过滤:用
tee分流,如make 2>&1 | tee build.log | grep -E "(error|warning)"
避免常见陷阱
管道看似简单,但几个细节容易导致意外:
-
命令无输出时,后续命令收不到任何输入——比如
grep "notexist" file.txt | wc -l返回 0,不是因为出错,而是没匹配到 -
管道中途提前退出(如
head -1)可能触发 “Broken pipe”,可在末尾加2>/dev/null抑制该提示 -
重定向和管道混用时注意顺序:
cmd > out.txt 2>&1 | grep "done"是错的——stdout 已写入文件,管道收不到;应写成cmd 2>&1 | grep "done" > out.txt或用tee










