参考资料:博客园骏马金龙https://www.cnblogs.com/f-ck-need-u/p/7521357.html
cut命令将行按指定的分隔符分割成多列。它的弱点在于不好处理多个分隔符重复的情况,因此经常结合tr的压缩功能。
注意:cut分隔符必须是单个字符
cut命令的常用选项
-b:按字节筛选;
-n:与"-b"选项连用,表示禁止将字节分割开来操作;
-c:按字符筛选;
-f:按字段筛选;
-d:指定字段分隔符,不写-d时的默认字段分隔符为"TAB";因此只能和"-f"选项一起使用。
-s:避免打印不包含分隔符的行;
--complement:输出不符合要求的列(补集)
--output-delimiter:指定输出分割符;默认为输入分隔符。
cut命令的简单案例
fie.txt
NO Name Mark 备注
1 zhangsan 50 不及格
2 lisi 80 良好
3 wangwu 90 优秀
a,b,c,d
1、按字段筛选。输出第一列和第三列
[root@linux test]# cut -f1,3 -d ' ' file.txt NO 1 zhangsan 2 lisi 3 wangwu a,b,c,d [root@linux test]#
遇到的问题:cut把1个空格当做了1个字符,导致实际情况和预计情况不符。
解决方法:使用tr命令压缩连续字符
[root@linux test]# cat file.txt | tr -s ' ' | cut -d ' ' -f1,3 NO Mark 1 50 2 80 3 90 a,b,c,d
还有一个问题:a,b,c,d 不符合格式规范,怎么也输出了。
解决方法:使用-s选项。 -s:避免打印不包含分隔符的行。
[root@linux test]# cat file.txt | tr -s ' ' | cut -d ' ' -f1,3 -s NO Mark 1 50 2 80 3 90
2、输出 除 第一列和第三列 外的所有列。
[root@linux test]# cat file.txt | tr -s ' ' | cut -d ' ' -f1,3 -s --complement Name 备注 zhangsan 不及格 lisi 良好 wangwu 优秀
3、按字节或字符筛选。使用-b来按字节筛选,使用-c按字符筛选。
英文和阿拉伯数字是单字节字符,中文是双字节字符,甚至是3字节字符(根据编码而定)。
注意,按字节或字符分割时将不能指定-d,因为-d是划分字段的。
[root@linux test]# cut -b1-20 file.txt NO Name Mark ▒ 1 zhangsan 50 ▒ 2 lisi 80 ▒ 3 wangwu 90 ▒ a,b,c,d
遇到的问题:中文乱码
解决方法:"-b"选项结合"-n"选项,以禁止"-b"选项将多字节的字符强行分割导致乱码。
[root@linux test]# cut -n -b1-20 file.txt NO Name Mark 备注 1 zhangsan 50 不及 2 lisi 80 良好 3 wangwu 90 优秀 a,b,c,d
另外一种解决方法:按字符分隔
[root@linux test]# cut -c1-20 file.txt NO Name Mark 备注 1 zhangsan 50 不及 2 lisi 80 良好 3 wangwu 90 优秀 a,b,c,d
使用"--output-delimiter"指定输出分隔符。
使用-b或者-c分隔了多段字符时,可以使用--output-delimiter,否则这些多段字符将拼接在一起。
[root@linux test]# cut -b1-7,8-18 file.txt NO Name Mark 1 zhangsan 50 2 lisi 80 3 wangwu 90 a,b,c,d [root@linux test]# cut -b1-7,8-18 file.txt --output-delimiter=',' NO Name, Mark 1 zhan,gsan 50 2 lisi, 80 3 wang,wu 90 a,b,c,d
在 -b -c -f 后可以使用"N-"、"N-M"和"-M"分别表示每行N字符(或字节或字段)后的所有内容、N-M段内容和M段之前的内容。注意包括N和M的边界。
[root@linux test]# cut -c3- file.txt Name Mark 备注 zhangsan 50 不及格 lisi 80 良好 wangwu 90 优秀 b,c,d [root@linux test]# cut -c3-9 file.txt Name zhangs lisi wangwu b,c,d [root@linux test]# cut -c-9 file.txt NO Name 1 zhangs 2 lisi 3 wangwu a,b,c,d
范围交叉时,不会重复输出。比如-f3-5,4-6,则输出-f3-6。
[root@linux test]# cut -d ' ' -f2-5,4-6 file.txt Name zhangsan 50 lisi wangwu a,b,c,d