Shell 脚本管道:| 运算符
Shell 管道(Pipeline)是 Linux/Unix 系统中最强大的功能之一。| 运算符允许将一个命令的输出直接作为下一个命令的输入,就像将两根水管接在一起,让数据流顺畅地通过多个处理环节。
核心原理
管道连接的是“标准输出”和“标准输入”。默认情况下,命令在屏幕上打印的结果(标准输出)会被 | 截获,并喂给右边的命令(标准输入),而不再显示在屏幕上。
1. 基础操作:筛选与查看
最简单的用法是将一个产生大量输出的命令,通过管道传递给筛选命令。
- 打开终端。
- 列出当前目录下的所有文件,并使用
grep筛选出包含.log后缀的文件。 - 输入以下命令并执行:
ls -l | grep ".log"
- 观察输出结果,屏幕上只会显示被
grep过滤后的行,而不是完整的文件列表。
2. 数据统计:计数行数
结合 wc(word count)命令,可以快速统计文件数量、行数或字数。
- 查找
/etc目录下所有以.conf结尾的配置文件。 - 使用管道将查找结果传递给
wc -l进行行数统计。 - 输入以下命令:
find /etc -name "*.conf" | wc -l
- 查看终端输出的数字,该数字即为找到的配置文件总数。
3. 进阶操作:多级管道与排序
管道可以无限串联,将复杂的数据处理拆分为多个简单的步骤。
- 查看当前系统的所有进程。
- 筛选出包含
python关键字的进程。 - 使用
awk提取第二列(PID)和第十一列(命令名)。 - 使用
sort对结果按 PID 进行数字排序。 - 输入以下命令:
ps -ef | grep python | awk '{print $2, $11}' | sort -n
- 确认输出结果已按进程号(PID)从小到大排列。
4. 实用场景:查找并清理文件
管道不仅能查看数据,还能结合 xargs 命令执行批量操作,这是自动化运维的利器。
- 定位当前目录下所有超过 7 天未修改的
.tmp临时文件。 - 传递文件路径给
xargs,并执行删除操作。 - 输入以下命令进行模拟删除(先不真删,只打印):
find . -name "*.tmp" -mtime +7 | xargs -I {} echo "即将删除: {}"
- 确认输出的列表无误后,将
echo替换为rm执行真删除:
find . -name "*.tmp" -mtime +7 | xargs rm -f
5. 数据流向可视化
理解管道的数据流向对于排错至关重要。下图展示了数据如何从 Command 1 流向 Command 2。
graph LR
A["Command 1: 标准输出"] -->|"管道 | 截获数据"| B["Command 2: 标准输入"]
A -->|"屏幕显示? 否"| C["终端屏幕"]
6. 常用管道组合速查表
下表列出了开发与运维中最高效的管道组合方式。
| 场景描述 | 命令组合 | 解释 |
|---|---|---|
| 查找进程 ID | ps -ef \| grep name \| awk '{print $2}'` | 筛选进程并提取 PID 列 |
| **统计代码行数** | `find . -name "*.py" \| xargs wc -l` | 查找所有 Python 文件并汇总总行数 |
| **查看重复行** | `cat access.log \| sort \| uniq -c` | 排序后统计重复次数,便于分析日志 |
| **实时监控日志** | `tail -f server.log \| grep "ERROR"` | 持续追踪新增日志并仅报错错误信息 |
| **批量杀进程** | `ps -ef \| grep java \| grep -v grep \| awk '{print $2}' \| xargs kill -9 |
筛选 Java 进程并强制终止 |
7. 注意事项与陷阱
在使用管道时,必须注意以下几点以避免意外:
-
区分标准输出和标准错误。
|只传递标准输出(stdout)。如果命令报错,错误信息(stderr)会直接打印在屏幕上,不会进入管道。- 若要捕获错误信息,需使用
2>&1将错误重定向到标准输出:
./script.sh 2>&1 | grep "Error" -
检查管道右侧命令是否支持标准输入。
- 像
rm、cp这样的命令通常不直接从标准输入读取文件列表,必须配合xargs使用,否则会报错或无效。
- 像
-
警惕缓冲问题。
- 某些命令(如
grep)为了性能会缓冲输出,导致实时性变差。可以使用--line-buffered参数强制逐行处理:
tail -f log | grep --line-buffered "pattern" - 某些命令(如

暂无评论,快来抢沙发吧!