《cut命令》-linux命令五分钟系列之十九
本原创文章属于《Linux大棚》博客,博客地址为http://roclinux.cn。文章作者为rocrocket。
为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅。
===
[正文开始]
1 一两句话描述一下cut命令吧!
正如其名,cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。
cut是以每一行为一个处理对象的,这种机制和sed是一样的。(关于sed的入门文章将在近期发布)
2 cut一般以什么为依据呢? 也就是说,我怎么告诉cut我想定位到的剪切内容呢?
cut命令主要是接受三个定位方法:
第一,字节(bytes),用选项-b
第二,字符(characters),用选项-c
第三,域(fields),用选项-f
3 以“字节”定位,给个最简单的例子?
举个例子吧,当你执行ps命令时,会输出类似如下的内容:
[rocrocket@rocrocket programming]$ who rocrocket :0 2009-01-08 11:07 rocrocket pts/0 2009-01-08 11:23 (:0.0) rocrocket pts/1 2009-01-08 14:15 (:0.0) |
如果我们想提取每一行的第3个字节,就这样:
[rocrocket@rocrocket programming]$ who|cut -b 3 c c c |
看明白了吧,-b后面可以设定要提取哪一个字节,其实-b和3之间没有空格也是可以的,但推荐有空格:)
4 如果“字节”定位中,我想提取第3,第4、第5和第8个字节,怎么办?
-b支持形如3-5的写法,而且多个定位之间用逗号隔开就成了。看看例子吧:
[rocrocket@rocrocket programming]$ who|cut -b 3-5,8 croe croe croe |
但有一点要注意,cut命令如果使用了-b选项,那么执行此命令时,cut会先把-b后面所有的定位进行从小到大排序,然后再提取。可不能颠倒定位的顺序哦。这个例子就可以说明这个问题:
[rocrocket@rocrocket programming]$ who|cut -b 8,3-5 croe croe croe |
5 还有哪些类似“3-5”这样的小技巧,列举一下吧!
[rocrocket@rocrocket programming]$ who rocrocket :0 2009-01-08 11:07 rocrocket pts/0 2009-01-08 11:23 (:0.0) rocrocket pts/1 2009-01-08 14:15 (:0.0) [rocrocket@rocrocket programming]$ who|cut -b -3 roc roc roc [rocrocket@rocrocket programming]$ who|cut -b 3- crocket :0 2009-01-08 11:07 crocket pts/0 2009-01-08 11:23 (:0.0) crocket pts/1 2009-01-08 14:15 (:0.0) |
想必你也看到了,-3表示从第一个字节到第三个字节,而3-表示从第三个字节到行尾。如果你细心,你可以看到这两种情况下,都包括了第三个字节“c”。
如果我执行who|cut -b -3,3-,你觉得会如何呢?答案是输出整行,不会出现连续两个重叠的c的。看:
[rocrocket@rocrocket programming]$ who|cut -b -3,3- rocrocket :0 2009-01-08 11:07 rocrocket pts/0 2009-01-08 11:23 (:0.0) rocrocket pts/1 2009-01-08 14:15 (:0.0) |
6 给个以字符为定位标志的最简单的例子吧!
下面例子你似曾相识,提取第3,第4,第5和第8个字符:
[rocrocket@rocrocket programming]$ who|cut -c 3-5,8 croe croe croe |
不过,看着怎么和-b没有什么区别啊?莫非-b和-c作用一样? 其实不然,看似相同,只是因为这个例子举的不好,who输出的都是单字节字符,所以用-b和-c没有区别,如果你提取中文,区别就看出来了,来,看看中文提取的情况:
[rocrocket@rocrocket programming]$ cat cut_ch.txt 星期一 星期二 星期三 星期四 [rocrocket@rocrocket programming]$ cut -b 3 cut_ch.txt � � � � [rocrocket@rocrocket programming]$ cut -c 3 cut_ch.txt 一 二 三 四 |
看到了吧,用-c则会以字符为单位,输出正常;而-b只会傻傻的以字节(8位二进制位)来计算,输出就是乱码。
既然提到了这个知识点,就再补充一句,如果你学有余力,就提高一下。
当遇到多字节字符时,可以使用-n选项,-n用于告诉cut不要将多字节字符拆开。例子如下:
[rocrocket@rocrocket programming]$ cat cut_ch.txt |cut -b 2 � � � � [rocrocket@rocrocket programming]$ cat cut_ch.txt |cut -nb 2 [rocrocket@rocrocket programming]$ cat cut_ch.txt |cut -nb 1,2,3 星 星 星 星 |
6 域是怎么回事呢?解释解释:)
为什么会有“域”的提取呢,因为刚才提到的-b和-c只能在固定格式的文档中提取信息,而对于非固定格式的信息则束手无策。这时候“域”就派上用场了。
(下面的讲解内容是在假设你对/etc/passwd文件的内容和组织形式比较了解的情况下进行的。)
如果你观察过/etc/passwd文件,你会发现,它并不像who的输出信息那样具有固定格式,而是比较零散的排放。但是,冒号在这个文件的每一行中都起到了非常重要的作用,冒号用来隔开每一个项。
我们很幸运,cut命令提供了这样的提取方式,具体的说就是设置“间隔符”,再设置“提取第几个域”,就OK了!
以/etc/passwd的前五行内容为例:
[rocrocket@rocrocket programming]$ cat /etc/passwd|head -n 5 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin [rocrocket@rocrocket programming]$ cat /etc/passwd|head -n 5|cut -d : -f 1 root bin daemon adm lp |
看到了吧,用-d来设置间隔符为冒号,然后用-f来设置我要取的是第一个域,再按回车,所有的用户名就都列出来了!呵呵 有成就感吧!
当然,在设定-f时,也可以使用例如3-5或者4-类似的格式:
[rocrocket@rocrocket programming]$ cat /etc/passwd|head -n 5|cut -d : -f 1,3-5 root:0:0:root bin:1:1:bin daemon:2:2:daemon adm:3:4:adm lp:4:7:lp [rocrocket@rocrocket programming]$ cat /etc/passwd|head -n 5|cut -d : -f 1,3-5,7 root:0:0:root:/bin/bash bin:1:1:bin:/sbin/nologin daemon:2:2:daemon:/sbin/nologin adm:3:4:adm:/sbin/nologin lp:4:7:lp:/sbin/nologin [rocrocket@rocrocket programming]$ cat /etc/passwd|head -n 5|cut -d : -f -2 root:x bin:x daemon:x adm:x lp:x |
7 如果遇到空格和制表符时,怎么分辨呢?我觉得有点乱,怎么办?
有时候制表符确实很难辨认,有一个方法可以看出一段空格到底是由若干个空格组成的还是由一个制表符组成的。
[rocrocket@rocrocket programming]$ cat tab_space.txt this is tab finish. this is several space finish. [rocrocket@rocrocket programming]$ sed -n l tab_space.txt this is tab\tfinish.$ this is several space finish.$ |
看到了吧,如果是制表符(TAB),那么会显示为\t符号,如果是空格,就会原样显示。
通过此方法即可以判断制表符和空格了。
注意,上面sed -n后面的字符是L的小写字母哦,不要看错。(字母l、数字1还有或运算|真是难分辨啊…,看来这三个比制表符还难分辨…)
8 我应该在cut -d中用什么符号来设定制表符或空格呢?
悄悄的告诉你,cut的-d选项的默认间隔符就是制表符,所以当你就是要使用制表符的时候,完全就可以省略-d选项,而直接用-f来取域就可以了!放心,相信我!
如果你设定一个空格为间隔符,那么就这样:
[rocrocket@rocrocket programming]$ cat tab_space.txt |cut -d ' ' -f 1 this this |
注意,两个单引号之间可确实要有一个空格哦,不能偷懒。
而且,你只能在-d后面设置一个空格,可不许设置多个空格,因为cut只允许间隔符是一个字符。
[rocrocket@rocrocket programming]$ cat tab_space.txt |cut -d ' ' -f 1 cut: the delimiter must be a single character Try `cut --help' for more information. |
9 我想将ps和cut命令配合使用时,怎么总是在最后两行出现重复现象?
这个问题的具体描述是如下这样的。
当cut和ps配合时:
[rocrocket@rocrocket programming]$ psPID TTY TIME CMD2977 pts/0 00:00:00 bash 5032 pts/0 00:00:00 ps [rocrocket@rocrocket programming]$ ps|cut -b3 P 9 0 0 |
看,最后的0重复了两次!!而且,我也试过ps ef或ps aux均有此问题。
而当ps和其他命令配合时,均无此问题,例如cut和who配合则正常:
[rocrocket@rocrocket programming]$ who rocrocket :0 2009-01-08 11:07 rocrocket pts/0 2009-01-08 11:23 (:0.0) rocrocket pts/1 2009-01-08 14:15 (:0.0) [rocrocket@rocrocket programming]$ who|cut -b3 c c c |
这个看似怪异的令我百思不得其解的问题,得到了sunway的解答,在此非常感谢他。我发问的原帖地址在[此处]。
其实这个问题是这样的,ps|cut会自身创建一个进程,所以当ps时也会提取出这个进程,然后通过管道输出到cut,所以cut截取后,就多出了一行,之所以会重复上一行内容,是由于我们恰巧取到了和上一行内容相同的字符而已。
你测试下执行ps和ps|cat就知道原因了!:)
10 cut有哪些缺陷和不足?
猜出来了吧?对,就是在处理多空格时。
如果文件里面的某些域是由若干个空格来间隔的,那么用cut就有点麻烦了,因为cut只擅长处理“以一个字符间隔”的文本内容。
转载于:https://www.cnblogs.com/qionghua520/p/4385839.html
《cut命令》-linux命令五分钟系列之十九相关推荐
- 《神探tcpdump第五招》-linux命令五分钟系列之三十九
== [系列文章] <神探tcpdump第一招>-linux命令五分钟系列之三十五 <神探tcpdump第二招>-linux命令五分钟系列之三十六 <神探tcpdump第 ...
- 《作业控制系列》-“linux命令五分钟系列”之十
很久没发这个系列了.一直在看perl.现在回归.因为发现所有的脚本的基础都是linux命令- === 通俗的讲,作业控制命令是用来控制一个一个任务的. 1 我想把updatedb命令(用于重新建立整盘 ...
- 《神探tcpdump第一招》-linux命令五分钟系列之三十五
应 @GamerH2o 博友在微博上提的要求,tcpdump专题会写成一个小型系列文章,力求每篇小文中突出重点,讲解清晰,避免长篇累牍,大家必然昏昏欲睡了. 其实tcpdump就好像一个神探,它有着夜 ...
- 《神探tcpdump第四招》-linux命令五分钟系列之三十八
== 本文会是"选项内容"的最后一期讲解,主要会讲讲-w和-r两个选项.tcpdump的选项很多,多达50个,其他我没有涉及的选项,还是要大家自己通过man tcpdump的方式来 ...
- 《mount的艺术》-linux命令五分钟系列之十四
在阅读本文之前,我假设你已经对Linux系统下的硬盘.光盘的设备命令规则有所了解,比如sda和sda1的关系,以及hda.sda.fd.cdrom等设备. === 1 我把U盘插到USB口上了,下一步 ...
- 《sed的流艺术之四》-linux命令五分钟系列之二十四
[正文开始] 上文接<sed的流艺术之三>-linux命令五分钟系列之二十三 例十 如果设定了很多-e的command,它们的执行顺序是怎样的呢? [rocrocket@rocrocket ...
- linux统计排序命令,Linux命令去重统计排序
利用Linux命令进行文本按行去重并按重复次数排序 linux命令行提供了非常强大的文本处理功能,组合利用linux命令能实现好多强大的功能.本文这里举例说明如何利用Linux命令行进行文本按行去重并 ...
- linux cheat,一个cheat命令 == Linux命令小抄大全
一个cheat命令 == Linux命令小抄大全 2014-12-06 cricode ...
- 《gcc五分钟系列》第六节:编译期符号检查
<gcc五分钟系列>第六节:编译期符号检查 上一节,我们说了从源文件到目标文件的编译过程.这一节,我想讨论一下编译期符号检查的问题. 请原谅我实在不知道如何翻译"refe ...
- vector 插入_Java学习五分钟系列:对比Vector、ArrayList、LinkedList
Java学习五分钟系列,目的是为让大家在短时间内搞清楚一项技术的概念.优缺点和适用场景,想要深入的了解,还需要投入更多的时间. Java的集合类,值得我们深入的学习,建议大家有时间的话,可以阅读一下源 ...
最新文章
- 设计模式之C#实现--FactoryMethod
- Bzoj1002 [FJOI2007]轮状病毒
- 指定的命名连接在配置中找不到、非计划用于 EntityClient 提供程序或者无效
- 「中间件系列一」kafka消息中间件
- c++虚继承和虚函数和抽象类、接口类,聚合类
- 我们究竟还要学习哪些Android知识?看这一篇就够了!
- 爬虫小记:利用cookies跳过登陆验证码
- 访问通信录 适配iOS7
- Windows 文件一直被占用,无法删除(对应解决方法)
- 计算机ip配置不正确怎么办,电脑ip地址不对该怎么办
- C# Thread多线程学习
- 洛谷P1990 覆盖墙壁(递推)
- hmcl启动器java下载_hmcl启动器下载
- c语言控制单片机38译码器,单片机+38译码器控制的数码管怎么点亮?
- graphpad如何换柱状图与折线图能否混合一起_Graphpad Prism 绘制柱状图与散点图共存图...
- 基于爬取百合网的数据,用matplotlib生成图表
- 2021年中国学前教育行业发展现状及未来发展趋势分析:毛入学率达88.1%[图]
- 怎么调整电脑的鼠标的灵活度
- poi 操作office word表格 - SpringBoot
- ~Unit crond.service not found~(ubunt )