cut 是 Linux 文字處理三劍客之一(另兩為 awk、sed),專注於「直向切割」:依分隔符或字元位置擷取特定欄位/範圍。語法簡潔、效能極佳,是 Shell 腳本處理結構化文字(CSV、/etc/passwd、日誌、命令輸出)的首選工具。本文詳細說明參數、範例與進階技巧。
cut [選項] [檔案...]
| 選項 | 說明 |
|---|---|
-d, --delimiter=分隔字元 | 指定欄位分隔符(預設 Tab),單一字元 |
-f, --fields=欄位清單 | 選取欄位編號(1-based),支援範圍 1,3-5 |
-c, --characters=字元清單 | 依字元位置切割(1-based),支援範圍 1-10 |
-b, --bytes=位元組清單 | 依位元組位置切割(處理多位元組字元時與 -c 不同) |
--complement | 反向選取(保留未指定的欄位/字元) |
-s, --only-delimited | 僅輸出含分隔符的行(忽略無分隔符行) |
--output-delimiter=字串 | 輸出時使用不同分隔符 |
cut -d: -f1,6 /etc/passwd
輸出:
root:/root
daemon:/usr/sbin
user1:/home/user1
cut -d: -f1-3,5- /etc/passwd
cut -d: --complement -f2 /etc/passwd
ls -l | cut -c55-
cut -d: -f1,3,6 --output-delimiter=$'\t' /etc/passwd
who | cut -d' ' -f1 | sort -u
cut 無法正確處理帶引號的 CSV(如 "field1","field2,with,comma")。請改用:
awk -F',' '{print $1,$3}'(簡單情況)csvkit 套件 csvcut -c 1,3 file.csvcsv 模組N:第 N 欄N-M:第 N 到 M 欄-M:第 1 到 M 欄N-:第 N 到最後1,3-5,7,9-echo "a:b:c:d" | cut -d: -f2,4
# 輸出: b:d
cut -d 僅支援單一字元。多字元分隔符請用:
awk -F'::' '{print $2}' # 以 :: 分隔
sed 's/::/\t/g' | cut -f2 # 先轉換為 Tab
| 工具 | 適用場景 | 速度 |
|---|---|---|
cut | 固定分隔符/位置擷取欄位 | 最快(C 語言實作,單執行緒) |
awk | 條件判斷、運算、格式化 | 快 |
sed | 模式替換、行編輯 | 快 |
Python/Perl | 複雜邏輯、CSV、JSON | 較慢(啟動開銷) |
#!/bin/bash
# 從 nginx access log 擷取 IP、請求方法、URL、狀態碼
# log 格式: IP - - [time] "GET /url HTTP/1.1" 200 ...
cut -d' ' -f1,6,7,9 access.log | head -20
# 監控特定使用者的 CPU 使用率 (ps 輸出固定寬度)
ps -eo user,pcpu,comm | grep ^nginx | cut -c1-16,17-22
-f0 會報錯。-s 可抑制。-c 計算字元數(UTF-8 多位元組字元算 1),-b 計算位元組數(中文通常 3 bytes)。--output-delimiter。cut 以「簡單、快速、專一」著稱。掌握 -d/-f 與欄位清單語法,即可處理 80% 結構化文字擷取需求。遇到 CSV 引號、多字元分隔符、需條件判斷時,果斷切換至 awk 或專用工具,勿強求 cut 做超出設計範圍的事。