cut 是一個選取命令,將一段數據進行分析,取得我們想要的
語法:
cut (參數)(文件)
常用參數:
-b:僅顯示行中指定直接範圍的內容;(以字節爲單位分割)
-c:僅顯示行中指定範圍的字符;(以字符爲單位分割)
-d:指定字段的分隔符,默認的字段分隔符爲“TAB”;
-f:顯示指定字段的內容; (以字段爲分隔符)
-n:與“-b”選項連用,不分割多字節字符;
--complement:補足被選擇的字節、字符或字段;
--out-delimiter=<字段分隔符>:指定輸出內容是的字段分割符;
--help:顯示指令的幫助信息;
--version:顯示指令的版本信息。
cut命令主要是接受三個定位方法:
第一,字節(bytes),用選項-b
第二,字符(characters),用選項-c
第三,域(fields),用選項-f
1、以“字節”定位
[root@xiaojin oldboy]# who
root pts/1 2019-01-08 20:27 (10.0.0.1)
[root@xiaojin oldboy]# who|cut -b 3
o
如果“字節”定位中,我想提取第3,第4、第5和第8個字節,怎麼辦?
-b支持形如3-5的寫法,而且多個定位之間用逗號隔開就成了。
[root@xiaojin oldboy]# who
root pts/1 2019-01-08 20:27 (10.0.0.1)
[root@xiaojin oldboy]# who|cut -b 3-5,10
ot p
注意:cut命令如果使用了-b選項,那麼執行此命令時,cut會先把-b後面所有的定位進行從小到大排序,然後再提取。可不能顛倒定位的順序哦。如下:
[root@xiaojin oldboy]# who|cut -b 3-5,10
ot p
[root@xiaojin oldboy]# ^C
[root@xiaojin oldboy]# who|cut -b 10,3-5
ot p
還有哪些類似-3,3-這樣的寫法,如下
[root@xiaojin oldboy]# who|cut -b -3
roo
[root@xiaojin oldboy]# who|cut -b 3-
ot pts/1 2019-01-08 20:27 (10.0.0.1)
-3表示從第一個字節到第三個字節,而3-表示從第三個字節到行尾。
如果我執行who|cut -b -3,3-,會輸出整行,不會出現連續兩個重疊的c的。如下:
[root@xiaojin oldboy]# who|cut -b -3,3-
root pts/1 2019-01-08 20:27 (10.0.0.1)
2、以字符爲定位
提取第3,第4,第5和第8個字符:
[rocrocket@rocrocket programming]$ cat cut_ch.txt
星期一
星期二
星期三
星期四
[rocrocket@rocrocket programming]$ cut -b 3 cut_ch.txt
�
�
�
�
[rocrocket@rocrocket programming]$ cut -c 3 cut_ch.txt
一
二
三
四
看到了吧,用-c則會以字符爲單位,輸出正常;而-b只會傻傻的以字節(8位二進制位)來計算,輸出就是亂碼。
當遇到多字節字符時,可以使用-n選項,-n用於告訴cut不要將多字節字符拆開。如下:
[rocrocket@rocrocket programming]$ cat cut_ch.txt |cut -b 2
�
�
�
�
[rocrocket@rocrocket programming]$ cat cut_ch.txt |cut -nb 2
[rocrocket@rocrocket programming]$ cat cut_ch.txt |cut -nb 1,2,3
星
星
星
星
3、以字段爲定位
測試文件
cat >>test01.txt<<EOF
No Name Mark Percent
01 tom 69 91
02 jack 71 87
03 alex 68 98
EOF
-f 選項提取指定字段,一半配合-d使用
[root@xiaojin oldboy]# cut -d " " -f 2 test01.txt
Name
tom
jack
alex
[root@xiaojin oldboy]# cut -d " " -f 2,3 test01.txt
Name Mark
tom 69
jack 71
alex 68
與-b,-c的區別
[root@xiaojin oldboy]# cut -c 1 test01.txt
N
0
0
0
[root@xiaojin oldboy]# cut -b 2 test01.txt
o
1
2
3
--complement 選項提取指定字段之外的列(打印除了第二列之外的列):
[root@xiaojin oldboy]# cut -d " " -f 2 --complement test01.txt
No Mark Percent
01 69 91
02 71 87
03 68 98
[root@xiaojin oldboy]# cut -d " " -f 2 test01.txt
Name
tom
jack
alex
[root@xiaojin oldboy]# cat test01.txt
No Name Mark Percent
01 tom 69 91
02 jack 71 87
03 alex 68 98
4、-d 指定分隔符
[root@xiaojin oldboy]# cut -d " " -f 2 test01.txt
Name
tom
jack
alex
[root@xiaojin oldboy]# cat test01.txt
No Name Mark Percent
01 tom 69 91
02 jack 71 87
03 alex 68 98