從零開始掌握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.pswp.cn/web/77368.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/77368.shtml
英文地址,請注明出處:http://en.pswp.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;適合“整體搬家”。 ?磁…