sed (Stream Editor) 與 awk 是 Linux/Unix 文字處理雙雄。sed 擅長流式編輯(替換、刪除、列印),awk 則是完整的資料處理程式語言(欄位分割、條件判斷、運算、格式化輸出)。本文整理常用語法與實戰範例。
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 -F'分隔符' '模式 {動作}' 檔案
$1、$2... 代表第 1、2 欄,$0 代表整行。NR:目前行號 (Record Number);NF:目前行欄位數 (Number of Fields)。| 類別 | 運算子 |
|---|---|
| 關係 | < > <= >= == != |
| 模式比對 | ~ (匹配) !~ (不匹配) 例:$1 ~ /^root$/ |
| 邏輯 | && (AND) || (OR) ! (NOT) |
| 算術 | + - * / % ^ |
printf "格式字串", 變數1, 變數2...
# 常用格式:%s 字串、%d 整數、%f 浮點數、%x 十六進位
# 寬度對齊:%-10s (左對齊 10 字元)、%10d (右對齊 10 字元)
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
awk 擷取欄位 → sort | uniq -c | sort -nr 統計 Top N。sed 's/,/\t/g' 逗號轉 Tab → awk 處理欄位。sed -i 就地替換 → awk 驗證格式。awk 計算彙總 → printf 格式化輸出 HTML/Markdown 表格。sed;複雜欄位運算、彙總、條件邏輯用 awk。awk 串流處理不載入整檔記憶體,適合 GB 級日誌。.awk 檔,awk -f script.awk data.txt 執行,易維護。awk '... {print "DEBUG:", $0} ...' 印出中間狀態。熟練 sed 與 awk,能讓您在無圖形介面的伺服器上,以極低資源消耗完成 90% 的文字資料處理任務。建議收藏本筆記,實際操作中查閱、修改、內化。