cut 命令從檔案的每一行剪下位元組、字元和欄位並將這些位元組、字元和欄位寫至標準輸出. 如果不指定 FIle 引數,cut 命令將讀取標準輸入.
語法:
cut -b[n] 位元組範圍
cut -c 字元範圍
cut -d ‘分隔字元’ -f fields
引數:
-b : 以位元組 (bytes) 為單位進行分割, 這些位元組位置將忽略多位元組字元邊界, 除非也指定了
-n 標誌;
-c : 以字元 (characters) 為單位進行分割;
-d : 自定義分隔符, 預設為製表符, 與-f 一起使用;
-f : 依據-d 分隔字元將一段資訊切割成數段, 用-f(fields) 取出第幾段的意思;
-n : 取消分割位元組字元. 僅和-b 標誌一起使用. 如果字元的最後一個位元組落在-b 標誌的 list
引數指示範圍之內, 該字元將被寫入; 否則, 該字元將被排除.
 
實驗環境:
為了使文件能識別中文, 這裏我把語系改為了 LANG=zh_CN.gb2312. 編碼 gb2312 下, 一個漢字佔 2 個位元組.
<1>以” 位元組” 定位
常見位元組範圍選項:
n          數字, 表示選取第 n 個位元組;
1-3,8  表示選取第 1 、 2 、 3 和 8 個位元組;
-3       表示選取第一個位元組到第三個位元組;
3-      表示選取第三個位元組到行尾;
 
例項 1:
[root@sqj2015 ~]# cat /etc/passwd |head -5 |cut -b 3-5,8
ot:0
n:x:
emox
m:x:
:x:7
 
<2>以” 字元” 定位
常見字元範圍選項:
n         數字, 表示選取第 n 個字元;
1-3,8  表示選取第 1 、 2 、 3 和 8 個字元;
-3      表示選取第一個字元到第三個字元;
3-      表示選取第三個字元到行尾;
 
例項 2:
[root@sqj2015 ~]# cat /etc/passwd |head -5 |cut -b 3-5,8
ot:0
n:x:
emox
m:x:
:x:7
通過觀察例項 1 與例項 2 看著-b -c 沒有什麼區別呢? 其實不然, 面對單位元組字元,-b 與-c 沒有區別, 若要提取中文, 區別就很明顯了.
[root@sqj2015 ~]# cat test.txt | cut -b 3
3
C
?
[root@sqj2015 ~]# cat test.txt | cut -c 3
3
C

看到了吧, 用-c 則會以字元為單位, 輸出正常; 而-b 只會以位元組 (8 位二進位制位) 來計算, 輸出就是亂碼了. 但是遇到多位元組字元時, 我們亦可以使用-n 選項,-n 用於告訴 cut 不要將多位元組拆開., 如下:
[root@sqj2015 ~]# cat test.txt | cut -nb 3
3
C
[root@sqj2015 ~]# cat test.txt | cut -nb 3-5,8
3458
CDEH
二四
 
<3>以” 分隔符” 定位
[root@sqj2015 ~]# cat /etc/passwd |head -5 |cut -d “:” -f 3
0
1
2
3
4
[root@sqj2015 ~]# cat /etc/passwd |head -5 |cut -d “:” -f 3-5,8
0:0:root
1:1:bin
2:2:daemon
3:4:adm
4:7:lp
這裏用-d 設定間隔符為冒號”:”, 然後用-f 來設定我要選取第幾段來擷取你需要的資料.
 
[root@sqj2015 ~]# last | head -3
root     pts/1        61.191.20.30     Thu Apr 14 01:27   still logged in
root     pts/0        61.191.20.30     Thu Apr 14 00:23   still logged in
root     pts/0        61.191.20.30     Wed Apr 13 23:05 – 00:23  (01:17)
 
[root@sqj2015 ~]# last | head -3 | cut -d ‘ ‘ -f 1
root
root
root
[root@sqj2015 ~]# last | head -3 | cut -d ‘ ‘ -f 1,3
root
root
root
cut -d ‘ ’ -f 3 ‘’ 之間有空格; 輸出結果我們發現第一個空白分割的欄位代表賬號, 所以使用以上命令; 但是 root pts/0 之間空格有好幾個, 並非一個, 所以如果我想提取第 1 、 3 段的資料, 使用 last | head -3 | cut -d ‘ ‘ -f 1,3, 資料結果就不會是我想要的.