文档章节

linux之cut命令的用法

木头大哥520
 木头大哥520
发布于 2016/04/04 10:47
字数 1954
阅读 80
收藏 5

一、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

                            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.



© 著作权归作者所有

木头大哥520
粉丝 0
博文 6
码字总数 7906
作品 0
巴南
架构师
私信 提问

暂无文章

关于AsyncTask的onPostExcute方法是否会在Activity重建过程中调用的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/XG1057415595/article/details/86774575 假设下面一种情况...

shzwork
今天
6
0
object 类中有哪些方法?

getClass(): 获取运行时类的对象 equals():判断其他对象是否与此对象相等 hashcode():返回该对象的哈希码值 toString():返回该对象的字符串表示 clone(): 创建并返此对象的一个副本 wait...

happywe
今天
6
0
Docker容器实战(七) - 容器中进程视野下的文件系统

前两文中,讲了Linux容器最基础的两种技术 Namespace 作用是“隔离”,它让应用进程只能看到该Namespace内的“世界” Cgroups 作用是“限制”,它给这个“世界”围上了一圈看不见的墙 这么一...

JavaEdge
今天
8
0
文件访问和共享的方法介绍

在上一篇文章中,你了解到文件有三个不同的权限集。拥有该文件的用户有一个集合,拥有该文件的组的成员有一个集合,然后最终一个集合适用于其他所有人。在长列表(ls -l)中这些权限使用符号...

老孟的Linux私房菜
今天
7
0
面试套路题目

作者:抱紧超越小姐姐 链接:https://www.nowcoder.com/discuss/309292?type=3 来源:牛客网 面试时候的潜台词 抱紧超越小姐姐 编辑于 2019-10-15 16:14:56APP内打开赞 3 | 收藏 4 | 回复24 ...

MtrS
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部