bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html
1.1 選項說明
cut命令將行按指定的分隔符分割成多列,它的弱點在于不好處理多個分隔符重復的情況,因此經常結合tr的壓縮功能。
-b
:按字節篩選;-n
:與"-b"選項連用,表示禁止將字節分割開來操作;-c
:按字符篩選;-f
:按字段篩選;-d
:指定字段分隔符,不寫-d時的默認字段分隔符為"TAB";因此只能和"-f"選項一起使用。-s
:避免打印不包含分隔符的行;--complement
:補足被選擇的字節、字符或字段(反向選擇的意思或者說是補集);--output-delimiter
:指定輸出分割符;默認為輸入分隔符。
假設/tmp/abc.sh中下面所示的內容。注意:第2行到第5行每列不是都以單個空格分隔的,有的地方重復了幾個空格,有的地方只有一個空格,也就是說,文本內容不是很規則。并且最后一行完全沒有空格。
[root@xuexi tmp]# cat abc.sh
NO Name SubjectID Mark 備注
1 longshuai 001 56 不及格
2 gaoxiaofang 001 60 及格
3 zhangsan 001 50 不及格
4 lisi 001 80 及格
5 wangwu 001 90 及格
djakldj;lajd;sla
下面是cut的示例。
1.2 按字段篩選
在abc.sh中有5個字段。篩選出第二字段name列和第4字段mark列。使用空格作為分隔符。
[root@xuexi tmp]# cut -d" " -f2,4 abc.sh
Name00150djakldj;lajd;sla
可以看到,輸出的是亂七八糟的非預期結果。原因就是分隔符空格在分隔的地方重復了多次。所以想要正確顯示結果,需要把重復空格處理掉。
可以使用tr工具來壓縮連續字符。
[root@xuexi tmp]# cat abc.sh | tr -s " " | cut -d " " -f2,4
Name Mark
longshuai 56
gaoxiaofang 60
zhangsan 50
lisi 80
wangwu 90
djakldj;lajd;sla
但是輸出中的最后一行中完全沒有定界符的行也輸出了,這需要使用-s來取消這樣的輸出。
[root@xuexi tmp]# cat abc.sh | tr -s " " | cut -d" " -f2,4 -s
Name Mark
longshuai 56
gaoxiaofang 60
zhangsan 50
lisi 80
wangwu 90
1.3 使用--complement
輸出除了第2字段和第4字段其余的所有字段。
[root@xuexi tmp]# cat abc.sh | tr -s " " | cut -d" " -f2,4 -s --complement
NO SubjectID 備注
1 001 不及格
2 001 及格
3 001 不及格
4 001 及格
5 001 及格
1.4 按字節或字符分割
英文和阿拉伯數字是單字節字符,中文是雙字節字符,甚至是3字節字符。
使用-b來按字節篩選,使用-c按字符分割。
注意,按字節或字符分割時將不能指定-d,因為-d是劃分字段的。
[root@xuexi tmp]# cut -b1-3 abc.sh # 篩選第1-3個字節的內容
NO
1 l
2 g
3 z
4 l
5 w
dja
由于篩選中文,結果中出現亂碼。
[root@xuexi tmp]# cut -b20 abc.sh
所以"-b"選項需要結合"-n"選項,以禁止"-b"選項將多字節的字符強行分割導致亂碼。
[root@xuexi tmp]# cut -n -b20 abc.sh
a
不
0
及
也可以按字符分隔。
[root@xuexi tmp]# cut -c20 abc.sh
a
不
0
及
1.5 使用--output-delimiter
使用"--output-delimiter"指定輸出分隔符。
使用-b或者-c分隔了多段字符時,可以使用--output-delimiter,否則這些多段將拼接在一起。
[root@xuexi tmp]# cut -b3-5,6-8 abc.sh # 拼接在一起Name
longsh
gaoxia
zhangs
lisi 0
wangwu
akldj;[root@xuexi tmp]# cut -b3-5,6-8 abc.sh --output-delimiter "," # 逗號分隔多段Na,me
lon,gsh
gao,xia
zha,ngs
lis,i 0
wan,gwu
akl,dj;
1.6 cut中的范圍指定
可以使用"N-"、"N-M"和"-M"分別表示每行N字符(或字節或字段)后的所有內容、N-M段內容和M段之前的內容。注意包括N和M的邊界。
[root@xuexi tmp]# cut -d" " -f3- abc.sh -s # 輸出第三字段和后面所有的內容
SubjectID Mark 備注
001 56 不及格
001 60 及格
001 50 不及格
001 80 及格
001 90 及格
范圍交叉時,不會重復輸出。比如-f3-5,4-6,則輸出-f3-6。
[root@xuexi tmp]# cut -d" " -f3-5,4-6 abc.sh -s # 范圍交叉
SubjectID Mark 備注
001 56 不及格
001 60 及格
001 50 不及格
001 80 及格
001 90 及格
如果范圍順序無序,則Linux會先對范圍排序(升序)再輸出。例如-f4-6,2等價于-f2,4-6。
[root@xuexi tmp]# cut -d" " -f4-6,2 abc.sh -s
Name Mark 備注
longshuai 56 不及格
gaoxiaofang 60 及格
zhangsan 50 不及格
lisi 80 及格
wangwu 90 及格