选取命令cut

cut命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出.如果不指定FIle参数,cut命令将读取标准输入.

语法:

cut -b[n] 字节范围

cut -c 字符范围

cut -d ‘分隔字符’ -f fields

参数:

-b : 以字节(bytes)为单位进行分割,这些字节位置将忽略多字节字符边界,除非也指定了

-n标志;

-c : 以字符(characters)为单位进行分割;

-d : 自定义分隔符,默认为制表符,与-f一起使用;

-f : 依据-d 分隔字符将一段信息切割成数段,用-f(fields) 取出第几段的意思;

-n : 取消分割字节字符.仅和-b标志一起使用.如果字符的最后一个字节落在-b标志的list

参数指示<br />范围之内,该字符将被写入;否则,该字符将被排除.

 

实验环境:

为了使文档能识别中文,这里我把语系改为了LANG=zh_CN.gb2312. 编码gb2312下,一个汉字占2个字节.

<1>以”字节”定位

常见字节范围选项:

n          数字,表示选取第n个字节;

1-3,8  表示选取第1 、2、 3 和8个字节;

-3       表示选取第一个字节到第三个字节;

3-      表示选取第三个字节到行尾;

 

实例1:

[root@sqj2015 ~]# cat /etc/passwd |head -5 |cut -b 3-5,8

ot:0

n:x:

emox

m:x:

:x:7

 

<2>以”字符”定位

常见字符范围选项:

n         数字,表示选取第n个字符;

1-3,8  表示选取第1 、2、 3 和8个字符;

-3      表示选取第一个字符到第三个字符;

3-      表示选取第三个字符到行尾;

 

实例2:

[root@sqj2015 ~]# cat /etc/passwd |head -5 |cut -b 3-5,8

ot:0

n:x:

emox

m:x:

:x:7

通过观察实例1与实例2看着-b -c 没有什么区别呢?其实不然,面对单字节字符,-b与-c没有区别,若要提取中文,区别就很明显了.

[root@sqj2015 ~]# cat test.txt | cut -b 3

3

C

?

[root@sqj2015 ~]# cat test.txt | cut -c 3

3

C

看到了吧,用-c则会以字符为单位,输出正常;而-b只会以字节(8位二进制位)来计算,输出就是乱码了.但是遇到多字节字符时,我们亦可以使用-n选项,-n用于告诉cut不要将多字节拆开.,如下:

[root@sqj2015 ~]# cat test.txt | cut -nb 3

3

C

[root@sqj2015 ~]# cat test.txt | cut -nb 3-5,8

3458

CDEH

二四

 

<3>以”分隔符”定位

[root@sqj2015 ~]# cat /etc/passwd |head -5 |cut -d “:” -f 3

0

1

2

3

4

[root@sqj2015 ~]# cat /etc/passwd |head -5 |cut -d “:” -f 3-5,8

0:0:root

1:1:bin

2:2:daemon

3:4:adm

4:7:lp

这里用-d设置间隔符为冒号”:”,然后用-f来设置我要选取第几段来截取你需要的数据.

 

[root@sqj2015 ~]# last | head -3

root     pts/1        61.191.20.30     Thu Apr 14 01:27   still logged in

root     pts/0        61.191.20.30     Thu Apr 14 00:23   still logged in

root     pts/0        61.191.20.30     Wed Apr 13 23:05 – 00:23  (01:17)

 

[root@sqj2015 ~]# last | head -3 | cut -d ‘ ‘ -f 1

root

root

root

[root@sqj2015 ~]# last | head -3 | cut -d ‘ ‘ -f 1,3

root

root

root

cut -d ‘ ’ -f 3 ‘’ 之间有空格;输出结果我们发现第一个空白分割的字段代表账号,所以使用以上命令;但是root pts/0之间空格有好几个,并非一个,所以如果我想提取第1、3段的数据,使用last | head -3 | cut -d ‘ ‘ -f 1,3,数据结果就不会是我想要的.