面對結構化文字 (CSV、日誌、/etc/passwd 等),需垂直切分欄位時,cut 是最輕量高效的工具。本文詳細說明三種切分模式 (位元組、字元、欄位)、分隔符自訂、輸出格式控制與實戰範例。
指令語法
cut -b 列表 [-n] [檔案...] # 依位元組位置切分
cut -c 列表 [檔案...] # 依字元位置切分
cut -f 列表 [-d 分隔符] [-s] [檔案...] # 依欄位切分 (最常用)
核心參數
| 參數 | 功能 |
-b, --bytes=LIST | 選取指定位元組範圍 |
-c, --characters=LIST | 選取指定字元範圍 (多位元組字元安全) |
-d, --delimiter=CHAR | 指定欄位分隔符 (預設 Tab) |
-f, --fields=LIST | 選取指定欄位編號 |
-s, --only-delimited | 僅輸出含分隔符的行 (忽略無分隔符行) |
--output-delimiter=STR | 輸出時使用指定分隔符 (預設同輸入分隔符) |
--complement | 反向選取 (排除指定範圍) |
列表 (LIST) 範圍表示法
| 格式 | 意義 |
N | 第 N 個 (從 1 起算) |
N- | 第 N 個到行尾 |
N-M | 第 N 到第 M 個 (含) |
-M | 第 1 到第 M 個 |
1,3,5 | 第 1、3、5 個 (多個離散範圍) |
實戰範例集
範例 1:擷取 /etc/passwd 使用者名稱 (第 1 欄,以 : 分隔)
cut -d: -f1 /etc/passwd
# 輸出:root, bin, daemon, adm, lp...
範例 2:擷取第 1、3、7 欄 (用戶名、UID、Shell)
cut -d: -f1,3,7 /etc/passwd
# 輸出:root:0:/bin/bash, bin:1:/sbin/nologin...
範例 3:擷取前 4 個字元
cut -c1-4 /etc/passwd
# 輸出:root, bin:, daem, adm:...
範例 4:擷取第 1 個位元組
cut -b1 /etc/passwd | head -5
# 輸出:r, b, d, a, l
範例 5:自訂分隔符為 Tab 的檔案
# 檔案 a.txt 內容 (Tab 分隔):
# ssss affff dddd fe fsc
# rrr f adfa eer ddd
cut -f1,3 -d $'\t' a.txt
# 輸出:
# ssss dddd
# rrr adfa
範例 6:反向選取 — 排除第 2 欄
cut --complement -d: -f2 /etc/passwd
# 輸出除密碼欄位外所有欄位
範例 7:修改輸出分隔符為 |
cut -d: -f1,3,7 --output-delimiter="|" /etc/passwd
# 輸出:root|0|/bin/bash
範例 8:管線搭配 — 找出 UID ≥ 1000 的一般使用者
cut -d: -f1,3,7 /etc/passwd | awk -F: '$2 >= 1000'
# 或純 cut + grep (較不精確)
cut -d: -f1,3,7 /etc/passwd | grep -E ':[1-9][0-9]{3,}:'
進階搭配技巧
cut -d' ' -f1 搭配 sort | uniq -c | sort -nr 統計日誌首欄 (IP/用戶) 出現頻率 Top 10
ps aux | cut -c1-80 截斷過長輸出適應終端寬度
cut -f1 -d' ' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10 統計 Nginx 存取日誌 Top 10 客戶端 IP
對比:cut vs awk vs sed
| 工具 | 優勢 | 適用場景 |
| cut | 極簡、極快、記憶體占用極低、語法單一 | 固定寬度/固定分隔符欄位擷取、大檔案高效能 |
| awk | 可程式化、支援正則、數學運算、多欄位重組 | 複雜文字處理、條件篩選、報表產生 |
| sed | 串流編輯、正則替換、行範圍操作 | 文字替換、刪除特定行、插入行 |