您的位置:首页 > 运维架构 > Linux

linux之cut命令的用法

2016-04-04 00:00 507 查看
摘要: linux之cut命令的用法,cut命令能够通过字符,字节和分隔域对内容进行筛选过滤内容

一、linux之cut命令的用法

英文定义:

Print selected parts of lines from each FILE to standard output.

1:cut应用范围

是一个选取命令,就是将一段数据经过分析,取出我们想要的。一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的

2:cut 用法格式

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

3:主要参数
-b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
-c :以字符为单位进行分割。
-d :自定义分隔符,默认为制表符。
-f :与-d一起使用,指定显示哪个区域。
-n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的<br />范围之内,该字符将被写出;否则,该字符将被排除。

4:cut查找和切分一般的标准,常用参数选项

第一,字节(bytes),用选项-b
第二,字符(characters),用选项-c
第三,域(fields),用选项-f

5:cut按字节查找举例(参数:-b)(以/passwd文件为实例说明)
tail -n 3 /etc/passwd

mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin

smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin

www:x:503:502::/home/www:/sbin/nologin

1) 截取每行的第一个字节,cut -b + 数字(后面的数字就是表示第几个字节)

tail -n 3 /etc/passwd |cut -b 1

m

s

w

2) 截取每行的多个字节(比如截取2-5个字节)

参数:cut -b 2-5

tail -n 3 /etc/passwd |cut -b 2-5

ailn

mmsp

ww:x

3) 截取每行的多个字节,可以通过逗号隔开,表示多种不同截取方式

举例:(比如截取2-5个字节和7-8个字节)

参数:cut -b 2-5,7-8

tail -n 3 /etc/passwd |cut -b 2-5,7-8

ailnll

mmspx:

ww:x50

4) 截取每行的多个字节(缩写技巧)

参数:cut -b -3 表示从第1个到3个

cut -b 3- 表示从第三个开始到结尾

截取每行的第1个到第三个字符

tail -n 3 /etc/passwd |cut -b -3

mai

smm

www

截取每行的第3个到尾部的全部字符

tail -n 3 /etc/passwd |cut -b 3-

ilnull:x:47:47::/var/spool/mqueue:/sbin/nologin

msp:x:51:51::/var/spool/mqueue:/sbin/nologin

w:x:503:502::/home/www:/sbin/nologin

二、cut按字符查找举例(参数:-c)(以/passwd文件为实例说明)

参数:cut -c

说明:其实在英文字符截取中(按字符和字节查找区别不大,但正截取中文字符中二者就有区别了)二者用法和参数格式差不多,下面我们来看看他们在截取中文字符的时候的区别

1)在截取英文字符情况下的比较

tail -n 3 /etc/passwd |cut -b -5

mailn

smmsp

www:x

----------------------------------------

tail -n 3 /etc/passwd |cut -c -5

mailn

smmsp

www:x

2中方式显示的内容一样,区别不大

2)截取中文字符比较

在中文截取中 cut -b会按字节截取,就是每次截取8bit长度的字符,而中文根据编码不一样,一般是三个字符或者2个字符表示一个

中文,所以在用 cut -b在截取的时候就会出现乱码,不能正确显示字符,解决办法添加另外一个参数:-n,就不会按单个字符截取了

结论:cut -bn 能够解决中文截取乱码问题,-n用于告诉cut不要将多字节字符拆开

举例:

cat cut_ch.txt
星期一
星期二
星期三
星期四
cut -b 3 cut_ch.txt
xxxx乱码

xxxx乱码

xxxx乱码�
[rocrocket@rocrocket programming]$ cut -c 3 cut_ch.txt




看到了吧,用-c则会以字符为单位,输出正常;而-b只会以字节(8位二进制位)来计算,输出就是乱码。
当遇到多字节字符时,可以使用-n选项,

三、按域来进去提取信息

域是怎么回事呢?
为什么会有“域”的提取呢,因为刚才提到的-b和-c只能在固定格式的文档中提取信息,而对于非固定格式的信息则束手无策。这时候“域”就派上用场 了。如果你观察过/etc/passwd文件,你会发现,比较零散的排放。但是,冒号在这个文件的每一行 中都起到了非常重要的作用,冒号用来隔开每一个项。
我们很幸运,cut命令提供了这样的提取方式,具体的说就是设置“间隔符”,再设置“提取第几个域”,就OK了!
举例说明
tail -n 3 /etc/passwd |cut -d : -f 1

mailnull

smmsp

www

原理:通过分割符":"把每一行切分成N段,然后通过-f参数获取想要获得的分割的段,-f后面的数字就是表示显示输出第几个段

tail -n 3 /etc/passwd |cut -d : -f 1,6

mailnull:/var/spool/mqueue

smmsp:/var/spool/mqueue

www:/home/www

获取第1个和第6个段

四、扩展
1)有时候制表符确实很难辨认,有一个方法可以看出一段空格到底是由若干个空格组成的还是由一个制表符组成的。
cat tab_space.txt
this is tab finish.
this is several space finish.
sed -n l tab_space.txt
this is tab\tfinish.$
this is several space finish.$
看到了吧,如果是制表符(TAB),那么会显示为\t符号,如果是空格,就会原样显示。
通过此方法即可以判断制表符和空格了。
注意,上面sed -n后面的字符是L的小写字母哦,不要看错。
2)我应该在cut -d中用什么符号来设定制表符或空格呢?
其实cut的-d选项的默认间隔符就是制表符,所以当你就是要使用制表符的时候,完全就可以省略-d选项,而直接用-f来取域就可以了。
如果你设定一个空格为间隔符,那么就这样:
cat tab_space.txt |cut -d ' ' -f 1
this
this
注意,两个单引号之间可确实要有一个空格哦,不能偷懒。
而且,你只能在-d后面设置一个空格,可不许设置多个空格,因为cut只允许间隔符是一个字符。
cat tab_space.txt |cut -d ' ' -f 1
cut: the delimiter must be a single character
Try `cut --help' for more information.
3)cut有哪些缺陷和不足?
猜出来了吧?对,就是在处理多空格时。
如果文件里面的某些域是由若干个空格来间隔的,那么用cut就有点麻烦了,因为cut只擅长处理“以一个字符间隔”的文本内容

备注:英文用法帮助参考

Usage: cut OPTION... [FILE]...

Print selected parts of lines from each FILE to standard output.

Mandatory arguments to long options are mandatory for short options too.

-b, --bytes=LIST select only these bytes

-c, --characters=LIST select only these characters

-d, --delimiter=DELIM use DELIM instead of TAB for field delimiter

-f, --fields=LIST select only these fields; also print any line

&
3ff0
nbsp; that contains no delimiter character, unless

the -s option is specified

-n with -b: don't split multibyte characters

--complement complement the set of selected bytes, characters

or fields

-s, --only-delimited do not print lines not containing delimiters

--output-delimiter=STRING use STRING as the output delimiter

the default is to use the input delimiter

--help display this help and exit

--version output version information and exit

Use one, and only one of -b, -c or -f. Each LIST is made up of one

range, or many ranges separated by commas. Selected input is written

in the same order that it is read, and is written exactly once.

Each range is one of:

N N'th byte, character or field, counted from 1

N- from N'th byte, character or field, to end of line

N-M from N'th to M'th (included) byte, character or field

-M from first to M'th (included) byte, character or field

With no FILE, or when FILE is -, read standard input.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: