Linux Sed 深度解析:從日志清洗到 K8s 等12個高頻場景

看圖猜詩,你有任何想法都可以在評論區留言哦~
在這里插入圖片描述

摘要:Sed(Stream Editor)作為 Linux 三劍客之一,憑借其流式處理正則表達式能力,成為運維場景中文本批處理的核心工具。本文聚焦生產環境高頻需求,涵蓋日志清洗、K8s 配置管理、數據格式化等 12 大核心場景,通過代碼演示與原理剖析,提供可直接復用的 Sed 實戰模板。


文章目錄

    • 一、Sed 的優勢
      • 1.1 Sed的核心特性
      • 1.2 Sed與同類工具對比
    • 二、安裝配置
      • 2.1 安裝方法
      • 2.2 版本驗證
    • 三、使用技巧
      • 3.1 基礎語法結構
      • 3.2 核心命令與應用
    • 四、生產高頻場景
      • 4.1 日志文件清洗
      • 4.2 批量修改配置文件
      • 4.3 日志時間戳格式標準化
      • 4.4 刪除敏感信息(如密碼、Token)
      • 4.5 動態修改 K8s Deployment 鏡像版本
      • 4.6 提取錯誤日志的上下文(多行處理)
      • 4.7 批量轉換 CSV 文件為 TSV 格式
      • 4.8 K8s ConfigMap 內容批量更新
      • 4.9 日志按時間窗口切割(跨行處理)
      • 4.10 刪除 JSON 日志中的冗余字段
      • 4.11 K8s Pod 日志的實時過濾
      • 4.12 多文件批量注釋/取消注釋配置
    • 五、常見問題處理
      • 5.1 特殊字符轉義問題
      • 5.2 原地修改導致文件丟失
      • 5.3 正則表達式匹配失敗
    • 六、結語


一、Sed 的優勢

1.1 Sed的核心特性

  • 非交互式操作:通過命令行或腳本批量處理文本,無需人工干預。
  • 行尋址能力:支持按行號、正則表達式匹配定位操作范圍。
  • 原地編輯:通過-i參數直接修改源文件(需謹慎使用)。
  • 跨平臺兼容:適用于所有Unix/Linux系統及Windows(借助Cygwin/WSL)。

1.2 Sed與同類工具對比

工具SedAwkPerl
定位行級處理列/字段級處理復雜文本與邏輯處理
語法簡潔,專注文本流轉換支持變量、數組、條件判斷完整的腳本語言
性能極高(純流處理)較高中等(功能越復雜越慢)
適用場景簡單替換、刪除、插入結構化數據提取與報表生成復雜文本解析與正則操作

總結:Sed在簡單文本流處理場景中性能與簡潔性優勢突出,適合日志清洗、配置批量修改等任務。


二、安裝配置

2.1 安裝方法

  • Linux/Unix:默認預裝,無需額外安裝。
  • macOS:系統自帶BSD版本Sed,若需GNU版本:
    brew install gnu-sed
    # 使用gsed調用
    
  • Windows
    • 通過WSL使用Linux環境。
    • 安裝Cygwin或Git Bash集成環境。

2.2 版本驗證

# GNU版本顯示"GNU sed"
linux01@linux01:~/data/sed$ sed --version
sed (GNU sed) 4.9
Packaged by Debian
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

三、使用技巧

3.1 基礎語法結構

sed [選項] '地址范圍/模式 命令' 文件
  • 常用選項

    • -n:抑制默認輸出,僅顯示處理后的行。
    • -i[后綴]:原地編輯文件(建議備份,如-i.bak),重點:如需修改立即生效則設置該選項
    • -e:連接多個命令(如sed -e 'cmd1' -e 'cmd2')。
  • 常用正則

    • ^:匹配行首。
    • $:匹配行尾。
    • .*:匹配任意字符(通配符)。

3.2 核心命令與應用

替換操作(s命令)
語法s/模式/替換內容/修飾符

  • 基礎替換
    # 替換每行首個"apple"為"orange"
    sed 's/apple/orange/' file.txt
    
  • 全局替換(g修飾符)
    # 替換所有"apple"為"orange"
    sed 's/apple/orange/g' file.txt
    
  • 指定分隔符:支持任意分隔符(如#|),處理含斜杠內容:
    # 替換所有"apple"為"orange"
    sed 's#/path/to/old#/new/path#g' config.conf
    

刪除操作(d命令)

  • 刪除空行
    # 以空開頭,以空結尾,表示為空行
    sed '/^$/d' file.txt
    
  • 刪除特定范圍行
    # 刪除第5行
    sed '5d' file.txt
    # 刪除10到20行
    sed '10,20d' file.txt
    

插入與追加(i/a命令)

  • 行前插入(i)
    # 在第3行前插入"Hello World"
    sed '3i Hello World' file.txt
    
  • 行后追加(a)
    # 在匹配"error"的行后追加"Check log"
    sed '/error/a Check log' file.txt
    

多命令組合

# 刪除空行并替換"test"為"prod"
sed -e '/^$/d' -e 's/test/prod/g' file.txt

四、生產高頻場景

4.1 日志文件清洗

需求:清理Nginx日志中的調試信息(含DEBUG的行)并替換時間格式。
原始日志片段

2023-10-01 12:00:00 [DEBUG] Client 192.168.1.1 connected
2023-10-01 12:00:01 [INFO] Request /api/users handled

處理腳本

sed -e '/\[DEBUG\]/d' \     # 刪除DEBUG行-e 's/\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\) \([0-9:\{8\}\]\)/\1T\2Z/' \  # 時間格式標準化access.log > cleaned.log

輸出結果

2023-10-01T12:00:01Z [INFO] Request /api/users handled

4.2 批量修改配置文件

需求:將多臺服務器的/etc/ssh/sshd_configPort 22改為Port 2222,并備份原文件。
操作命令

# 精準定位
sed -i.bak 's/^Port 22$/Port 2222/' /etc/ssh/sshd_config# 驗證修改
grep '^Port 2222$' /etc/ssh/sshd_config

關鍵點

  • ^ 匹配以 Port 開頭,如未打開注釋的 # Port 則不匹配。
  • $ 匹配 22 結尾的行,如 Port 2211 則不匹配。

4.3 日志時間戳格式標準化

需求:將日志中的時間戳從 Oct 1 12:00:00 轉換為 ISO 8601 格式 2023-10-01T12:00:00Z
日志片段

Oct 1 12:00:00 server1 nginx: Started  
Oct 1 12:00:01 server2 app: Connected to DB  

Sed 命令

sed -E 's/([A-Za-z]{3}) ([0-9]{1,2}) ([0-9]{2}:){2}[0-9]{2}/2023-\1-\2T\3Z/' \  -e 's/\bOct\b/10/g' access.log  

關鍵點

  • -E 啟用擴展正則表達式,簡化分組捕獲。
  • 月份縮寫(如 Oct)需二次替換為數字。

4.4 刪除敏感信息(如密碼、Token)

需求:清理日志中的 password=*** 字段。
日志片段

user=admin password=123456 action=login  

Sed 命令

sed 's/password=[^ ]*//g' secure.log  

輸出

user=admin action=login  

說明[^ ]* 匹配非空格字符,直到下一個空格或行尾。


4.5 動態修改 K8s Deployment 鏡像版本

需求:將 Deployment YAML 中的鏡像 nginx:1.18 升級至 nginx:1.25
YAML 片段

containers:  
- name: nginx  image: nginx:1.18  

Sed 命令

sed -i.bak '/image: nginx/s/:1.18/:1.25/' deployment.yaml  

安全建議

  • -i.bak 生成備份文件,防止誤操作。

4.6 提取錯誤日志的上下文(多行處理)

需求:提取 Java 異常日志的完整堆棧跟蹤(含匹配行及其后 5 行)。
Sed 命令

sed -n '/Caused by:/{p; :loop n; p; /^$/q; b loop}' app.log  

解析

  • :loop 定義標簽,n 讀取下一行,/^$/q 遇到空行退出。

4.7 批量轉換 CSV 文件為 TSV 格式

需求:將逗號分隔的 CSV 轉換為制表符分隔的 TSV。
Sed 命令

sed 's/,/\t/g' data.csv > data.tsv  

注意:需確保字段內不含逗號(否則需更復雜的 CSV 解析器)。


4.8 K8s ConfigMap 內容批量更新

需求:替換 ConfigMap 中 debug: "true"debug: "false"
YAML 片段

data:  config.ini: |  [runtime]  debug=true  

Sed 命令

sed -i '/debug=/s/true/false/' configmap.yaml  

說明:限定在含 debug= 的行內替換,避免誤改其他字段。


4.9 日志按時間窗口切割(跨行處理)

需求:提取時間范圍 12:00:0012:05:00 的日志。
Sed 命令

sed -n '/12:00:00/,/12:05:00/p' syslog  

擴展:結合 awk 處理更復雜的時間范圍。


4.10 刪除 JSON 日志中的冗余字段

需求:移除 JSON 中的 internal_debug 字段。
日志片段

{"timestamp": "2023-10-01", "level": "error", "internal_debug": "x123", "msg": "failed"}  

Sed 命令

sed 's/"internal_debug":[^,]*,//' app.json  

輸出

{"timestamp": "2023-10-01", "level": "error", "msg": "failed"}  

4.11 K8s Pod 日志的實時過濾

需求:實時監控 Pod 日志中的 OOMKilled 事件。
命令組合

kubectl logs -f pod/app | sed -n '/OOMKilled/{s/^/[OOM] /; p;}'  

作用:在匹配行前添加 [OOM] 標記并輸出。


4.12 多文件批量注釋/取消注釋配置

需求:在 Nginx 配置目錄中注釋所有 listen 80 行。
Sed 命令

find /etc/nginx/ -type f -name "*.conf" -exec sed -i.bak '/listen 80/s/^/#/' {} +  

解析

  • find 定位所有 .conf 文件,-exec 批量執行 Sed。

五、常見問題處理

5.1 特殊字符轉義問題

問題:替換含斜杠/&的內容時格式錯誤。
解決

  • 更換分隔符:
    sed 's#/old/path#/new/path#g' file.txt
    
  • 轉義特殊字符:
    sed 's/&/\&amp;/g' file.txt  # 轉義XML中的&符號
    

5.2 原地修改導致文件丟失

問題:誤用-i未備份導致數據無法恢復。
預防

  • 始終使用-i.bak生成備份文件。
  • 測試命令時先省略-i,確認無誤后再執行修改。

5.3 正則表達式匹配失敗

問題:預期匹配的行未被處理。
調試方法

  • 使用p命令打印匹配行:
    sed -n '/pattern/p' file.txt
    
  • 啟用正則表達式調試工具(如regex101.com)驗證模式。

六、結語

Sed憑借其極簡語法高效流處理能力,成為Unix哲學中“小而美”工具的典范。掌握其核心命令與正則表達式技巧,可大幅提升文本處理效率,尤其在日志清洗、配置管理等場景中表現卓越。對于更復雜的文本操作,可結合Awk或Perl實現,但Sed始終是快速解決問題的首選利器。

在這里插入圖片描述
如果你覺得這篇文章對你有幫助,不妨點個贊👍,或者分享給你的朋友們吧!你的支持是我持續創作的最大動力!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/diannao/80281.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/80281.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/80281.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++ STL 容器簡介(藍橋杯適用精簡版)

C的萬能頭文件是&#xff1a; #include <bits/stdc.h> 一、常用 STL 容器 1.vector&#xff08;動態數組&#xff09; #include<iostream> #include<string> #include <vector> #include <algorithm> // 包含排序所需的頭文件 using namespa…

Java語言的進化:JDK的未來版本

作為一名Java開發者&#xff0c;我們正處在一個令人興奮的時代&#xff01;Java語言正在以前所未有的速度進化&#xff0c;每個新版本都帶來令人驚喜的特性。讓我們一起探索JDK未來版本的發展方向&#xff0c;看看Java將如何繼續領跑編程語言界&#xff01;&#x1f4aa; &…

不要使用Round函數保留小數位了

不要使用Round函數保留小數位了 如果你表格不需要保留公式&#xff0c;那么就不要使用Round函數保留小數位了。用Excel工作圈插件&#xff0c;可以輕松以數值形式保留小數位&#xff0c;且支持合并單元格、不連貫區域快速處理。 如下圖&#xff0c;有文本&#xff0c;有跨行合并…

【C++】入門基礎【下】

目錄 一、缺省參數二、函數重載1. 函數類型不同2. 參數個數不同3、函數類型順序不同 三、引用1、引用的概念和定義2、引用的功能2.1 功能1&#xff1a; 做函數形參&#xff0c;修改形參影響實參2.2 功能2&#xff1a; 做函數形參&#xff0c;減少拷貝&#xff0c;提高效率2.3 功…

git比較不同分支的不同提交文件差異

背景&#xff1a;只想比較某2個分支的某2次提交的差異&#xff0c;不需要帶上父提交。 以commitA為基準&#xff0c;用commitB去比較差異 直接上代碼&#xff1a; commitAxxxx1 commitBxxxx2 outputFile"output.txt"# 獲取與第一個父提交的文件列表 filesA$(git di…

Linux內核之struct pt_regs結構

前沿 項目開發最近進行系統hook功能實現相關業務&#xff0c;主要在centos7和8系列環境開發下關功能。調研了相關知識點&#xff0c;發現在系統7和8上內核版本差別比較大&#xff0c;7-3.10.x系列版本&#xff0c;8-4.18.x系列版本。依據兩個系統的內核情況根對應的內核符號表進…

《從混亂到有序:ArkUI項目文件結構改造指南》

在ArkUI開發的廣袤天地里&#xff0c;構建一個清晰、有序的文件結構&#xff0c;是打造優質應用的關鍵。一個合理的文件結構&#xff0c;就像為開發者精心繪制的地圖&#xff0c;在項目的各個階段&#xff0c;都能提供明確的指引&#xff0c;讓開發過程順暢無阻。今天&#xff…

C#基于Sunnyui框架和MVC模式實現用戶登錄管理

C#基于Sunnyui框架和MVC模式實現用戶登錄管理 1 Controller1.1 UserManagementController.cs&#xff08;控制器入口&#xff09; 2 Model2.1 UserRepository.cs&#xff08;用戶管理模型&#xff09;2.2 User.cs&#xff08;用戶結構體&#xff09;2.3 SQLiteHelper.cs&#x…

自然語言處理(NLP)技術的實例

自然語言處理&#xff08;NLP&#xff09;技術在各個領域都有廣泛的應用&#xff0c;以下是幾個例子&#xff1a; 語音識別&#xff1a;通過NLP技術&#xff0c;計算機可以識別和理解語音指令&#xff0c;例如智能助手如Siri和Alexa就是通過語音識別技術實現與用戶的交互。 機…

Spring Boot實戰(三十六)編寫單元測試

目錄 一、什么是單元測試&#xff1f;二、Spring Boot 中的單元測試依賴三、舉例 Spring Boot 中不同層次的單元測試3.1 Service層3.2 Controller 層3.3 Repository層 四、Spring Boot 中 Mock、Spy 對象的使用4.1 使用Mock對象的背景4.2 什么是Mock對象&#xff0c;有哪些好處…

aws服務(四)文件存儲服務S3 介紹使用代碼集成

一、介紹 1、簡介 Amazon S3 是 Amazon Web Services 提供的一種對象存儲服務(Object Storage),用于在云中存儲和檢索任意數量的數據。它以高可用性、高擴展性和高持久性著稱,非常適合用來存儲網站資源、數據備份、日志文件、大數據、機器學習輸入輸出等。 2、主要特性 …

應用信息1.13.0發布

增加工具箱 增加啟動器功能 增加布局查看器 增加手動安裝和卸載應用 增加APK文件解析 增加應用多選功能 增加查看應用預裝版本 增加應用信息和ADB命令導出 修復其它問題... 百度下載&#xff1a;百度網盤 請輸入提取碼 提取碼&#xff1a;1234

【Vue3 實戰】插槽封裝與懶加載

一、為什么需要插槽&#xff1f;從一個面板組件說起 在電商首頁開發中&#xff0c;經常遇到這樣的場景&#xff1a; 「新鮮好物」「人氣推薦」同樣類型模塊都需要相同的標題欄&#xff0c;但內容區布局不同 這時候&#xff0c;插槽&#xff08;Slot&#xff09;就像一個「內容…

虛無隧穿產生宇宙(true nothing tunneling) 是誰提出的

是 亞歷克斯.維連金 英文名&#xff08;alex vilenkin 或者 Alexander Vilenkin)提出來的。 “虛無隧穿產生宇宙”&#xff08;true nothing tunneling&#xff09;這一概念并非一個標準的物理學術語&#xff0c;它更像是對某些現代宇宙學理論的描述&#xff0c;尤其是涉及宇宙…

postgis:添加索引時提示“對訪問方法 gist 數據類型 geometry 沒有默認的操作符表“

問題 在對gis表的geom字段創建空間索引時&#xff0c;出現“對訪問方法 "gist" 數據類型 geometry 沒有默認的操作符表”的提示報錯。 解決方案 按系列步驟進行排查并解決。 1.先確認已安裝postgis -- 查看postgis版本 SELECT postgis_full_version() 若安裝了則…

圖論---Prim堆優化(稀疏圖)

題目通常會提示數據范圍&#xff1a; 若 V ≤ 500&#xff0c;兩種方法均可&#xff08;樸素Prim更穩&#xff09;。 若 V ≤ 1e5&#xff0c;必須用優先隊列Prim vector 存圖。 #include <iostream> #include <vector> #include <queue> #include <…

代碼隨想錄算法訓練營第一天:數組part1

今日學習的文章鏈接和視頻鏈接 ● 自己看到題目的第一想法 ● 看完代碼隨想錄之后的想法 ● 自己實現過程中遇到哪些困難 ● 今日收獲&#xff0c;記錄一下自己的學習時長 狀態 思路理解完成 30% 代碼debug完成 60% 代碼模板總結并抽象出來 100% 題目 704 二分查找 題目鏈接…

企業為何要求禁用缺省口令?安全風險及應對措施分析

在當今數字化時代&#xff0c;企業網絡安全面臨著前所未有的挑戰。缺省口令的使用是網絡安全中的一個重要隱患&#xff0c;許多企業在制定網絡安全紅線時&#xff0c;明確要求禁用缺省口令。本文將探討這一要求的原因及其對企業安全的重要性。 引言&#xff1a;一個真實的入侵場…

PostgreSQL 中的權限視圖

PostgreSQL 中的權限視圖 PostgreSQL 提供了多個系統視圖來查詢權限信息&#xff0c;雖然不像 Oracle 的 DBA_SYS_PRIVS 那樣集中在一個視圖中&#xff0c;但可以通過組合以下視圖獲取完整的系統權限信息。 一 主要權限相關視圖 Oracle 視圖PostgreSQL 對應視圖描述DBA_SYS_…

【防火墻 pfsense】1簡介

&#xff08;1&#xff09; pfSense 有以下可能的用途&#xff1a; 邊界防火墻 路由器 交換機 無線路由器 / 無線接入點 &#xff08;2&#xff09;邊界防火墻 ->要充當邊界防火墻&#xff0c;pfSense 系統至少需要兩個接口&#xff1a;一個廣域網&#xff08;WAN&#xff0…