从零开始掌握Linux数据流:管道与重定向完全指南

全文目录

    • 1 知识背景与核心概念
      • 1.1 操作系统的输入输出模型
      • 1.2 Shell 的中间人角色
    • 2 重定向技术深度解析
      • 2.1 输出重定向
        • 2.1.1 覆盖写
        • 2.1.2 追加写
        • 2.1.3 错误重定向
        • 2.1.4 同时重定向 stdout 和 stderr
      • 2.2 输入重定向
        • 2.2.1 文件作为输入源
        • 2.2.2 Here Document(多行输入重定向)
      • 2.3 高级重定向
        • 2.3.1 文件描述符复制
        • 2.3.2 空设备丢弃输出
    • 3 管道技术原理解析
      • 3.1 基本用法
      • 3.2 底层实现
        • 3.2.1 匿名管道(Anonymous Pipe)
        • 3.2.2 缓冲机制
      • 3.3 高级应用
        • 3.3.1 多级管道
        • 3.3.2 结合重定向
    • 4 管道原理示意
      • 4.1 原理示意
      • 4.2 管道模型
    • 5 关键技术对比
    • 6 常见问题与解决方案
    • 7 参考文献


写在前面

前面的博文详细梳理了《Linux日志处理命令完全解构 》,主要分类讲解了几种常用的日志命令及对其性能进行了分析。本来想写一篇关于这些命令组合使用的实战讲解,但在写之前还有些前置基础知识需要先讲清楚,那就是Linux 中管道和重定向相关的知识,这些是多命令组合日志处理的基础,于是在这里先整理下关于管道和重定向相关的知识。
本文重点介绍了 Linux 重定向和管道技术,从基本知识到技术原理进行了讲解和说明,希望帮助读者对重定向和管道技术有个更加全面的认知。


1 知识背景与核心概念

1.1 操作系统的输入输出模型

Linux 继承 Unix 的哲学思想,将一切设备抽象为文件。程序通过文件描述符(File Descriptor)与硬件设备交互,其中:

  1. 0 标准输入(stdin)
  2. 1 标准输出(stdout)
  3. 2 标准错误(stderr)

1.2 Shell 的中间人角色

当用户执行命令时,Shell 负责创建子进程并管理其输入输出流。重定向和管道本质上是修改这些流的行为。

2 重定向技术深度解析

2.1 输出重定向

2.1.1 覆盖写
  • 命令格式command > file 举例 ls > a.log #将 ls 内容写入到 a.log 中
  • 基本原理:创建新文件或截断现有文件,将 stdout 绑定到文件
2.1.2 追加写
  • 命令格式command >> file # 举例 ls >> a.log #将 ls 内容追加写入到 a.log 中,原来 a.log 中的内容不会被覆盖
  • 基本原理:保持文件内容不变,在末尾追加输出
2.1.3 错误重定向
  • 命令格式command 2> error.log # 将 command 错误输出写入到 error.log 中
  • 基本原理:创建新文件或截断现有文件,标准错误 stderr 重定向输出到 error.log 文件中
  • 提示:上面 “>” 均可换成 “>>”,变成追加模式
2.1.4 同时重定向 stdout 和 stderr
  • 命令格式
    • command &> e.log # 将 command 标准输出和错误输出全部写入到 e.log 中
    • command 1> list.txt 2> list.err # 分开输出,将标准数据输出到 list.txt ,标准错误数据输出到 list.err
  • 基本原理:创建新文件或截断现有文件,标准错误 stderr 和标准数据 stdout 同时重定向输出到 e.log 文件中
  • 提示:上面 “>” 均可换成 “>>”,变成追加模式

2.2 输入重定向

2.2.1 文件作为输入源
  • 命令格式command < input.txt # 文件内容作为 command 输入
  • 基本原理:将文件描述符 0 绑定到指定文件(文件描述符 0 是 Linux 系统中预定义的标准输入(stdin)标识符,系统级映射:每个进程启动时自动创建,默认绑定键盘输入设备)
  • 举例说明
# 统计文件行数
wc -l < /etc/passwd     # 将 /etc/passwd 文件内容通过 < 重定向给 wc 命令处理,避免直接传递文件名参数

在这里插入图片描述

2.2.2 Here Document(多行输入重定向)
  • 命令格式
# 生成cfg.ini配置
cat > cfg.ini <<EOF
[server]
ip = 192.168.1.1
port = 8080
EOF

如下图:
在这里插入图片描述

  • 解释说明:‌Here Document‌是一种在命令行shell和程序语言中定义字符串的方法,它允许在脚本中传递多行文本作为输入,而无需多次调用echo或手动输入。EOF是Here Document的标识符,通常使用EOF(End Of File)作为标识符,但也可以是其他任意合法字符,但结尾的标记一定要顶格写,前面不能有任何字符,后面也不能有任何字符(包括空格)‌。通过Here Document,可以一次性传递大量文本内容,避免了反复调用命令的麻烦。

2.3 高级重定向

2.3.1 文件描述符复制
  • 命令格式command >file 2>&1 # 错误输出到标准输出流
  • 举例说明ls > e.log 2>&1 # 举例,将 ls标准输出和错误输出全部写入到 e.log 中
    • 先创建/清空文件
    • 将错误流绑定到已重定向的标准输出流
2.3.2 空设备丢弃输出
  • 命令格式command > /dev/null # 将输出引入到空设备,丢弃
  • 举例说明ls -al 1> list.txt 2> /dev/null # 将标准数据输出到 list.txt,标准错误数据丢弃, /dev/null 可看成黑洞装置

3 管道技术原理解析

bash 命令执行时有输出的数据,如果这些数据必需要经过几道手续处理之后才能得到想要的格式,应该怎么处理?这就要用到管道命令了( pipe ),管道命令使用的是『 | 』。

3.1 基本用法

  • 命令格式command1 | command2 # 如ls -al | grep "xxx" ls的输出作为grep的输入然后获取含xxx的部分
  • 命令说明
    • 创建匿名管道(内存缓冲区)
    • command1 的 stdout 连接到管道的写端
    • command2 的 stdin 连接到管道的读端

3.2 底层实现

3.2.1 匿名管道(Anonymous Pipe)

使用 pipe() 系统调用创建,单向通信,存在于内存中

3.2.2 缓冲机制

默认缓冲区大小通常为 4KB(可配置),当缓冲区满时写操作阻塞

3.3 高级应用

3.3.1 多级管道

cmd1 | cmd2 | cmd3 # 形成处理流水线

3.3.2 结合重定向

cmd1 | tee log.txt | cmd2 # 同时输出到文件和后续命令

补充说明:tee 命令是一个在 Unix 和类 Unix 操作系统(如 Linux 和
macOS)中常用的命令行工具,它读取标准输入(stdin),并将其内容输出到标准输出(stdout)文件

4 管道原理示意

4.1 原理示意

+----------------+     pipe        +---------------+
|   command1     |  -------------> |   command2    |
| (stdout -> fd1)|   (fd1 -> fd0)  | (stdin <- fd0)|
+----------------+                 +---------------+

4.2 管道模型

管道本质实现了经典的生产者-消费者模型

+---------------+                +---------------+
|   生产者进程    |   → 缓冲区 →    |  消费者进程    |
|   (写入数据)   |      pipe      |  (读取数据)    |
+---------------+                +---------------+

该模型确保数据的有序传输,缓冲区作为中间媒介解耦生产与消费过程

5 关键技术对比

特性重定向管道
数据流向文件/设备进程间通信
存储介质磁盘/终端等内存缓冲区
生命周期持久化存储进程结束即消失
典型用途输入输出持久化进程间实时数据传递

6 常见问题与解决方案

  1. 覆盖问题:使用 >> 代替 > 防止意外覆盖重要文件
  2. 权限错误:检查目标文件的写权限(ls -l 查看权限)
  3. 缓冲不一致:使用 stdbuf -oL command 调整缓冲策略
  4. 管道中断set -o pipefail 捕获管道中任意环节的错误

7 参考文献

文献1|文献2|文献3


写在最后

文章整体总结分析了重定向和管道技术,如有任何问题,请您评论指正,希望对您有所帮助,觉得有用,也欢迎点赞和收藏。
以上是对重定向和管道技术的整理分析,接下来会整理一篇关于管道技术结合日志处理命令在实战中的具体应用,敬请期待!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/77368.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

aws(学习笔记第三十九课) iot-core

文章目录 aws(学习笔记第三十九课) iotcore(Internet Of Thing)学习内容:1. 整体架构1.1 代码链接1.2 整体架构(概要)1.3 整体架构(详细 )2. 代码解析2.1 创建`IOT thing`2.2 创建`AWS IOT certificate`证书2.2.1 创建`lambda`需要的`role`2.2.2 创建`lambda`2.2.3 `lambd…

国家新政鼓励游戏出海,全球化安全威胁如何解

本文作者&#xff1a;腾讯宙斯盾DDoS防护团队 01 政策红利释放&#xff1a;游戏出海升级为“国家战略工程” 01 4月21日&#xff0c;国务院新闻办公室发布《加快推进服务业扩大开放综合试点工作方案》&#xff0c;释放了一个信号&#xff1a;首次将“游戏出海”列为战略级工程&…

MobX 在 React 中的使用:状态管理的新选择

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…

Idea 配置 Git

1、下载Git 下载地址&#xff1a; Git - Downloading Package 2、win 打开 git bash &#xff0c;配置邮箱和用户名 //配置邮箱 git config --global user.email "710419844qq.com" //配置全局用户名 git config --global user.name "smelodys" 3、ide…

Vue3 + OpenLayers 开发教程 (四) 样式配置与性能优化

1. 地图样式基础概念 1.1 什么是地图样式&#xff1f; 地图样式是决定地图要素&#xff08;点、线、面&#xff09;如何显示的重要配置。在 OpenLayers 中&#xff0c;样式主要包含以下几个核心组件&#xff1a; Fill&#xff08;填充&#xff09;&#xff1a;控制面状要素的…

【Nacos-安全与限流机制健全06 】

文章目录 Nacos安全机制介绍Nacos代码实现Nacos限流机制Nacos限流的代码实现 Nacos安全机制介绍 一、Nacos安全控制机制 Nacos 提供了多种安全控制机制&#xff0c;以保证服务和配置的访问安全&#xff1a; 身份验证 (Authentication) Nacos 支持用户身份验证来防止未授权的访…

自建开源远程协助服务RustDesk —— 筑梦之路

开源项目 # 服务端https://github.com/rustdesk/rustdesk-server.git# 客户端https://github.com/rustdesk/rustdesk.git 搭建服务端 需要使用的端口、协议 hbbs - RustDesk ID 注册服务器 hbbr - RustDesk 中继服务器默认情况下&#xff0c;hbbs 监听 21115(tcp) , 21…

Jmeter中同步定时器使用注意点

1.设置数量不可大于总线程数量&#xff0c;不然会一直等待 2.设置数量必须与总线程数量成整数倍数&#xff0c;不然还是要一直等。 3.当配置的数量小于线程数时&#xff0c;最好把循环打开&#xff0c;避免最后一次未准备好的线程数量达不到并发数。

作为高速通道光纤传输模式怎么理解以及到底有哪些?

光纤的传输模式主要取决于光纤的结构(如纤芯直径和折射率分布),不同模式对应光波在光纤中传播的不同路径和电磁场分布。以下是光纤传输模式的主要分类及特点: 1. 单模光纤(Single-Mode Fiber, SMF) 核心特点: 纤芯直径极小(通常为 8-10微米),仅允许光以单一模式(…

小程序Npm package entry file not found?

修改依赖包的入口文件 看是不是cjs&#xff0c;小程序不支持cjs

Android HAL HIDL

1 Android HAL HIDL 1.1 Android中查看有哪些HIDL HAL HIDL是Treble Interface的一部分。 adb root adb shell # lshal 1.2 Android打印C调用栈 #include <utils/CallStack.h> 在需要打印的地方加如下的定义。 android::CallStack stack("oem"); logcat | g…

【AI 加持下的 Python 编程实战 2_11】DIY 拓展:从扫雷小游戏开发再探问题分解与 AI 代码调试能力(下)

&#xff08;接 上篇&#xff09; 5 复盘与 Copilot 的交互过程 前面两篇文章分别涵盖了扫雷游戏的问题分解和代码实现过程&#xff0c;不知道各位是否会有代码一气呵成的错觉&#xff1f;实际上&#xff0c;为了达到最终效果&#xff08;如下所示&#xff09;&#xff0c;我…

游戏状态管理:用Pygame实现场景切换与暂停功能

游戏状态管理:用Pygame实现场景切换与暂停功能 在开发游戏时,管理游戏的不同状态(如主菜单、游戏进行中、暂停等)是非常重要的。这不仅有助于提升玩家的游戏体验,还能使代码结构更加清晰。本文将通过一个简单的示例,展示如何使用Pygame库来实现游戏中的场景切换和暂停功…

Java后端开发day36--源码解析:HashMap

&#xff08;以下内容均来自上述课程&#xff09; 1. HashMap&#xff08;一&#xff09; 底层&#xff1a;数组链表红黑树 1.1 前提准备 查看源码&#xff1a;选中HashMap–ctrlB 小细节&#xff1a;快捷键ctrlf12–跳出目录结构 蓝色圆圈&#xff1a;class 证明是类名粉…

RT-Thread学习笔记(四)

RT-Thread学习笔记 线程间同步信号量信号量的使用和管理动态创建信号量静态创建信号量获取信号量信号量同步实列互斥量互斥量的使用和管理互斥量动态创建互斥量静态创建互斥量获取和释放互斥量实例事件集事件集的使用和管理动态创建事件集静态初始化事件集发送和接收事件事件集…

element ui el-col的高度不一致导致换行

问题&#xff1a;ell-col的高度不一致导致换行&#xff0c;刷新后审查el-col的高度一致 我这边是el-col写的span超过了24&#xff0c;自行换行&#xff0c;测试发现初次进入里面的高度渲染的不一致&#xff0c;有的是51px有的是51.5px 问题原因分析 Flex布局换行机制 Elemen…

现代化Android开发:Compose提示信息的最佳封装方案

在 Android 开发中&#xff0c;良好的用户反馈机制至关重要。Jetpack Compose 提供了现代化的 UI 构建方式&#xff0c;但提示信息(Toast/Snackbar)的管理往往显得分散。本文将介绍如何优雅地封装提示信息&#xff0c;提升代码可维护性。 一、基础封装方案 1. 简单 Snackbar …

【C++语法】类和对象(2)

4.类和对象&#xff08;2&#xff09; 文章目录 4.类和对象&#xff08;2&#xff09;类的六个默认成员函数(1)构造函数&#xff1a;构造函数特点含有缺省参数的构造函数构造函数特点&#xff08;续&#xff09;注意事项构造函数补充 前面总结了有关对象概念&#xff0c;对比 C…

【自然语言处理与大模型】vLLM部署本地大模型②

举例上一篇文章已经过去了几个月&#xff0c;大模型领域风云变幻&#xff0c;之前的vLLM安装稍有过时&#xff0c;这里补充一个快速安装教程&#xff1a; # 第一步&#xff1a;创建虚拟环境并激活进入 conda create -n vllm-0.8.4 python3.10 -y conda activate vllm-0…

26 Arcgis软件常用工具有哪些

一、画图改图工具&#xff08;矢量编辑&#xff09;‌ ‌挪位置工具&#xff08;移动工具&#xff09;‌ 干哈的&#xff1f;‌选中要素‌&#xff08;比如地块、道路&#xff09;直接拖到新位置&#xff0c;或者用坐标‌X/Y偏移‌批量移动&#xff0c;适合“整体搬家”。 ‌磁…