定义
cut是一个选取命令,选取文件中的指定字符,主要有如下用途
(1)文件内容查看
(2)显示行中的指定部分,删除文件中指定字段
(3)显示文件的指定内容。
语法格式
cut [-bn] [file] 或 cut [-c] [file] 或 cut [-df] [file]
使用说明
cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。
如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。
第一,字节(bytes),用选项-b
第二,字符(characters),用选项-c
第三,域(fields),用选项-f
主要参数
-b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
-c :以字符为单位进行分割。
-d :自定义分隔符,默认为制表符。
-f :与-d一起使用,指定显示哪个区域。
-n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的<br />范围之内,该字符将被写出;否则,该字符将被排除。
使用指南
按字节,字符,域 切割举例
(1) 以“字节”定位
简单取字节
[centos@s203 ~]$ ll total 524 drwxrwxr-x. 12 centos centos 150 Jan 26 17:17 anaconda3 drwxrwxr-x. 4 centos centos 37 Oct 11 2018 ha drwxrwxr-x. 4 centos centos 37 Jul 22 2018 hadoop drwxrwxr-x. 3 centos centos 18 Nov 2 2018 kafka drwxrwxr-x. 2 centos centos 19 Aug 23 2018 log drwxrwxr-x. 2 centos centos 21 Aug 24 2018 logs drwxrwxr-x. 3 centos centos 56 Apr 5 01:03 zookeeper -rw-rw-r--. 1 centos centos 534884 Apr 5 01:03 zookeeper.out
按字节切割:
[centos@s203 ~]$ ll |cut -b 3 t w w w w w w w w
“字节”定位中,取多字节字节(- 和,)
-b支持形如3-5的写法,而且多个定位之间用逗号隔开
[centos@s203 ~]$ cat test.sh No Name Mark Percent tom 69 91 jack 71 87 alex 68 98 [centos@s203 ~]$ cut -b 2-4,8 test.sh o N om 9 ack lex
但有一点要注意,cut命令如果使用了-b选项,那么执行此命令时,cut会先把-b后面所有的定位进行从索引小到大排序,然后再提取。所以颠倒顺序提取数据的方式不可行。
[centos@s203 ~]$ cut -b 8,2-4 test.sh o N om 9 ack lex
扩展 -num num-
[centos@s203 ~]$ cut -b -4 test.sh No N tom jack alex [centos@s203 ~]$ cut -b 4- test.sh Name Mark Percent 69 91 k 71 87 x 68 98
不会重叠
[centos@s203 ~]$ cat test.sh No Name Mark Percent tom 69 91 jack 71 87 alex 68 98 [centos@s203 ~]$ cut -b 4-,-4 test.sh No Name Mark Percent tom 69 91 jack 71 87 alex 68 98 [centos@s203 ~]$ cut -b 4-8,3-7 test.sh Name m 69 9 ck 71 ex 68
(2)以字符为定位
对单字节字符没有什么不同,对多字节字符的影响比较大。
[centos@s203 ~]$ cat test.sh
[centos@s203 ~]$ cut -b 4-,-4 test.sh
No Name Mark Percent
王 69 91
找 71 87
李 68 98
[centos@s203 ~]$ cut -b 1 test1.sh N ▒ ▒ ▒ [centos@s203 ~]$ cut -c 1 test1.sh N 王 找 李
可以使用-n选项,-n用于告诉cut -b 不要将多字节字符拆开
[centos@s203 ~]$ cut -nb 1 test1.sh N 王 找 李
(3)以域为定位
-b和-c只能在固定格式的文档中提取信息,而对于非固定格式的信息则束手无策
3.1cut的-d选项的默认间隔符就是制表符,所以当你就是要使用制表符的时候,完全就可以省略-d选项,而直接用-f来取域
[centos@s203 ~]$ cat -n test2.sh 1 王 69 91 2 找 71 87 3 李 68 98 [centos@s203 ~]$ cat -T test2.sh 王^I69^I91 找^I71^I87 李^I68^I98 [centos@s203 ~]$ cut -f 2 test2.sh 69 71 68
3.2 -d后面设置一个空格和字符,可不许设置多个空格或字符,因为cut只允许间隔符是一个字符
[centos@s203 ~]$ cat test.sh No Name Mark Percent tom 69 91 jack 71 87 alex 68 98 [centos@s203 ~]$ cut -d ' ' -f 2 test.sh Name 69 71 68 [centos@s203 ~]$ cut -d 'xx' -f 2 test.sh cut: the delimiter must be a single character
cut有哪些缺陷就是在处理多空格时。
3.3观察指定分隔符和多字段取数
[centos@s203 ~]$ cat test3.sh 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
[centos@s203 ~]$ cut -d ':' -f 3-5,7 test3.sh 0:0:root:/bin/bash 1:1:bin:/sbin/nologin 2:2:daemon:/sbin/nologin 3:4:adm:/sbin/nologin 4:7:lp:/sbin/nologin