Linux cut 命令
cut 是一个选取命令,就是将一段数据经过分析,取出我们想要的字段。
通常,用于获取特定列、截取子字符串、排序sort等
1)其语法格式为
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 />范围之内,该字符将被写出;否则,该字符将被排除。
2)cut一般以什么为依据
也就是说,我怎么告诉cut我想定位到的剪切内容呢?
cut命令主要是接受三个定位方法:
第一,字节(bytes),用选项-b
第二,字符(characters),用选项-c
第三,域(fields),用选项-f
3)以“字节”定位
举个例子吧,当你执行ps命令时,会输出类似如下的内容:
# who
root pts/1 2017-11-29 09:04 (1.203.155.98)
root pts/0 2017-11-29 09:04 (1.203.155.98)
如果我们想提取每一行的第4个字节,就这样:
# who | cut -b 4
t
t
4) 截取特定位置的字符
如果“字节”定位中,我想提取第2,3,4个,以及第8个字节,怎么办?
-b支持形如3-5的写法,而且多个定位之间用逗号隔开就成了。
# who | cut -b 2-4,28
oot1
oot1
但有一点要注意,cut命令如果使用了-b选项,那么执行此命令时,cut会先把-b后面所有的定位进行从小到大排序,然后再提取。
# who | cut -b 28,2-4
oot1
oot1
5) 小技巧,不直观,不推荐
# who
root pts/1 2017-11-29 09:04 (1.203.155.98)
root pts/0 2017-11-29 09:04 (1.203.155.98)
a)截取指定位置字符
# who | cut -b 3
o
o
b)截取开始到指定位置字符
# who | cut -b -3
roo
roo
c)截取指定位置到结尾字符
# who | cut -b 3-
ot pts/1 2017-11-29 09:04 (1.203.155.98)
ot pts/0 2017-11-29 09:04 (1.203.155.98)
解释说明
-3表示从第一个字节到第三个字节,
3-表示从第三个字节到行尾。
如果你细心,你可以看到这两种情况下,都包括了第三个字节“o”。
如果我执行who | cut -b -3,3-,你觉得会如何呢?答案是输出整行,不会出现连续两个重叠的c的。
# who | cut -b -3,3-
root pts/1 2017-11-29 09:04 (1.203.155.98)
root pts/0 2017-11-29 09:04 (1.203.155.98)
cut 命令分割实例
cut命令可以从一个文本文件或者文本流中提取文本列。
cut -d'分隔字符' -f fields <==用于有特定分隔字符 cut -c 字符区间 <==用于排列整齐的信息 选项与参数: -d :后面接分隔字符。与 -f 一起使用; -f :依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思; -c :以字符 (characters) 的单位取出固定字符区间;
注意:-d 后面连接的分隔字符,不是字符串,例如:可以接空格' ' 字符,但不能接 "love"字符串
PATH 变量如下
[root@www ~]# echo $PATH /bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games # 1 | 2 | 3 | 4 | 5 | 6 | 7
将 PATH 变量取出,我要找出第五个路径(起始数组下标为 1 开始)
#echo $PATH | cut -d ':' -f 5 /usr/local/bin
将 PATH 变量取出,我要找出第三和第五个路径(起始数组下标为 1 开始)
# echo $PATH | cut -d ':' -f 3,5 /sbin:/usr/local/bin
将 PATH 变量取出,我要找出第三到最后一个路径(起始数组下标为 1 开始)
echo $PATH | cut -d ':' -f 3- /sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games
将 PATH 变量取出,我要找出第一到第三个路径(起始数组下标为 1 开始)
# echo $PATH | cut -d ':' -f 1-3 /bin:/usr/bin:/sbin:
将 PATH 变量取出,我要找出第一到第三,还有第五个路径。
echo $PATH | cut -d ':' -f 1-3,5 /bin:/usr/bin:/sbin:/usr/local/bin
实用例子:只显示 /etc/passwd 的用户和 shell
# cat /etc/passwd | cut -d ':' -f 1,7 root:/bin/bash daemon:/bin/sh bin:/bin/sh
应用实例
计算linux服务器的负载情况,获取5分钟平均负载情况,大于5则杀死一些进程
awk 获取5分钟平均负载
# top -b | head -n1 | awk '{print $12}' | cut -d ',' -f1 1.32
解释命令:
a) top -b 获取文本格式,否则会报错 shell illegal character: ^[
b)awk '{print $12}' 获取第12个字段(下标为 1 起始),即5分钟平均负载值
c) cut -d ',' -f1 分割5分钟平均负载值(1.32,)注意:第12个字段有一个逗号
字符串分割
上面已经介绍了 cut 命令,其只支持 -d '字符',不支持 -d '字符串'
那么,若要进行字符串分割提取,该如何做呢?
答案:使用 awk 命令
示例演示:
1)显示出 PATH 变量内容
# echo $PATH /usr/local/nginx/sbin:/usr/local/php/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
2)cut -d ':' 分割字符
# echo $PATH | cut -d ':' -f 1,2,8 /usr/local/nginx/sbin:/usr/local/php/bin:/root/bin
3)awk -F 'local/' '{print $2}' 分割字符串
# echo $PATH | awk -F 'local/' '{print $2 "\t" $3 "\t" $4 "\t" $NF}' nginx/sbin:/usr/ php/bin:/usr/lib64/qt-3.3/bin:/usr/ sbin:/usr/ bin:/usr/sbin:/usr/bin:/root/bin
说明:awk -F 'local/' 先把字符串分割成数组,然后打印出数组的元素 $2/$3/$4/$NF(NF表示最后一个元素),awk print 起始下标是1
参考推荐:
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2020-07-04 23:32:32
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!
转载注明: Linux cut 命令 (米扑博客)