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

 

 

参考推荐

Linux Shell 函数返回值

Linux 之 shell 比较运算符

SHELL学习笔记—-IF条件判断,判断条件

Linux grep awk 命令的正则匹配提取字符串

Linux grep 多个关键字

Linux grep 正则表达式

awk 简明教程

Linux awk 数组和循环

Linux awk 内置函数实例

Linux 抓取网页实例(shell+awk)

Linux shell 字符串操作详解

Linux shell 脚本常识和技巧

Shell 脚本的常用功能代码

Linux shell 局部变量与全局变量

Linux Shell 生成随机数和随机字符串