博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
shell脚本--cut命令
阅读量:5317 次
发布时间:2019-06-14

本文共 2559 字,大约阅读时间需要 8 分钟。

bash&shell系列文章:


1.1 选项说明

cut命令将行按指定的分隔符分割成多列,它的弱点在于不好处理多个分隔符重复的情况,因此经常结合tr的压缩功能。

-b:按字节筛选;

-n:与"-b"选项连用,表示禁止将字节分割开来操作;
-c:按字符筛选;
-f:按字段筛选;
-d:指定字段分隔符,不写-d时的默认字段分隔符为"TAB";因此只能和"-f"选项一起使用。
-s:避免打印不包含分隔符的行;
--complement:补足被选择的字节、字符或字段(反向选择的意思或者说是补集);
--output-delimiter:指定输出分割符;默认为输入分隔符。

假设/tmp/abc.sh中下面所示的内容。注意:第2行到第5行每列不是都以单个空格分隔的,有的地方重复了几个空格,有的地方只有一个空格,也就是说,文本内容不是很规则。并且最后一行完全没有空格。

[root@xuexi tmp]# cat abc.sh NO Name SubjectID Mark 备注1  longshuai 001  56 不及格2  gaoxiaofang  001 60 及格3  zhangsan 001 50 不及格4  lisi    001   80 及格5  wangwu   001   90 及格djakldj;lajd;sla

下面是cut的示例。

1.2 按字段筛选

在abc.sh中有5个字段。筛选出第二字段name列和第4字段mark列。使用空格作为分隔符。

[root@xuexi tmp]# cut -d" " -f2,4 abc.shName 001 50djakldj;lajd;sla

可以看到,输出的是乱七八糟的非预期结果。原因就是分隔符空格在分隔的地方重复了多次。所以想要正确显示结果,需要把重复空格处理掉。

可以使用tr工具来压缩连续字符。

[root@xuexi tmp]# cat abc.sh | tr -s " " | cut -d " " -f2,4Name Marklongshuai 56gaoxiaofang 60zhangsan 50lisi 80wangwu 90djakldj;lajd;sla

但是输出中的最后一行中完全没有定界符的行也输出了,这需要使用-s来取消这样的输出。

[root@xuexi tmp]# cat abc.sh | tr -s " " | cut -d" " -f2,4 -sName Marklongshuai 56gaoxiaofang 60zhangsan 50lisi 80wangwu 90

1.3 使用--complement

输出除了第2字段和第4字段其余的所有字段。

[root@xuexi tmp]# cat abc.sh | tr -s " " | cut -d" " -f2,4 -s --complementNO SubjectID 备注1 001 不及格2 001 及格3 001 不及格4 001 及格5 001 及格

1.4 按字节或字符分割

英文和阿拉伯数字是单字节字符,中文是双字节字符,甚至是3字节字符。

使用-b来按字节筛选,使用-c按字符分割。

注意,按字节或字符分割时将不能指定-d,因为-d是划分字段的。

[root@xuexi tmp]# cut -b1-3 abc.sh   # 筛选第1-3个字节的内容NO 1 l2 g3 z4 l5 wdja

由于筛选中文,结果中出现乱码。

[root@xuexi tmp]# cut -b20 abc.sh

所以"-b"选项需要结合"-n"选项,以禁止"-b"选项将多字节的字符强行分割导致乱码。

[root@xuexi tmp]# cut -n -b20 abc.sha不0及

也可以按字符分隔。

[root@xuexi tmp]# cut -c20 abc.sh    a不0及

1.5 使用--output-delimiter

使用"--output-delimiter"指定输出分隔符。

使用-b或者-c分隔了多段字符时,可以使用--output-delimiter,否则这些多段将拼接在一起。

[root@xuexi tmp]# cut -b3-5,6-8 abc.sh  # 拼接在一起 Name longshgaoxiazhangslisi 0wangwuakldj;[root@xuexi tmp]# cut -b3-5,6-8 abc.sh --output-delimiter ","   # 逗号分隔多段 Na,me lon,gshgao,xiazha,ngslis,i 0wan,gwuakl,dj;

1.6 cut中的范围指定

可以使用"N-"、"N-M"和"-M"分别表示每行N字符(或字节或字段)后的所有内容、N-M段内容和M段之前的内容。注意包括N和M的边界。

[root@xuexi tmp]# cut -d" " -f3- abc.sh -s    # 输出第三字段和后面所有的内容SubjectID Mark 备注001 56 不及格001 60 及格001 50 不及格001 80 及格001 90 及格

范围交叉时,不会重复输出。比如-f3-5,4-6,则输出-f3-6。

[root@xuexi tmp]# cut -d" " -f3-5,4-6 abc.sh -s   # 范围交叉SubjectID Mark 备注001 56 不及格001 60 及格001 50 不及格001 80 及格001 90 及格

如果范围顺序无序,则Linux会先对范围排序(升序)再输出。例如-f4-6,2等价于-f2,4-6。

[root@xuexi tmp]# cut -d" " -f4-6,2 abc.sh -s           Name Mark 备注longshuai 56 不及格gaoxiaofang 60 及格zhangsan 50 不及格lisi 80 及格wangwu 90 及格

转载于:https://www.cnblogs.com/f-ck-need-u/p/7521357.html

你可能感兴趣的文章
如何使用USBWebserver在本机快速建立网站测试环境
查看>>
变量提升
查看>>
jquery-jqzoom 插件 用例
查看>>
查看oracle数据库的连接数以及用户
查看>>
三.野指针和free
查看>>
简单【用户输入验证】
查看>>
python tkinter GUI绘制,以及点击更新显示图片
查看>>
Spring面试题
查看>>
C语言栈的实现
查看>>
SRM 628 DIV2
查看>>
2018-2019-2 20165314『网络对抗技术』Exp5:MSF基础应用
查看>>
SecureCRT的使用方法和技巧(详细使用教程)
查看>>
自建数据源(RSO2)、及数据源增强
查看>>
关于View控件中的Context选择
查看>>
2018icpc徐州OnlineA Hard to prepare
查看>>
使用命令创建数据库和表
查看>>
linux下Rtree的安装
查看>>
PHP魔术方法之__call与__callStatic方法
查看>>
【模板】对拍程序
查看>>
【转】redo与undo
查看>>