cut 命令从档案的每一行剪下位元组、字元和栏位并将这些位元组、字元和栏位写至标准输出. 如果不指定 FIle 引数,cut 命令将读取标准输入.
语法:
cut -b[n] 位元组范围
cut -c 字元范围
cut -d ‘分隔字元’ -f fields
引数:
-b : 以位元组 (bytes) 为单位进行分割, 这些位元组位置将忽略多位元组字元边界, 除非也指定了
-n 标志;
-c : 以字元 (characters) 为单位进行分割;
-d : 自定义分隔符, 预设为制表符, 与-f 一起使用;
-f : 依据-d 分隔字元将一段资讯切割成数段, 用-f(fields) 取出第几段的意思;
-n : 取消分割位元组字元. 仅和-b 标志一起使用. 如果字元的最后一个位元组落在-b 标志的 list
引数指示
范围之内, 该字元将被写入; 否则, 该字元将被排除.
实验环境:
为了使文件能识别中文, 这里我把语系改为了 LANG=zh_CN.gb2312. 编码 gb2312 下, 一个汉字占 2 个位元组.
<1>以” 位元组” 定位
常见位元组范围选项:
n 数字, 表示选取第 n 个位元组;
1-3,8 表示选取第 1 、 2 、 3 和 8 个位元组;
-3 表示选取第一个位元组到第三个位元组;
3- 表示选取第三个位元组到行尾;
例项 1:
[root@sqj2015 ~]# cat /etc/passwd |head -5 |cut -b 3-5,8
ot:0
n:x:
emox
m:x:
:x:7
<2>以” 字元” 定位
常见字元范围选项:
n 数字, 表示选取第 n 个字元;
1-3,8 表示选取第 1 、 2 、 3 和 8 个字元;
-3 表示选取第一个字元到第三个字元;
3- 表示选取第三个字元到行尾;
例项 2:
[root@sqj2015 ~]# cat /etc/passwd |head -5 |cut -b 3-5,8
ot:0
n:x:
emox
m:x:
:x:7
通过观察例项 1 与例项 2 看著-b -c 没有什么区别呢? 其实不然, 面对单位元组字元,-b 与-c 没有区别, 若要提取中文, 区别就很明显了.
[root@sqj2015 ~]# cat test.txt | cut -b 3
3
C
?
[root@sqj2015 ~]# cat test.txt | cut -c 3
3
C
三
看到了吧, 用-c 则会以字元为单位, 输出正常; 而-b 只会以位元组 (8 位二进位制位) 来计算, 输出就是乱码了. 但是遇到多位元组字元时, 我们亦可以使用-n 选项,-n 用于告诉 cut 不要将多位元组拆开., 如下:
[root@sqj2015 ~]# cat test.txt | cut -nb 3
3
C
[root@sqj2015 ~]# cat test.txt | cut -nb 3-5,8
3458
CDEH
二四
<3>以” 分隔符” 定位
[root@sqj2015 ~]# cat /etc/passwd |head -5 |cut -d “:” -f 3
0
1
2
3
4
[root@sqj2015 ~]# cat /etc/passwd |head -5 |cut -d “:” -f 3-5,8
0:0:root
1:1:bin
2:2:daemon
3:4:adm
4:7:lp
这里用-d 设定间隔符为冒号”:”, 然后用-f 来设定我要选取第几段来撷取你需要的资料.
[root@sqj2015 ~]# last | head -3
root pts/1 61.191.20.30 Thu Apr 14 01:27 still logged in
root pts/0 61.191.20.30 Thu Apr 14 00:23 still logged in
root pts/0 61.191.20.30 Wed Apr 13 23:05 – 00:23 (01:17)
[root@sqj2015 ~]# last | head -3 | cut -d ‘ ‘ -f 1
root
root
root
[root@sqj2015 ~]# last | head -3 | cut -d ‘ ‘ -f 1,3
root
root
root
cut -d ‘ ’ -f 3 ‘’ 之间有空格; 输出结果我们发现第一个空白分割的栏位代表账号, 所以使用以上命令; 但是 root pts/0 之间空格有好几个, 并非一个, 所以如果我想提取第 1 、 3 段的资料, 使用 last | head -3 | cut -d ‘ ‘ -f 1,3, 资料结果就不会是我想要的.