Linux下cut命令的使用


Linux下有诸多进行文本处理的命令,这里介绍的是cut命令。

cut命令能够对文本文件中的行,进行按字节、字符和字段进行剪切,然后将指定的相应部分写到标准输出。如果没有给定文件名,cut命令将默认读取标准输入。

1、cut命令的语法总括

cut { -b list [-n] | -c list | -f list [-s] [-d character] } [file..]

从上面的格式上不难看出,cut命令的使用主要有三种方式,对应三种不同的参数形式,上面已经分别用不同的颜色进行了标注。其中红色的部分是对应按字节剪切,绿色的部分是对应按字符剪切,棕色的部分是对应按字段剪切。这三种方式中,都用到了list参数,下面简单介绍下list参数的几种形式:

1,3,5 取1、3、5部分(这里的部分的意思就是字节、字符或字段)2-4,7 取2到4部分和第7部分-5,9 取第1到5部分和第9部分,这里的-5就是1-5的简写。5- 取第5部分和其之后的所有部分

下面分别介绍按字节、字符和字段剪切。

2、按字节剪切

如上面语法中描述的那样,按字节剪切应该使用-b选项。这里要注意-n选项的使用:-n选项和-b选项一起使用,如果某个字符(这里指多字节字符)的最后一个字节落在list指定的范围内的话就将该字符打印,如果没有,就不打印该字符;如果没有-n选项,list指定的范围如果分隔了一个多字节字符,那么就会打印出乱码。下面是几个例子,这里用作例子的文件是一个随便生成的人名列表,名称是data.txt,内容如下:

$ cat data.txt 
aName:aGender:aProfession:aBirthday:aHeight:aEtc.
aName:aGender:aProfession:aBirthday:aHeight:aEtc.
Abbie Cornishi:female:actor:19820807:1.73m:Klondike
Hara Mikie:female:pictorial model:19870703:1.62m:Oscar Promotion Co., Ltd.
Drew Barrymore:female:actor:19750222:1.63m:Music and Lyrics
Kobe Bryant:male:NBA player:19780823:1.98m:Los Angeles Lakers
Timothy Theodore Duncan:male:NBA player:19760425:2.11m:San Antonio Spurs
Tony Parker:male:NBA player:19820517:1.88m:San Antonio Spurs
Manu Ginóbili:male:NBA player:19770728:1.98m:San Antonio Spurs
LaMarcus Nurae Aldridge:male:NBA player:19850719:2.11m:Portland Trail Blazers
aName:aGender:aProfession:aBirthday:aHeight:aEtc.
$ 
下面按字节剪切该文件:

$ cut -b 1-3,16- data.txt 
aNaProfession:aBirthday:aHeight:aEtc.
aNaProfession:aBirthday:aHeight:aEtc.
Abbfemale:actor:19820807:1.73m:Klondike
Harle:pictorial model:19870703:1.62m:Oscar Promotion Co., Ltd.
Drefemale:actor:19750222:1.63m:Music and Lyrics
Kobe:NBA player:19780823:1.98m:Los Angeles Lakers
Time Duncan:male:NBA player:19760425:2.11m:San Antonio Spurs
Tone:NBA player:19820517:1.88m:San Antonio Spurs
Manmale:NBA player:19770728:1.98m:San Antonio Spurs
LaMAldridge:male:NBA player:19850719:2.11m:Portland Trail Blazers
aNaProfession:aBirthday:aHeight:aEtc.
本来想演示下-n选项的用法,我的Ubuntu的机器上就是不打印乱码,可能和我终端的设置有关系。换了一台centos的机器,下面是例子:

$ cat chinese.txt 
科比布莱恩特
洛杉矶湖人
吉诺比利
圣安东尼奥马刺
$ cut -b 3 chinese.txt 
?
?
?
?
$ cut -b 3 -n chinese.txt 
科
洛
吉
圣
$
经过这个实验,你知道一个中文字符大约占几个字节了吧。

3、按字符剪切

按字符剪切比较简单,就是-c选项,下面是例子。

$ cut -b 1-4,5 data.txt 
aName
aName
Abbie
Hara 
Drew 
Kobe 
Timot
Tony 
Manu 
LaMar
aName
$ 
4、按字段剪切

按字段剪切的选项是-f(field)。在使用按字段剪切时,要注意下面的两个选项:

-d character 与-f选项一起使用,指定字符作为字段分隔符(默认的字段分隔符是制表符)。注意,要对有特殊shell含义的字符进行转义,比如如果指定空格为字段分隔符,就必须加引号(-d ‘ ’)。注意,character作为字段分隔符,只能是单个字符。-s 取消不包含字段分隔符的行。

下面是几个例子:

$ cut -f 1,3 -d ' ' data.txt     //指定空格为字段分隔符,打印第1,3字段
aName:aGender:aProfession:aBirthday:aHeight:aEtc.
aName:aGender:aProfession:aBirthday:aHeight:aEtc.
Abbie
Hara model:19870703:1.62m:Oscar
Drew and
Kobe player:19780823:1.98m:Los
Timothy Duncan:male:NBA
Tony player:19820517:1.88m:San
Manu player:19770728:1.98m:San
LaMarcus Aldridge:male:NBA
aName:aGender:aProfession:aBirthday:aHeight:aEtc.
$ cut -f 1,3 -d ' ' -s data.txt   //使用-s选项,忽略没有字段分隔符空格的行,可以看到结果中没有空格的行没有再被输出
Abbie
Hara model:19870703:1.62m:Oscar
Drew and
Kobe player:19780823:1.98m:Los
Timothy Duncan:male:NBA
Tony player:19820517:1.88m:San
Manu player:19770728:1.98m:San
LaMarcus Aldridge:male:NBA
$ cut -f 1,3 -d ':' data.txt    //指定‘:’为字段分隔符,打印第1、3字段
aName:aProfession
aName:aProfession
Abbie Cornishi:actor
Hara Mikie:pictorial model
Drew Barrymore:actor
Kobe Bryant:NBA player
Timothy Theodore Duncan:NBA player
Tony Parker:NBA player
Manu Ginóbili:NBA player
LaMarcus Nurae Aldridge:NBA player
aName:aProfession
$ 
到这里,cut命令的解释就到此结束了。有什么新的内容,回头遇到了再补充。^_^

相关内容