cut 指令: 擷取檔案每行指定範圍資料


cut 指令可以將檔案內每行資料, 選擇性地擷取指定的部份, 對於 Log 分析或過濾資料十分好用, 當然除了支援擷取檔案資料外, 也可以用管線 (pipe) 匯入資料, 以下教會是關於 cut 指令的用法。

cut 指令的語法:

cut [OPTION]… [FILE]…

cut 指令主要有以下參數可以:

-b: 輸出指定的範圍, 以 bytes 作為單位.
-c: 輸出指定的範圍, 以字元數量作為單位.
-d: 指定分隔字元, 預設是用 tab 作為分隔.
-f: 輸出指定的範圍, 這個是每行資料的第幾個欄位作為區分.
-s: 如果該行沒有分隔字元, 不會顯示該行資料.

現在看一看實際使用例子, 以下是 /etc/passwd 的內容:

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin


例如我想從 /etc/passwd 擷取帳號名稱及每個帳號的家目錄, 即第 1 欄及第 6 欄, 可以用以下指令:

$ cut -d : -f 1,6 /etc/passwd

會有類似以下的輸出:

root:/root
bin:/bin
daemon:/sbin
adm:/var/adm
lp:/var/spool/lpd
sync:/sbin
shutdown:/sbin
halt:/sbin
mail:/var/spool/mail

另一個用法是擷取指定位置的字串, 例如要擷取每行第 1 個至第 5 個字串, 可以這樣:

$ cut -b 1-5 /etc/passwd

輸出類似這樣:

root:
bin:x
daemo
adm:x
lp:x:
sync:
shutd
halt:
mail:

以上擷取字元的方法, 實際上很多情況會用上, 例如用 “ls -l” 查看目錄資料, 其中關於權限的部份是第 1 個至第 10 個字元, 指令是這樣:

$ ls -l | cut -c 1-10

只會輸出每個檔案及目錄的權限:

total 6200
drwxr-xr-x
drwx——
-rw-r–r–
-rw——-
-rw——-
-rw——-
-rw——-

Leave a Reply