Linux 命令之 cut

简介

cut 是一个选取命令,就是将一段数据经过分析,取出我们想要的。一般来说,选取信息通常是针对“行”来进行分析的,而不是对整篇信息进行分析的。

语法

1
2
3
4
5
6
7
8
9
cut [-bn] [file] 或 cut [-c] [file] 或 cut [-df] [file]

-b 以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
-n 取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的<br/>范围之内,该字符将被写出;否则,该字符将被排除。

-c 以字符为单位进行分割。

-d 自定义分隔符,默认为制表符。
-f 与-d一起使用,指定显示哪个区域。

说明:

  • cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。
  • 如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。

示例

-3 表示从第一个字节到第三个字节,而 3- 表示从第三个字节到行尾。如果执行 who|cut -b -3,3- 是输出整行,不会出现连续两个重叠的c的。

1
2
3
4
5
6
7
8
9
[root@centos7~]$ who|cut -b -3,3-
root :0 2009-01-08 11:07
root pts/0 2009-01-08 11:23 (:0.0)
root pts/1 2009-01-08 14:15 (:0.0)

[root@centos7~]$ who|cut -c 3-5,8
root
root
root

输出中文时,用 -c 则会以字符为单位,输出正常;而-b只会傻傻的以字节(8位二进制位)来计算,输出就是乱码。当遇到多字节字符时,可以使用-n选项,-n用于告诉cut不要将多字节字符拆开。例如: cat cut_ch.txt |cut -nb 1,2,3

如果遇到空格和制表符时,怎么分辨呢?有时候制表符确实很难辨认,有一个方法可以看出一段空格到底是由若干个空格组成的还是由一个制表符组成的。

1
2
3
4
5
6
[fenglepeng@centos]# cat tab_space.txt
this is tab finish.
this is several space finish.
[fenglepeng@centos]# sed -n l tab_space.txt
this is tab\tfinish.$
this is several space finish.$

看到了吧,如果是制表符(TAB),那么会显示为\t符号,如果是空格,就会原样显示。通过此方法即可以判断制表符和空格了。

注意,上面sed -n后面的字符是L的小写字母哦,不要看错。

cut的-d选项的默认间隔符就是制表符,所以当你就是要使用制表符的时候,完全就可以省略-d选项,而直接用-f来取域就可以了。如果你设定一个空格为间隔符,那么就这样:

1
2
[fenglepeng@centos]# cat tab_space.txt |cut -d ' ' -f 1
this

注意,两个单引号之间可确实要有一个空格,而且,你只能在-d后面设置一个空格,可不许设置多个空格,因为cut只允许间隔符是一个字符。如果文件里面的某些域是由若干个空格来间隔的,那么用cut就有点麻烦了,因为cut只擅长处理“以一个字符间隔”的文本内容。

解决办法:使用cut之前加 sed 's/[ ][ ]*/ /g'

如果空格与tab共存时用 sed -e 's/[[:space:]][[:space:]]*/ /g' filename


Linux 命令之 cut
https://flepeng.github.io/002-Linux-21-命令-Linux-命令之-cut/
作者
Lepeng
发布于
2021年7月5日
许可协议