• 跳至主要導覽
  • 跳至主要內容
  • 跳至主要資訊欄
Office 指南

Office 指南

辦公室工作實用教學

  • Excel
  • Word
  • PowerPoint
  • Windows
  • PowerShell
  • R

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

分類:Linux

讀者互動方式

發佈留言 取消回覆

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

主要資訊欄

搜尋

近期文章

  • C++ 語言使用 Crypto++ 實作 RSA 數位簽章教學與範例
  • C++ 語言使用 Crypto++ 實作 RSA-OAEP 搭配 SHA256 加密教學與範例
  • C++ 語言使用 Crypto++ 實作 AES 加密、解密、認證加密教學與範例
  • C++ 語言使用 Crypto++ 實作 MD5、SHA1、SHA2、BLAKE2 雜湊教學與範例
  • Ubuntu Linux 安裝、使用 Crypto++ 加密函式庫教學與範例
  • C 語言使用 OpenSSL 實作橢圓曲線 ECDH 金鑰交換教學與範例
  • Python 以 eciespy 實作 ECC 非對稱式加密方法教學與範例
  • C 語言使用 OpenSSL 實作 PBKDF2 教學與範例

推薦網站

  • Udemy 線上教學課程
  • Coursera 線上教學課程

關注本站

  • 電子郵件
  • Facebook

公益

  • 家扶基金會
  • 台灣世界展望會
  • Yahoo 奇摩公益
  • igiving 公益網
  • 兒福聯盟

Copyright © 2021 · Office Guide