Categories: Linux

Linux 以 cut 指令擷取資料固定位置欄位教學與範例

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

Share
Published by
Office Guide

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

1 年 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

1 年 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

1 年 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

1 年 ago