Unix 常用指令 – cut

這裡討論的內容以 FreeBSD 為主,可能會與 linux 系的不同。

cut 算是一個還滿常用的重要指令,功能是將文字檔以行為單位,切割出每一行的某幾個欄位。 聽起來很抽象對不對?舉個實際的例子,假設有一個叫做「personal_data」的檔案內容如下:

姓名 身高 體重 身材 欄位真實性 chicken 高挑 身輕如燕 凹凸有致 (禁止)

這時,一個叫 chicken 的小姐出現了,她仔細看了這份文件後,認為最後一欄「欄位真實性」沒有存在的必要, 只需要顯示前面四欄資料即可,不需要全部列出來,這時她只要這麼下指令:

cut -f 1-4 personal_data

就會只顯示「姓名」、「身高」、「體重」「身材」這四欄結果,達成她的目的。

姓名 身高 體重 身材 chicken 高挑 身輕如燕 凹凸有致

從這個例子可以很顯而易見的看出來,參數「-f」代表要切的欄位,由左至右,由 1 開始, 中間可以加上「-」代表範圍,「1-4」 代表由 1 到 4 的範圍。

而若表示非連續的欄位,也可以使用「,」,比如說若 chicken 覺得除了最後一欄外, 第三欄的內容也「有一點點」不太符合事實,有一點心虛,所以想去掉這一欄,那麼她可以這麼下指令:

cut -f 1-2,4 personal_data

這樣就會只顯示:

姓名 身高 身材 chicken 高挑 凹凸有致

但要注意的一點是「 cut 是以 tab 鍵來當作分隔符號 」, 所以如果文件的內容是用「空格」或是「:」來分隔欄位的話, 則必須自行指定分隔符號才行,這個時候就可以使用參數「-d」。

cut -d " " -f 1-2,4 personal_data
Code language: JavaScript (javascript)

這個例子即表示以「空格」當作分隔符號的意思,而除了指定欄位用參數「-f」外, 也可以使用參數「-c」直接指定要切出那些字元,但因為用法和用參數「-f」很相似, 而且比較不常用(我個人認為),所以這裡就不多提了。

我發現在 FreeBSD 和在 Ubuntu 使用 cut 時,參數「-c」的行為有很多不同之處,這也是我不想討論的原因。

這邊再列舉一個常用的用法,比如說若 chicken 小姐想列出自己的 ID、UID 、家目錄和 Shell,她可以這麼做:

grep marco /etc/passwd | cut -f1,3,6-7 -d:

就會顯示:

chicken:1002:/home/chicken:/bin/tcsh
Code language: JavaScript (javascript)

補充一點,若要用 awk 達成同樣的效果的話,可以這麼做:

grep chicken /etc/passwd | awk -F: '{printf "%s:%s:%s:%s", $1, $3, $6, $7}'
Code language: JavaScript (javascript)

發表迴響