linux之cut的使用
cut是一个选取命令,就是将一段数据经过分析,取出我们想要的。一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的
-
其语法格式为:
cut [-bn] [file] 或 cut [-c][file] 或 cut [-df] [file]
使用说明:
cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。如果不指定file参数,cut命令将读取标准输入,必须指定-b,-c或-f标志之一。
主要参数:
-b:以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了-n标志。
-c:以字符为单位进行分割
-d:自定义分割符,默认为制表符。
-f:与-d一起使用,指定显示哪个区域
-n:取消分割多字节字符。仅和-b标志一起使用。如果字符的最后一个字节落在由-b标志的List参数指示的<br/>范围内,改字符将被写出;否则改字符将排除。
- cut 一般以什么为依据呢?也就是说,我怎么告诉cut我想定位到剪切内容呢?
cut 命令主要是接收三个定位方法:
第一, 字节(bytes),用选项-b
第二, 字符(characters),用选项-c
第三, 域(fields),用选项-f
-
以 “字节” 定位
1) 执行 who 输出(内容如下)
2) 提取每行第4个字符who | cut -b 4
3) 提取每行1-4个字符,和第10个字符可以这样写(-b 支持1-4的写法)who | cut -b 1-4,10
但有一点要注意,cut命令如果使用了-b选项,那么执行此命令时,cut会先把-b后面所有的定位进行从小到大排序,然后再提取。可不能颠倒定位的顺序哦。这个例子就可以说明这个问题:
who | cut -b 10,1-4
#已经自动做了排序
4) 省略截取范围的小技巧
提取每行1-4个字符,可以写出 -4 默认是重1开始
who | cut -b -4
提取每行从第5个字符后面的所有字符,可以写成 5-
who | cut -b 5-
如果是写出 -1,1- 这样的形式代表的是以整行, 数字可以是任意。
who | cut -b -1,1-
-
以字符为定位标志的例子
这个尝试一下用字节来截取看看cut -b 3 cut_ch.txt
#这里没有输出,及时输出了也是乱码;原因是一个中文占4个字节,使用1-4可以输出第一个文字cut -b 1-4 cut_ch.txt
使用字符来截取第3个文字
cut -c 3 cut_ch.txt
#使用字符的方式,就可以成功截取了
字符可以正常处理字节也可以处理字符
可以使用 -nb 来处理字符,-n 用于告诉cut不要将多字节字符拆开;个人认为其实 -nb 就等于
-c 因为字符可以处理字节也可以处理字符
cut -nb 1-4 cut_ch.txt
- 域(下面来解释一下域)
为什么会有“域”的提取呢,因为刚才提到的-b和-c只能在固定格式的文档中提取信息,而对于非固定格式的信息则束手无策。这时候“域”就派上用场了。如果你观察过/etc/passwd文件,你会发现,它并不像who的输出信息那样具有固定格式,而是比较零散的排放。但是,冒号在这个文件的每一行中都起到了非常重要的作用,冒号用来隔开每一个项。
我们很幸运,cut命令提供了这样的提取方式,具体的说就是设置“间隔符”,再设置“提取第几个域”,就OK了!
以/etc/passwd的前五行内容为例:
cat /etc/passwd | head -5 | cut -d : -f 1
#这个解释一下参数;-d 是用来设置间隔符,-f 是设置我要取的域。
在设定-f时,也可以使用例如3-5或者4- 类似的格式:
cat /etc/passwd|head -n 5|cut -d : -f 1,3-5
cat /etc/passwd|head -n 5|cut -d : -f 1,3-5,7
cat /etc/passwd|head -n 5|cut -d : -f -2
- 如果遇到制表符和空格,如何分辨。
有时候制表符确实很难分辨,有一个办法可以看出一段空格到底是由若干个空格组的还是由一个制表符组成的。
sed -n l tab_space.txt
#如果是制表符(tab),那么会显示为\\t 符号,如果是空格,就会原样显示,通过此方法即可以判断制表符和空格了。
如果你设定一个空格位间隔符,那么可以这样写:
cat tab_space.txt |cut -d ' ' -f 1
#第一行都是tab
- cut 的缺陷和不足
在处理多空格时,如果文件里面的某些域是由若干个空格来间隔的,那么用cut就有点麻烦了,因为cut只擅长处理“以一个字符间隔”的文本内容