首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

sed 與 awk 實戰筆記:文字處理、資料轉換與報表產生技巧

     編輯:MySQL 資料庫相關知識

前言

sed (Stream Editor) 與 awk 是 Linux/Unix 文字處理雙雄。sed 擅長流式編輯(替換、刪除、列印),awk 則是完整的資料處理程式語言(欄位分割、條件判斷、運算、格式化輸出)。本文整理常用語法與實戰範例。

一、sed 核心語法與範例

基本格式

sed [選項] '腳本' 檔案
sed -e '腳本1' -e '腳本2' 檔案

常用選項

  • -n:抑制預設輸出,需配合 p 指令列印。
  • -e:執行多個編輯指令。
  • -i:就地修改檔案(慎用,建議先備份)。
  • -r / -E:使用擴充正則表示式 (ERE)。

核心指令

指令說明
s/模式/替換/旗標替換。旗標:g 全域、i 忽略大小寫、p 列印被替換行
/模式/p列印符合模式的行 (需 -n)
/模式/d刪除符合模式的行
=列印行號
q結束處理

實戰範例

# 1. 將所有 aaa 替換為 bbb,並只輸出包含 XXX 的行,刪除包含 YYY 的行
sed -e 's/aaa/bbb/g' -n -e '/XXX/p' -e '/YYY/d' filename

# 2. 刪除空白行
sed '/^$/d' filename

# 3. 顯示第 10-20 行
sed -n '10,20p' filename

# 4. 在每行行首加上行號
sed = filename | sed 'N;s/\n/\t/'

# 5. 就地將設定檔中 port=3306 改為 port=3307
sed -i 's/^port=3306$/port=3307/' /etc/my.cnf

# 6. 使用分隔符避免斜線衝突 (如路徑替換)
sed 's|/usr/local|/opt|g' filename

正則表示式常用模式

  • ^$ 空行
  • ^.*$ 整行
  • \s+ 一或多個空白字元
  • [a-zA-Z][a-zA-Z0-9]* 合法識別字

二、awk 核心語法與範例

基本架構

awk '模式 {動作}' 檔案
awk -F'分隔符' '模式 {動作}' 檔案
  • 預設以空白字元 (空格/Tab) 分割欄位,$1、$2... 代表第 1、2 欄,$0 代表整行。
  • NR:目前行號 (Record Number);NF:目前行欄位數 (Number of Fields)。

運算子與條件判斷

類別運算子
關係< > <= >= == !=
模式比對~ (匹配) !~ (不匹配) 例:$1 ~ /^root$/
邏輯&& (AND) || (OR) ! (NOT)
算術+ - * / % ^

格式化輸出:printf

printf "格式字串", 變數1, 變數2...
# 常用格式:%s 字串、%d 整數、%f 浮點數、%x 十六進位
# 寬度對齊:%-10s (左對齊 10 字元)、%10d (右對齊 10 字元)

實戰範例 (假設檔案 tt 內容:)

aaa XXX 100 5
aaa YYY 98 9
bbb XXX 111 3
bbb YYY 99 8
# 1. 過濾包含 aaa 的行,輸出第 2、1 欄並插入 TTT
awk '/aaa/ {print $2, "TTT", $1}' tt
# 輸出:
# XXX TTT aaa
# YYY TTT aaa

# 2. 過濾第 3 欄為兩位數字 且 第 4 欄 > 5 的行
awk '$3 ~ /[0-9][0-9]/ && $4 > 5 {print $0}' tt
# 輸出:
# aaa YYY 98 9
# bbb YYY 99 8

# 3. 符合上述條件的行末尾加上 *
awk '$3 ~ /[0-9][0-9]/ && $4 > 5 {printf "%s\t%s\n", $0, "*"}' tt

# 4. 將第 1 欄改為 nnn 並加 TTT,再印出改為 uuu 的版本
awk '{ $1="nnn"; printf "%s\t%s\n", $0, "TTT"; $1="uuu"; print }' tt

# 5. 使用 next 跳過後續動作
awk '{ $1="nnn"; printf "%s\t%s\n", $0, "TTT"; next } { $1="uuu"; print }' tt
# 只輸出 nnn 版本

# 6. 第 3 欄 >= 100 加 TTT,其餘正常印出
awk '$3 >= 100 {printf "%s\t%s\n", $0, "TTT"; next} {print}' tt

# 7. 計算欄位總和
awk '{sum += $3} END {print "Total:", sum}' tt

進階:關聯陣列與多檔案處理

# 統計每個使用者 (第 1 欄) 出現次數
awk '{count[$1]++} END {for (u in count) print u, count[u]}' tt

# 合併兩個檔案以共同鍵值 (類似 JOIN)
awk 'NR==FNR {map[$1]=$2; next} $1 in map {print $1, map[$1], $2}' file1 file2

三、sed 與 awk 協作經典場景

  1. 日誌分析:awk 擷取欄位 → sort | uniq -c | sort -nr 統計 Top N。
  2. CSV/TSV 轉換:sed 's/,/\t/g' 逗號轉 Tab → awk 處理欄位。
  3. 設定檔批次修改:sed -i 就地替換 → awk 驗證格式。
  4. 報表產生:awk 計算彙總 → printf 格式化輸出 HTML/Markdown 表格。

四、最佳實踐建議

  • 單行簡單替換用 sed;複雜欄位運算、彙總、條件邏輯用 awk。
  • 大檔案處理:awk 串流處理不載入整檔記憶體,適合 GB 級日誌。
  • 腳本化:將複雜邏輯寫成獨立 .awk 檔,awk -f script.awk data.txt 執行,易維護。
  • 除錯:awk '... {print "DEBUG:", $0} ...' 印出中間狀態。

結語

熟練 sed 與 awk,能讓您在無圖形介面的伺服器上,以極低資源消耗完成 90% 的文字資料處理任務。建議收藏本筆記,實際操作中查閱、修改、內化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved