cut 命令
cut是一个选取命令,就是将一段数据经过分析,取出我们想要的。
cut命令是一个将文本按列进行切分的小工具,它可以指定分隔每列的定界符。
cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。
如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。
如果一行数据包含多个字段,现在想要提取其中的一列或多列,这时候cut命令就可以大显身手了,有的类似于SQL语句中的select,哈哈!
命令格式:
cut [选项] [文件名]
常用选项:
**-b(bytes):** 以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志
**-c(characters):** 以字符为单位进行分割
**-d(delimiters):** 自定义分隔符,默认为制表符
**-f(fields):** 与-d一起使用,指定显示哪些字段(区域)
**-n:** 取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的<br />范围之内,该字符将被写出;否则,该字符将被排除
cut一般以什么为依据呢? 也就是说,我怎么告诉cut我想定位到的剪切内容呢?
以字节定位:
cut命令如果使用了-b选项,那么执行此命令时,cut会先把-b后面所有的定位进行从小到大排序,然后再提取。可不能颠倒定位的顺序哦~
cat stu.txt | cut -b 3-5,8 提取第3,第4、第5和第8个字节,怎么办?
cat stu.txt | cut -b 8,3-5 提取第3,第4、第5和第8个字节,结果还是一样
cat stu.txt | cut -b -3 提取第一个字节到第三个字节
cat stu.txt | cut -b 3- 提取从第三个字节到结尾
想必你也看到了,-3表示从第一个字节到第三个字节,而3-表示从第三个字节到行尾。如果你细心,你可以看到这两种情况下,都包括了第三个字节“c”
如果我执行who|cut -b -3,3-,你觉得会如何呢?答案是输出整行,不会出现连续两个重叠的c的
cat stu.txt | cut -b -3,3-
以字符定位:
-b和-c的区别:如果你提取中文,区别就看出来了
域是怎么回事呢?解释解释:)
为什么会有“域”的提取呢,因为刚才提到的-b和-c只能在固定格式的文档中提取信息,而对于非固定格式的信息则束手无策。这时候“域”就派上用场了。如果你观察过/etc/passwd文件,你会发现,它并不像who的输出信息那样具有固定格式,而是比较零散的排放。但是,冒号在这个文件的每一行中都起到了非常重要的作用,冒号用来隔开每一个项。
我们很幸运,cut命令提供了这样的提取方式,具体的说就是设置“间隔符”,再设置“提取第几个域”,就OK了!
以/etc/passwd的前五行内容为例,提取文件中的相应字段
cut有哪些缺陷和不足
如果文件里面的某些域是由若干个空格来间隔的,那么用cut就有点麻烦了,因为cut只擅长处理“以一个字符间隔”的文本内容
常用范例
补充知识~~给任意一字符串 str,取出其最后一个字符,可以使用如下命令:
trailing newline
很多软件或命令都会自动加上一个trailing newline,也就是c语言里的\n,ascii码为10
举例说明:
echo abcde > test1
echo -n abcde > test2
vim test3,并写入abcde
vim test4,并写入abcde,回车
然后查看这些文件的大小:
文件大小为5,表示只有abcde这5个字符。
文件大小为6的,表示文件内容为abcde\n。
文件大小为7的,表示文件内容为abcde\n\n。
在vim和gedit创建文件时,自动加上了一个trailing newline,并且它始终是不可见的
除了vim和gedit,与
echo在默认情况下是会自动加上\n的,这也是为什么每次使用这个命令的时候最后都会有换行(终端里的\n都是可见的)。如果加上选项-n,则不会自动加上这个\n。
wc -l是一个统计
因此:
echo abcde | wc -l 结果为1
echo -n abcde | wc -l 结果为0