英文定义:linux
Print selected parts of lines from each FILE to standard output.less
2:cut 用法格式this
cut [-bn] [file] 或 cut [-c] [file] 或 cut [-df] [file]编码
3:主要参数
-b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
-c :以字符为单位进行分割。
-d :自定义分隔符,默认为制表符。
-f :与-d一块儿使用,指定显示哪一个区域。
-n :取消分割多字节字符。仅和 -b 标志一块儿使用。若是字符的最后一个字节落在由 -b 标志的 List 参数指示的<br />范围以内,该字符将被写出;不然,该字符将被排除。spa
4:cut查找和切分通常的标准,经常使用参数选项orm
第一,字节(bytes),用选项-bci
第二,字符(characters),用选项-c文档
第三,域(fields),用选项-finput
5:cut按字节查找举例(参数:-b)(以/passwd文件为实例说明)it
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
2、cut按字符查找举例(参数:-c)(以/passwd文件为实例说明)
参数:cut -c
说明:其实在英文字符截取中(按字符和字节查找区别不大,但正截取中文字符中两者就有区别了)两者用法和参数格式差很少,下面咱们来看看他们在截取中文字符的时候的区别
1)在截取英文字符状况下的比较
tail -n 3 /etc/passwd |cut -b -5
mailn
smmsp
----------------------------------------
tail -n 3 /etc/passwd |cut -c -5
mailn
smmsp
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选项,
3、按域来进去提取信息
域是怎么回事呢?
为何会有“域”的提取呢,由于刚才提到的-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个段
4、扩展
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
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.