技術文章 · IT 指令工具箱

sed、awk、cut、sort、uniq:文字與 log 處理常用指令

整理 sed、awk、cut、sort、uniq、tr、wc、head、tail 的實用範例,適合處理 CSV、設定檔、access log 與命令列輸出。

作者 Steve Chen · 發布  · 約 5 分鐘閱讀

IT 指令工具箱 — 廷皓技術專欄插圖

這些工具適合做快速盤點與一次性清理;資料格式只要有引號、換行欄位或複雜 CSV,就不該假設單一分隔符能安解析。

24 組範例LinuxmacOSGNU/BSD 差異查核日期:2026-08-11
動手前:先把結果輸出到新檔並 diff,確認後才替換正式檔。sed -i 在 GNU 與 macOS BSD 的語法不同,也會直接改檔。

查看與切欄位

看前 20 行Linux/macOS

head -n 20 app.log

只讀取開頭。

看最後 100 行Linux/macOS

tail -n 100 app.log

常用於快速看最新 log。

持續追蹤新增內容Linux/macOS

tail -F app.log

-F 會嘗試跟隨 log rotation;結束按 Ctrl+C。

計算行數Linux/macOS

wc -l access.log

輸出包含行數與檔名。

取冒號分隔第 1 欄Linux/macOS

cut -d ':' -f 1 /etc/passwd

只適合分隔規則單純的文字。

取固定字元範圍Linux/macOS

cut -c 1-12 report.txt

依字元位置切,不理解欄位語意。

把大寫轉小寫Linux/macOS

tr '[:upper:]' '[:lower:]' < names.txt

輸出到畫面;要保存請導到新檔。

刪除 Windows CR 字元Linux/macOS

tr -d '\r' < windows.txt > unix.txt

不會修改來源,完成後再比對。

sort 與 uniq

依文字排序Linux/macOS

sort names.txt

預設排序受 locale 影響。

依數字排序Linux/macOS

sort -n values.txt

把欄位當數字,不是字串。

依第 2 欄數字反向排序Linux/macOS

sort -k2,2nr report.txt

假設欄位以空白分隔。

排序並去除重複行Linux/macOS

sort -u names.txt

原順序不會保留。

統計每個值出現次數Linux/macOS

sort status.txt | uniq -c | sort -nr

uniq 只合併相鄰重複,所以前面要先 sort。

只顯示重複值Linux/macOS

sort names.txt | uniq -d

會列出至少出現兩次的行。

sed 與 awk

sed 預覽文字替換Linux/macOS

sed 's/old.example/new.example/g' app.conf

不加 -i 時只輸出結果,不改原檔。

只印指定行範圍Linux/macOS

sed -n '20,40p' app.log

讀取第 20 到 40 行。

刪除空白行後輸出Linux/macOS

sed '/^[[:space:]]*$/d' input.txt > cleaned.txt

先輸出新檔,再 diff。

GNU sed 先備份再原地改GNU/Linux

sed -i.bak 's/old/new/g' app.conf

會留下 app.conf.bak;完成後檢查差異。

macOS sed 先備份再原地改macOS

sed -i '.bak' 's/old/new/g' app.conf

BSD sed 的 -i 後需要備份副檔名參數。

awk 印第 1 與第 3 欄Linux/macOS

awk '{print $1, $3}' report.txt

預設以連續空白分欄。

awk 指定逗號分隔Linux/macOS

awk -F ',' '{print $1, $4}' simple.csv

不適用含引號逗號或多行欄位的正式 CSV。

awk 加總第 2 欄Linux/macOS

awk '{sum += $2} END {print sum}' values.txt

先確認空值與非數字如何處理。

awk 篩出 HTTP 5xxLinux/macOS

awk '$9 ~ /^5[0-9][0-9]$/ {print}' access.log

假設狀態碼位於第 9 欄,先核對 log_format。

awk 統計第 9 欄Linux/macOS

awk '{count[$9]++} END {for (s in count) print s, count[s]}' access.log | sort

欄位位置依實際 access log 格式而定。

怎麼確認有做對

  • 結果先導到新檔,使用 diff -u 比較。
  • 用 head、tail 與抽樣原始資料確認欄位位置。
  • 統計結果加總後應和原始行數或已知控制總數對得上。

常見錯誤

  • 把一般 CSV 當成永遠沒有引號與換行。
  • sed -i 沒留備份就直接改正式設定。
  • 忘記 uniq 只處理相鄰重複。
  • 欄位位置和 log_format 不一致,卻仍相信統計結果。

版本與官方文件

參數會隨工具版本與作業系統實作改變。正式環境先用 --help、-h 或系統內建說明確認,再以當版官方文件為準。

聯絡廷皓討論 看更多文章