cut—字符串、文本截取工具
基础用法:命令输出 | cut 选项 定位规则 或 cut 选项 定位规则 处理文本
一、按字符截取:选项-c
待处理文本file内容如下:
(1)cut -c index1,index2,index3..file
分别截取file中所有行的第index1、index2、index3...个字符(index最小值为1)
cut -c 1,5,9 file
(2)cut -c -index file
截取file中所有行从第一个字符到第index个字符之间的所有字符(index最小值为1,截取包含头尾字符)
cut -c -7 file
(3)cut -c index- file
截取file中所有行从第index个字符到最后一个字符之间的所有字符(index最小值为1,截取包含头尾字符)
cut -c 6- file
(4)cut -c index1-index2 file
截取file中所有行从第index1个字符到第index2个字符之间的所有字符(index1最小值为1,index2>=index1,截取包含头尾字符)
cut -c 1-4 file
二、按字节截取:选项-b
如果处理文本均为单字节字符,则-c选项和-b选项用法完全相同,如果包含多字节字符(例如中文),则需要结合-n选项来截取(注意中文一个字符占3个字节):
待处理文本file2内容如下:
cut -nb 1-3,7-9 file2
注意-b与-c选项会对其后的所有定位规则进行去重、取并集并从小到大排序操作,例如
cut -c -3,3,7-10,4等同于cut -c -4,7-10
三、按域截取:选项-d和-f
cut -d 分隔符 -f 要截取的域
例如以单个空格分割字符串:
echo "apple banana pear" | cut -d ' ' -f 2
输出:
banana
注意:
(1)cut分隔符除了一些特殊符号外,可以去除引号包裹或者加转义字符转义,但最好是加上方便辨别。特殊符号:空格符 、*(通配符)、\(反斜杠,转义字符)...
echo "apple,banana,pear" | cut -d , -f 2
echo "apple banana pear" | cut -d \ -f 2
echo "apple*banana*pear" | cut -d \* -f 2
echo "apple\banana\pear" | cut -d \\ -f 2
以上命令输出结果均为:
banana
(2)要截取的域也可以是多个,写法和-c/-b选项的定位规则一样(逗号+中划线),只不过截取出来的结果会包含分隔符
例如截取第一个域和第二个域:
echo "apple,banana,pear" | cut -d ',' -f 1,2
输出:
apple,banana
截取第二个域到最后一个域:
echo "apple,banana,pear" | cut -d ',' -f 2-
输出:
banana,pear
四、反向截取:选项--complement
例如按截取除第二个域以外的所有字符:
echo "apple,banana,pear" | cut --complement -d , -f 2
输出:
apple,pear
注意按域截取使用--complement进行反向截取时,每去掉一个域会同时去掉一个分割符。
五、与awk比较
与同样用来截取字符串、文本的awk命令比较,cut有以下缺点:
(1).当分隔符为一个或多个空格时,awk可以胜任,但是cut不行,它只能以一个空格分割。
cut分割包含多个空格的字符串,截取第二个域:
echo "apple banana pear" | cut -d ' ' -f 2
输出:
awk分割包含多个空格的字符串,截取第二列:
echo "apple banana pear" | awk '{print $2}'
输出:
banana
(2).同样是分隔符,awk可以同时使用多种分割符,而cut只能使用一个。
(3).awk处理文件或多行字符串时可以选择任意一行进行处理,而cut只能对所有行进行处理,所以cut一般也只用来处理一行字符串。