UNIX 常用指令 - cut
- 分類:
- 字數: x 9雞數:計算文長的常見計量單位,一般而言數字大小與文章長度呈正相關
這裡討論的內容以 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
這個例子即表示以「空格」當作分隔符號的意思,而除了指定欄位用參數「-f」外, 也可以使用參數「-c」直接指定要切出那些字元,但因為用法和用參數「-f」很相似, 而且比較不常用(我個人認為),所以這裡就不多提了。
Note
我發現在 FreeBSD 和在 Ubuntu 使用 cut 時,參數「-c」的行為有很多不同之處,這也是我不想討論的原因。
這邊再列舉一個常用的用法,比如說若 chicken 小姐想列出自己的 ID、UID 、家目錄和 Shell,她可以這麼做:
>>> grep marco /etc/passwd | cut -f1,3,6-7 -d:
就會顯示:
chicken:1002:/home/chicken:/bin/tcsh
Note
補充一點,若要用 awk 達成同樣的效果的話,可以這麼做
>>> grep chicken /etc/passwd | awk -F: '{printf "%s:%s:%s:%s", $1, $3, $6, $7}'