Linux Shell 管道(|)本质是将前命令 stdout 作为后命令 stdin,构建内存中不落地的数据流水线;基础三件套 grep/cut/sort 各司其职,awk/sed 处理复杂逻辑,需注意 stderr 重定向、避免 useless use of cat 及空输入导致中断。

Linux Shell 中的管道(|)本质是把前一个命令的 stdout 当作后一个命令的 stdin,让文本在内存中“流”起来,不落地、不中断。它不是简单拼接命令,而是构建一条数据流水线——每个环节专注一件事:过滤、切分、排序、统计或转换。
用好基础三件套:grep、cut、sort
这是最常用也最容易上手的组合。比如从 /etc/passwd 中提取所有 shell 为 /bin/bash 的用户名并按字母排序:
grep '/bin/bash$' /etc/passwd | cut -d: -f1 | sort-
grep筛出行末尾匹配/bin/bash的记录 -
cut -d: -f1以冒号为分隔符,取第 1 列(用户名) -
sort对结果逐行排序(默认 ASCII 顺序)
进阶处理靠 awk 和 sed
当需要字段计算、条件判断或复杂替换时,awk 和 sed 就不可替代。例如统计日志中每种 HTTP 状态码出现次数:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
grep 'HTTP/' access.log | awk '{print $9}' | sort | uniq -c | sort -nr- 如果状态码混在更复杂格式里(如
"GET /api/health HTTP/1.1" 200),可用awk直接提取:awk '$2 ~ /^HTTP\// {print $NF}' access.log | sort | uniq -c -
sed适合流式编辑,比如统一清理多余空格:cat data.txt | sed 's/[[:space:]]\+/ /g' | sed 's/^ //;s/ $//'
避免常见陷阱:错误流、缓冲与空输入
管道只传 stdout,stderr 默认仍输出到终端,可能干扰结果。比如 cat missing.log | wc -l 会先报错再显示 0 行。解决办法:
- 重定向 stderr:用
2>/dev/null屏蔽错误,或2>&1合并进 stdout 参与后续处理 - 大文件处理时,
grep直接读文件比cat file | grep更快,后者是典型“useless use of cat” - 某些命令(如
head)遇到空输入会提前退出,导致后续命令收不到数据;可在关键位置加cat或用|| true保流程畅通
串联多个工具完成真实运维任务
一个典型场景:查出占用 CPU 最高的前 5 个 Java 进程 PID 并强制终止:
ps aux --sort=-%cpu | grep java | head -n 5 | awk '{print $2}' | xargs kill -9-
--sort=-%cpu按 CPU 使用率降序排列 -
awk '{print $2}'提取第二列(PID) -
xargs把多行 PID 转成kill -9 pid1 pid2 ...的参数形式 - 注意:生产环境慎用
kill -9,建议先试kill -15

















