文本切分大法之cut命令精要

内容分享2周前发布
0 1 0

文本切分大法之cut命令精要

cut命令主要是用来分割文件中的字符串,并且根据要求进行显示的一个命令。一般是针对“行”来进行分割处理的,并不是整篇信息进行分割处理。

1语法格式

cut [-bn] [file] 或 cut [-c] [file] 或 cut [-df] [file]

说明:

cut 命令从文件的每一行剪切字节、字符和字段,并将这些字节、字符和字段写至标准输出。

如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。

参数:除非也指定了-n 标志。

-c:以字符为单位进行分割。

-d:自定义分隔符,默认为制表符Tab。

-f:与-d一起使用,指定显示哪个区域。

-n:撤销分割多字节字符。仅和-b 标志一起使用。如果字符的最后一个字节落在由-b 标志的 List 参数指示的<br />范围之内,该字符将被写出;否则,该字符将被排除。

2定位类型

cut命令根据不同的选项参数,剪切定位类型也不同,cut命令主要是接受三种定位类型:

第一,字节(bytes),用选项-b

第二,字符(characters),用选项-c

第三,域(fields),用选项-f。域又叫字段。

3“字节”定位法

3.1 单字节截取

使用cut命令进行字节剪切截取时,使用选项-b即可,语法如下:

cut -b num

其中num表明要截取第num个字符。

执行命令“df -h”能够查看Linux系统下磁盘空间占用情况,输出如下内容:

[root@localhost ~]# df -h

Filesystem Size Used Avail Use% Mounted on

/dev/sda2 18G 4.7G 12G 29% /

tmpfs 935M 80K 935M 1% /dev/shm

/dev/sda1 291M 39M 238M 14% /boot

如果我们想提取每一行的第4个字节,则cut命令为“cut –b 4”,完整命令如下:

[root@localhost ~]# df -h | cut -b 4

e

v

f

v

可以看出分别从第一行取出e,第二行取出v,第三行取出f,第四行取出v字节。

3.2 多段字节截取

在“字节”定位中,如果要提取第3,第4、第5和第8个字节,使用cut命令也能实现。字节截取选项-b支持形如3-5的写法,而且多个定位之间用逗号“,”隔开即可,上述四个字节截取参数为“3-5,8”。

执行命令“who”能够查看登录系统的终端情况,如下所示:

[root@localhost ~]# who

test tty1 2016-01-25 20:32 (:0)

test pts/0 2016-01-25 20:34 (:0.0)

如果对该执行结果,执行cut命令,截取第2,第3和第12个字节,其运行结果如下:

[root@localhost ~]# who | cut -b 2-3,12

esy

ess

其中“es”是第2第3个字节,“y”和“s”是第12个字节。

需要注意:cut命令如果使用了-b选项,那么执行此命令时,cut会先把-b后面所有的定位进行从小到大排序,然后再提取。

例如,如果-b选项后面的参数为“12,2-3”,其截取结果和参数“2-3,12”是一样的,如下所示:

[root@localhost ~]# who | cut -b 12,2-3

esy

ess

3.3 “-”使用小技巧

连字符“-”可以在数字左边,实则也可以在数字右边,形式为“3-”,下面介绍一下连字符“-”的使用。对“who”命令的结果进行截取,who命令输出如下所示:

[root@localhost ~]# who

test tty1 2016-01-25 20:32 (:0)

test pts/0 2016-01-25 20:34 (:0.0)

“-”位于左边

[root@localhost ~]# who | cut -b -3

tes

tes

第3个字节为“s”,则“-3”表明截取从开始字节到第3个字节,同参数“1-3”,如下所示:

[root@localhost ~]# who | cut -b 1-3

tes

tes

“-”位于右边

[root@localhost ~]# who | cut -b 3-

st tty1 2016-01-25 20:32 (:0)

st pts/0 2016-01-25 20:34 (:0.0)

第3个字节为“s”,则“3-”表明截取从第3个字节到每行最后一个字节。

从上面结果可以看出,无论“-”位于左边,还是位于右边,都截取到了第3个字节“s”。

“-”位于两边

例如参数为“-3,3-”,不会出现连续两个重叠的“s”,而是输出整行内容,测试结果如下:

[root@localhost ~]# who | cut -b -3,3-

test tty1 2016-01-25 20:32 (:0)

test pts/0 2016-01-25 20:34 (:0.0)

4“字符”定位法

使用cut命令进行字符剪切截取时,使用选项-c即可。字符定位选项参数同字节定位选项参数,可以为“3”,“3-5”,“3-5,8”,“-3”,“3-”等形式。

例如使用选项参数“2-3,12”对“who”命令进行字符截取,结果如下所示:

[root@localhost ~]# who | cut -b 2-3,12

esy

ess

可以发现截取结果跟使用选项参数“2-3,12”对“who”命令进行字节截取结果一样。看似一样,只是由于“who”命令输出的都是单字节字符,所以用-b和-c没有区别,如果提取中文,结果就有区别了。

此处使用当前新闻标题作为测试文件。文件内容如下所示:

[root@localhost test]# cat 2.txt

过去的一年 Google 干掉了 7.8 亿条广告,它们都是什么?

新鲜出炉:2016 铁路春运大数据图表

CNNIC报告解读:中国商业进入“云消费时代”

扩大电商投资 实现互惠共赢

此时分别使用选项“-b”和“-c”,测试结果如下所示:

[root@localhost test]# cat 2.txt | cut -b 2-3,12

���

���

NN

���

由于中文汉字是双字节表明,故按字节截取出现乱码。

[root@localhost test]# cat 2.txt | cut -c 2-3,12

去的e

鲜出路

NN国

大电共

对于中文字符和英文字符,使用字符截取结果正常。

用-c则会以字符为单位,输出正常;而-b只会以字节(8位二进制位)来计算,输出就是乱码。

多字节字符截取

当遇到多字节字符时,可以使用-n选项,-n用于告知cut不要将多字节字符拆开。例如使用“-b”截取第二个字节,结果如下:

[root@localhost test]# cat 2.txt | cut -b 2

N

此时是简单按照字节截取第二个字节,如果使用-n选项,结果如下:

[root@localhost test]# cat 2.txt | cut -nb 2

N

多截取几个字节,结果如下:

[root@localhost test]# cat 2.txt | cut -nb 1,2,3

CNN

可以看出多截取几个字节,能够组成多字节字符后,就按照正常字符显示。

5“域”定位法

cut命令选项-b和-c只能在固定格式的文档中提取信息,而对于非固定格式的信息则束手无策。这时候需要使用“域”定位方法。域又叫字段,使用固定字符分割。

使用cut命令进行“域”剪切截取时,使用选项-f即可。

对于“/etc/passwd”文件,它并不像who的输出信息那样具有固定格式,而是比较零散的排放。冒号在该文件的每一行中都起到域分割作用,用来隔开每一个项。

cut命令提供了按域进行提取的方法,设置“间隔符”,再设置“提取第几个域”即可。

5.1 自定义域分隔符

以“/etc/passwd”文件的前五行内容进行测试说明:

[root@localhost test]# head -5 /etc/passwd

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

使用参数-d分隔符“:”进行域截取,截取第一个域,结果如下:

[root@localhost test]# head -5 /etc/passwd | cut -d : -f 1

root

bin

daemon

adm

lp

从截取结果可以看出,第一个域分别为“root”,“bin”,“daemon”,“adm”和“lp”。用-d来设置间隔符为冒号,然后用-f来设置按域截取,截取的是第一个域,这样所有的用户名就都列出来了。

同前述内容,在设定-f时,也可以使用例如“2-3”,“2-3,12”,“-3”,“3-”和“-3,3-”等类似格式参数:

例如,截取第1个,第3-5个域,结果如下:

[root@localhost test]# head -5 /etc/passwd | cut -d : -f 1,3-5

root:0:0:root

bin:1:1:bin

daemon:2:2:daemon

adm:3:4:adm

lp:4:7:lp

截取第1个,第3-5个,第7个域,结果如下:

[root@localhost test]# head -5 /etc/passwd | cut -d : -f 1,3-5,7

root:0:0:root:/bin/bash

bin:1:1:bin:/sbin/nologin

daemon:2:2:daemon:/sbin/nologin

adm:3:4:adm:/sbin/nologin

lp:4:7:lp:/sbin/nologin

截取开始至第3个域,结果如下所示:

[root@localhost test]# head -5 /etc/passwd | cut -d : -f -3

root:x:0

bin:x:1

daemon:x:2

adm:x:3

lp:x:4

5.2 缺省域分隔符

cut命令的域分隔符,缺省是制表符Tab,如果域分隔符就是制表符,完全可以省略-d选项,而直接使用-f截取域就可以了。

例如文件3.txt,单词使用制表符Tab分割,内容如下所示:

[root@localhost test]# cat 3.txt

Hello world.

I am Linux Sheller.

如果截取第二个域,直接使用-f即可,如下所示:

[root@localhost test]# cat 3.txt | cut -f 2

world.

am

可以看出正确截取了第二个域(单词)world和am。

如果域分隔符是空格情况,可以使用参数“-d ‘ ‘”进行截取,其中单引号’’之间有一个空格字符。

例如文件4.txt,单词使用一个空格分割,内容如下所示:

[root@localhost test]# cat 4.txt

Hello World.

I am Linux Sheller.

如果截取第二个域,需要使用选项“-d ‘ ‘”,如下所示:

[root@localhost test]# cat 4.txt | cut -d ' ' -f 2

World.

am

可以看出正确截取了第二个域world和am,注意单引号之间有一个空格字符。

说明:对于空格进行分割的域,单引号之间必须有一个空格字符。而且只能在-d后面设置一个空格,不能设置多个空格,由于cut命令只允许间隔符是一个字符。

如果设置多个空格字符,则会报错,如下所示:

[root@localhost test]# cat 5.txt | cut -d ' ' -f 2

cut: the delimiter must be a single character

Try `cut –help' for more information.

5.3 空格和制表符的分辨

文件中如何分辨分隔符是空格,还是制表符?有时候制表符的确 很难辨认,有一个方法可以看出一段空白符到底是由若干个空格组成的还是由一个制表符组成的。

使用命令“sed –n l”能够查看分隔符是多个空格还是制表符,测试结果如下所示:

[root@localhost test]# cat 6.txt | sed -n l

Hello World.$

I am Linux Sheller.$

输出结果中,如果是制表符(TAB),那么会显示为 符号,如果是空格,就会原样显示。

通过此方法即可以判断制表符和空格了。注意上面sed -n后面的字符是L的小写字母l。

6总结

cut的不足之处:在处理多空格时,cut命令无法胜任。

如果文件里面的某些域是由若干个空格来间隔的,就无法使用cut命令处理,由于cut只擅长处理“以一个字符间隔”的文本内容。

© 版权声明

相关文章

1 条评论

您必须登录才能参与评论!
立即登录
  • 头像
    Braum先森 投稿者

    收藏了,感谢分享

    无记录