如何在 Shell 脚本中使用管道(pipeline)实现数据传递?(容易)

👨‍⚕️ 主页: gis分享者

👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍⚕️ 收录于专栏:Shell 面试

文章目录

  • 一、🍀前言
    • [1.1 ☘️基本语法](#1.1 ☘️基本语法)
    • [1.2 ☘️管道的工作原理](#1.2 ☘️管道的工作原理)
    • [1.3 ☘️扩展知识](#1.3 ☘️扩展知识)

一、🍀前言

在 Shell 脚本中,管道(Pipeline)是一种极其强大的机制,它允许你将多个命令串联起来,让前一个命令的输出直接作为下一个命令的输入。这种设计哲学源自 Unix 的"一个工具只做一件事,并做好它"的理念,通过管道可以将多个简单工具组合成复杂的功能。

1.1 ☘️基本语法

管道使用竖线符号 | 连接两个或多个命令:

javascript 复制代码
command1 | command2 | command3 ...
# 例如,我们可以通过管道将 ls 命令的输出传递给 grep 命令:
ls -l | grep "txt"
# 这个命令会列出当前目录中所有文件,然后 grep 命令会筛选出包含 "txt" 字符串的文件。

执行顺序:从左到右依次执行。

数据流向:

command1 的标准输出(stdout)会传递给 command2 的标准输入(stdin)。

command2 的输出会继续传递给 command3,依此类推。

错误流(stderr):默认情况下,管道不传递标准错误输出(除非特殊处理)。

1.2 ☘️管道的工作原理

匿名管道(Anonymous Pipe):Shell 中的 | 会创建一个临时内存管道,不会生成磁盘文件。

并行执行:管道中的命令是同时启动的,而非顺序执行。例如:

powershell 复制代码
cat large_file.txt | grep "error" | wc -l

cat、grep 和 wc 三个进程同时运行。

grep 会一边接收 cat 的输出,一边处理并传递给 wc。

1.3 ☘️扩展知识

多级管道:

管道不仅限于连接两个命令,可以链式连接多个命令。例如:

powershell 复制代码
ps aux | grep httpd | awk '{print $2}'

这个命令中:

ps aux:列出系统中所有运行的进程。

grep httpd:筛选出包含 "httpd" 的行。

awk '{print $2}':提取这些行中的第二列(即进程 ID)。

数据处理:

如果需要复杂的数据处理,可以结合 sed、awk、sort 等命令。例如:

powershell 复制代码
cat /var/log/syslog | grep "error" | sort | uniq

这个命令会读取 syslog 文件,过滤出包含 "error" 的行,对这些行进行排序,并去重。

子进程与管道:

管道命令的传递是在子进程间进行的。每执行一个命令,系统会为它创建一个子进程,管道符号连接的各个命令运行在独立的进程中。

案例:

假设我们有一个 CSV 文件,想要提取第二列的最大值,可以使用如下管道命令链:

powershell 复制代码
cat data.csv | cut -d ',' -f 2 | sort -n | tail -1

cat data.csv:读取 CSV 文件。

cut -d ',' -f 2:按逗号分隔并提取第二列。

sort -n:按数值顺序排序。

tail -1:取最后一行,即最大值。

相关推荐
HalvmånEver5 分钟前
Linux:匿名管道(进程间通信二)
linux·运维·服务器
lengjingzju20 分钟前
一网打尽Linux IPC(一):进程间通信完全指南——总体介绍
linux·服务器·c语言
阿豪学编程34 分钟前
【Linux】进程信号深度解析
linux·运维·服务器
10000hours1 小时前
【Vim】vim常用命令:查找&编辑&可视区块
linux·编辑器·vim
chenyuhao20241 小时前
Linux网络编程:HTTP协议
linux·服务器·网络·c++·后端·http·https
txzz88882 小时前
CentOS-Stream-10 搭建NTP服务器(一)
linux·服务器·centos·ntp服务
卡尔特斯2 小时前
Zsh、GitBash 终端增强指南(Windows、Mac/Liunx)
shell
冉佳驹2 小时前
Linux ——— 虚拟地址、页表、物理地址与 waitpid 和进程管理中的核心概念和技术
linux·waitpid·进程程序替换·exit·地址空间·非阻塞轮询·exec系列
最后一个bug3 小时前
CPU的MMU中有TLB还需要TTW的快速查找~
linux·服务器·系统架构
小杨同学494 小时前
Linux 从入门到实战:常用指令与 C 语言开发全指南
linux