首页 > 编程笔记 > Linux笔记 阅读:18

shell cut列提取命令的用法(附带实例)

在脚本执行过程中,通常会在某个文件中查找一些关键字符串。对于查找字符串来说,使用 grep 命令或 egrep 命令可以查找包含关键字的行。但是,当我们需要查找某个文件的某列内容时,grep 命令就无能为力了。因此,对于列级查询,要学习使用 cut、awk 等列截取命令。

grep 命令用来在文件中提取符合条件的行,也就是分析一行的信息,如果行中包含需要的信息,就把该行提取出来。而如果要进行列提取,就要使用 cut 命令。不过要小心,虽然 cut 命令可用于提取符合条件的列,但是也要一行行地进行数据读取。也就是说,要先读取文本的第 1 行数据,在此行中判断是否有符合条件的列,再处理第 2 行数据。

我们也可以把 cut 命令称为列提取命令,具体格式如下:
[root@localhost ~]# cut [选项] 文件名
选项:
cut 命令的默认分隔符是制表符,也就是 Tab 键,对空格符支持得不太好。我们先建立一个测试文件,然后看看 cut 命令的作用:
[root@localhost ~]# vim /root/student.txt
ID  Name  gender  Mark
1   Liming M      86
2   Sc     M      90
3   HuBo   M      83

建立学员成绩表,注意,这张表中所有的分隔符都使用的是制表符(Tab 键),不能使用空格,否则会影响后续的实验。先看看 cut 命令该如何使用,命令如下:
[root@localhost ~]# cut -f 2 /root/student.txt
#截取第2列的内容
Name
Liming
Sc
HuBo

如果想要截取多列呢?可以将列号直接用“,”隔开,命令如下:
[root@localhost ~]# cut -f 2,3 /root/student.txt
#截取第2列和第3列的内容
Name  gender
Liming M
Sc     M
HuBo   M

使用 cut 命令可以按照字符进行截取。需要注意的是,“8-”代表截取所有行从第8个字符到行尾的所有字符,而“10-20”代表截取所有行第 10 个字符至第 20 个字符,而“-8”代表截取所有行从行首到第 8 个字符的所有字符,命令如下:
[root@localhost ~]# cut -c 8- /root/student.txt
#截取每行从第8个字符到行尾的所有字符,但截取结果以列的角度来看并不标准,这是因为每行的字符个数不相等
gender Mark
M     86
M     90
M     83

当然,使用 cut 命令也可以手工指定分隔符。例如,需要查看当前 Linux 服务器中的用户名和 UID,就可以这样操作:
[root@localhost ~]# cut -d ":" -f 1,3 /etc/passwd
#以":"作为分隔符,截取/etc/passwd 文件的第 1 列和第 3 列
root:0
bin:1
daemon:2
adm:3
lp:4
...省略部分输出...

cut 命令很方便,但缺点在于不能识别某些连续出现的分隔符,如 df 命令结果:
[root@localhost ~]# df
#统计分区使用状况
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       19223 1848936 17062212 10% /
tmpfs           312672     0 312672 0% /dev/shm
/dev/sda1        198337  26359 161738 15% /boot
/dev/sr0        3626176 3626176     0 100% /mnt/cdrom

在 df 命令执行结果中,我们会看到 6 列内容,并且列与列之间使用空格隔开,但列与列之间的空格数量并不相同。此时,如果想用 cut 命令截取第 1 列和第 3 列,就会出现这样的情况:
[root@localhost ~]# df -h | cut -d " " -f 1,3
#使用 cut 命令指定分隔符为空格,截取第 1 列和第 3 列
Filesystem
/dev/sda3
devtmpfs
/dev/sda3
tmpfs
/dev/sda1
/dev/sr0
怎么只有第1列,第3列去哪里了呢?其实,因为 df 命令输出的分隔符不是制表符,而是多个空格符,所以 cut 命令会忠实地将每个空格符当作 1 个分隔符,而这样数,第 3 列刚好也是空格,输出就会是上面这种情况。

当遇到连续空格分隔符时,cut 命令并不能按照我们的需求进行截取,在这种情况下我们就需要使用 awk来进行列截取了。相对来说,cut 命令格式简单,但无法胜任复杂格式的截取;awk 格式复杂,功能丰富,能够在复杂格式中进行准确地截取。

相关文章