Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux Sed 命令進階實戰:流編輯器核心語法、模式空間與腳本化技巧

編輯:Linux 教學

Sed (Stream Editor) 是 Linux 文本處理三劍客之一,以行為單位流式處理,支援正則匹配、地址定位、多命令腳本、保持/模式空間交換,是日志分析、配置文件批量修改、數據清洗的利器。

核心執行模型

  1. 讀取一行輸入到模式空間。
  2. 執行所有匹配該行的命令(按腳本順序)。
  3. 輸出模式空間內容(除非 -n 抑制)。
  4. 清空模式空間,讀取下一行,循環直到 EOF。

關鍵:默認不修改源文件,輸出至 stdout;使用 -i 就地修改(實為創建臨時文件替換)。

基礎語法與常用命令


sed [選項] '腳本' 文件...
sed [選項] -f 腳本文件 文件...
sed [選項] -e '腳本1' -e '腳本2' 文件...
命令功能示例
s/模式/替換/標誌替換s/old/new/g 全局替換;s#/usr/local#/opt#g 異界符
d刪除行/^#/d 刪除註釋行;1,10d 刪除前 10 行
p打印行-n '/error/p' 僅打印含 error 的行
a\文本行後追加/^$ /a\NEW_LINE 空行後插入
i\文本行前插入1i\# Header 文件首行添加
c\文本整行替換/TODO/c\DONE 將含 TODO 行替換為 DONE
y/源/目標/字符轉換y/abc/ABC/ 小寫轉大寫
q退出10q 處理完第 10 行退出
w 文件寫入文件/error/w errors.txt 錯誤行另存
r 文件讀取文件插入$r footer.txt 末尾插入 footer
=打印行號-n '=/pattern/=p' 打印行號與內容

地址定位:精確控制命令作用範圍

地址形式含義示例
N第 N 行5s/foo/bar/
$最後一行$a\EOF
/regex/匹配正則的行/ERROR/d
M,N第 M 到 N 行10,20s/old/new/g
/re1/,/re2/從匹配 re1 到匹配 re2 的行範圍/START/,/END/p
N~M從第 N 行開始每 M 行 (GNU)1~2d 刪除奇數行
!取反/^#/!d 刪除非註釋行

進階技巧與實戰範例

1. 多命令腳本化


# 單行多命令用分號分隔
sed 's/foo/bar/; s/baz/qux/; /^$/d' file

# 多行腳本 (推薦寫入文件,用 -f 調用)
cat > clean.sed <<'EOF'
/^#/d                    # 刪除註釋
/^$/d                    # 刪除空行
s/\t/    /g              # Tab 轉 4 空格
s/DEBUG/INFO/g           # 統一日志級別
/^ERROR/ w errors.txt    # 錯誤行導出
EOF
sed -f clean.sed app.log

2. 保持空間:跨行操作

Sed 擁有模式空間與保持空間,命令 h/H (複製/追加到保持)、g/G (取回/追加到模式)、x (交換)。


# 將每兩行合併為一行 (用換行符分隔)
sed 'N; s/\n/ /' file

# 反轉文件行順序 (tac 效果)
sed '1!G; h; $!d' file

# 在匹配行前後各輸出一行上下文
sed -n '/pattern/{x;p;x;p;x;p}' file

3. 就地修改與備份


sed -i.bak 's/old/new/g' *.conf  # 備份為 .bak 後就地修改
sed -i 's/PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config

4. 實戰:解析 Nginx 訪問日志提取 Top 10 IP


sed -n 's/^\([0-9.]\+\) .*/\1/p' access.log | sort | uniq -c | sort -nr | head -10

5. 實戰:批量修改配置文件中多個鍵值


sed -i -e 's/^max_connections.*/max_connections = 1000/' \
       -e 's/^buffer_pool_size.*/buffer_pool_size = 4G/' \
       /etc/my.cnf

GNU Sed vs BSD Sed (macOS) 差異

  • -i:GNU -i 可選備份後綴 -i.bak;BSD 必須提供後綴 -i '' (無備份) 或 -i.bak。
  • -E:GNU/BSD 均支援擴展正則;舊版 BSD 用 -r。
  • N~M 地址:GNU 專有。

最佳實踐建議

  • 複雜邏輯優先用 awk 或 python,Sed 專注行級流式編輯。
  • 生產環境 -i 前必先備份或測試輸出。
  • 正則中含 / 時改用異界符 s#...#...#、s|...|...|。
  • 大文件處理配合 -n 抑制默認輸出,按需 p 打印。
Copyright © Windows教程網 All Rights Reserved