介绍如何在 Linux 系统下以 cut
指令以固定位置或指定字段的方式,抽取出文字数据中需要的信息。
截取固定位置
以下指令可以透过 ls
列出 /etc
目录下的所有文件信息,并且搭配 tail
指令筛出最后 6
行输出:
# 列出 /etc 部分文件信息 ls -l /etc | tail -n6
lrwxrwxrwx 1 root root 23 Jun 26 2019 vtrgb -> /etc/alternatives/vtrgb -rw-r--r-- 1 root root 4942 Apr 9 2019 wgetrc drwxr-xr-x 2 root root 4096 Nov 26 11:38 wpa_supplicant drwxr-xr-x 4 root root 4096 Nov 5 18:58 xdg drwxr-xr-x 2 root root 4096 Jul 10 2019 zsh -rw-r--r-- 1 root root 477 Mar 16 2018 zsh_command_not_found
ls -l
的每一行输出中,第 2 个字符到第 10 个字符代表文件的权限信息,如果我们想要将每一行的第 2 个字符到第 10 个字符截取出来,可以使用 cut
搭配 -c
参数指定截取的位置:
# 截取每一行的第 2 个字符到第 10 个字符 ls -l /etc | tail -n6 | cut -c 2-10
rwxrwxrwx rw-r--r-- rwxr-xr-x rwxr-xr-x rwxr-xr-x rw-r--r--
在指定截取字符位置的时候,也可以只指定起始或结束位置:
# 截取每一行的第 10 个字符以前的数据 ls -l /etc | tail -n6 | cut -c -10
lrwxrwxrwx -rw-r--r-- drwxr-xr-x drwxr-xr-x drwxr-xr-x -rw-r--r--
# 截取每一行的第 12 个字符以后的数据 ls -l /etc | tail -n6 | cut -c 12-
1 root root 23 Jun 26 2019 vtrgb -> /etc/alternatives/vtrgb 1 root root 4942 Apr 9 2019 wgetrc 2 root root 4096 Nov 26 11:38 wpa_supplicant 4 root root 4096 Nov 5 18:58 xdg 2 root root 4096 Jul 10 2019 zsh 1 root root 477 Mar 16 2018 zsh_command_not_found
若要截取多个字符范围,可以用到号分隔:
# 截取第 2-4 个字符与第 8-10 个字符 ls -l /etc | tail -n6 | cut -c 2-4,8-10
截取指定字段
以下指令可以将 /etc/passwd
文件的前三行输出:
# 输出 /etc/passwd 的前 3 行 head -n3 /etc/passwd
root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin
这里输出的每一行数据是以冒号分隔每个字段,如果我们想要将用户名称(第 1
个字段)与 shell 设置(第 7
个字段)截取出来,可以使用 cut
搭配 -f
参数指定截取的字段,并以 -d
参数指定分隔符号(默认是 Tab 字符):
# 截取第 1, 7 字段 head -n3 /etc/passwd | cut -d ':' -f 1,7
root:/bin/bash daemon:/usr/sbin/nologin bin:/usr/sbin/nologin
字段在指定时也可以指定连续的范围:
# 截取第 1 到 4 字段 head -n3 /etc/passwd | cut -d ':' -f 1-4
root:x:0:0 daemon:x:1:1 bin:x:2:2
# 截取第 3 栏以后的所有字段 head -n3 /etc/passwd | cut -d ':' -f 3-
0:0:root:/root:/bin/bash 1:1:daemon:/usr/sbin:/usr/sbin/nologin 2:2:bin:/bin:/usr/sbin/nologin
# 截取第 5 栏以前的所有字段 head -n3 /etc/passwd | cut -d ':' -f -5
root:x:0:0:root daemon:x:1:1:daemon bin:x:2:2:bin
输出分隔字符
cut
在输出多个字段时,默认会使用 -d
所指定分隔字符,如果想要以不同的分隔字符输出,可以使用 --output-delimiter
参数来指定:
# 指定输出字段分隔字符为 % head -n3 /etc/passwd | cut -d ':' -f 1,7 --output-delimiter='%'
root%/bin/bash daemon%/usr/sbin/nologin bin%/usr/sbin/nologin
排除指定位置、字段
如果想要排除指定的字符位置或字段,可以加上 --complement
参数:
# 排除指定字符 ls -l /etc | tail -n6 | cut -c 2-10 --complement
l 1 root root 23 Jun 26 2019 vtrgb -> /etc/alternatives/vtrgb - 1 root root 4942 Apr 9 2019 wgetrc d 2 root root 4096 Nov 26 11:38 wpa_supplicant d 4 root root 4096 Nov 5 18:58 xdg d 2 root root 4096 Jul 10 2019 zsh - 1 root root 477 Mar 16 2018 zsh_command_not_found
# 排除指定字段 head -n3 /etc/passwd | cut -d ':' -f 1,7 --complement
x:0:0:root:/root x:1:1:daemon:/usr/sbin x:2:2:bin:/bin
参考数据:GeeksforGeeks