shell cut列提取命令的用法(附带实例)
在脚本执行过程中,通常会在某个文件中查找一些关键字符串。对于查找字符串来说,使用 grep 命令或 egrep 命令可以查找包含关键字的行。但是,当我们需要查找某个文件的某列内容时,grep 命令就无能为力了。因此,对于列级查询,要学习使用 cut、awk 等列截取命令。
grep 命令用来在文件中提取符合条件的行,也就是分析一行的信息,如果行中包含需要的信息,就把该行提取出来。而如果要进行列提取,就要使用 cut 命令。不过要小心,虽然 cut 命令可用于提取符合条件的列,但是也要一行行地进行数据读取。也就是说,要先读取文本的第 1 行数据,在此行中判断是否有符合条件的列,再处理第 2 行数据。
我们也可以把 cut 命令称为列提取命令,具体格式如下:
cut 命令的默认分隔符是制表符,也就是 Tab 键,对空格符支持得不太好。我们先建立一个测试文件,然后看看 cut 命令的作用:
建立学员成绩表,注意,这张表中所有的分隔符都使用的是制表符(Tab 键),不能使用空格,否则会影响后续的实验。先看看 cut 命令该如何使用,命令如下:
如果想要截取多列呢?可以将列号直接用“,”隔开,命令如下:
使用 cut 命令可以按照字符进行截取。需要注意的是,“8-”代表截取所有行从第8个字符到行尾的所有字符,而“10-20”代表截取所有行第 10 个字符至第 20 个字符,而“-8”代表截取所有行从行首到第 8 个字符的所有字符,命令如下:
当然,使用 cut 命令也可以手工指定分隔符。例如,需要查看当前 Linux 服务器中的用户名和 UID,就可以这样操作:
cut 命令很方便,但缺点在于不能识别某些连续出现的分隔符,如 df 命令结果:
在 df 命令执行结果中,我们会看到 6 列内容,并且列与列之间使用空格隔开,但列与列之间的空格数量并不相同。此时,如果想用 cut 命令截取第 1 列和第 3 列,就会出现这样的情况:
当遇到连续空格分隔符时,cut 命令并不能按照我们的需求进行截取,在这种情况下我们就需要使用 awk来进行列截取了。相对来说,cut 命令格式简单,但无法胜任复杂格式的截取;awk 格式复杂,功能丰富,能够在复杂格式中进行准确地截取。
grep 命令用来在文件中提取符合条件的行,也就是分析一行的信息,如果行中包含需要的信息,就把该行提取出来。而如果要进行列提取,就要使用 cut 命令。不过要小心,虽然 cut 命令可用于提取符合条件的列,但是也要一行行地进行数据读取。也就是说,要先读取文本的第 1 行数据,在此行中判断是否有符合条件的列,再处理第 2 行数据。
我们也可以把 cut 命令称为列提取命令,具体格式如下:
[root@localhost ~]# cut [选项] 文件名选项:
- -f 列号: 截取指定列
- -d 分隔符: 按照指定分隔符分割列
-
-c 字符范围: 不依赖分隔符来区分列,而是通过字符范围(行首为 0)来进行列提取:
- “n-” 表示从第 n 个字符到行尾;
- “n-m” 表示从第 n 个字符到第 m 个字符;
- “-m” 表示从第 1 个字符到第 m 个字符。
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 格式复杂,功能丰富,能够在复杂格式中进行准确地截取。