介紹如何在 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