『忘了再學』Shell基礎 — 26、cut列提取命令

繁華似錦Fighting 發表於 2022-06-07

1、cut命令說明

cut命令的作用是對文字中的內容進行擷取。

一個檔案裡邊有很多資料,grep命令是用來提取文字內容包含匹配規則的行,而cut命令是用來擷取文字內容中的列資料。

[[email protected] ~]# cut [選項] 檔名

選項:
  -f 列號:提取第幾列。
  -d 分隔符:按照指定分隔符分割列,預設分隔符是製表符(tab鍵)。
  -c 字元範圍:不依賴分隔符來區分列,而是通過字元範圍(行首為0)來進行欄位提取。
        “n-”表示擷取所有行從第n個字元到行尾;
        “n-m”表示擷取所有行從第n個字元到第m個字元;
        “-m”表示擷取所有行從第1個字元到第m個字元。

2、cut命令練習

使用如下文字:

ID      Name    Gender  Mark
1       Tangs   M       88
2       Sunwk   M       99
3       Zhubj   M       77
4       Shahs   M       66

(1)cut命令基本用法

使用cut命令提取student.txt文字中的第二列資訊。

# 提取文字中第二列內容
[[email protected] tmp]# cut -f 2 student.txt
Name
Tangs
Sunwk
Zhubj
Shahs

如果只需要第二列資訊,且不需要標題,就需要結合前邊說的grep命令一起使用了。

[[email protected] tmp]# grep -v "Name" student.txt | cut -f 2
Tangs
Sunwk
Zhubj
Shahs

(2)cut命令選取多列

如果想要提取文字中多列資料,只要將列號直接用,(逗號)分開即可,命令如下:

[[email protected] tmp]# cut -f 2,4 student.txt
Name    Mark
Tangs   88
Sunwk   99
Zhubj   77
Shahs   66

(3)按字元來進行提取

cut命令可以按照字元進行提取,需要注意8-代表的是提取所有行的第十個字元開始到行尾,而
10-20代表提取所有行的第10個字元到第20個字元,而-8代表提取所有行從行首到第8個字元。

[[email protected] tmp]# cut -c -6 student.txt
ID  Nam
1   Tang
2   Sunw
3   Zh
4   Shah

注意:在實際工作中,這種方式很難提取出合理的資料資訊,除非格式非常的規律,因為每行的字元個數不相等,擷取出來的內容會不完整。

(4)按指定分隔符進行擷取資料

例如:以:作為分隔符,提取/etc/passwd檔案中,普通使用者的第一列和第三列資料資訊。

需要先過濾掉偽使用者和root使用者,在切割提取。

# 過濾偽使用者
# grep "/bin/bash" /etc/passwd

# 過濾root使用者
# grep -v "root" /etc/passwd

# 執行命令
[[email protected] tmp]# grep "/bin/bash" /etc/passwd | grep -v "root" | cut -d ":" -f 1,3
user1:500
user2:501

之後我們就可以把這些提取出來的資料,傳入變數中,然後該變數就可以在程式中進行操作了。

3、cut命令分隔符說明

cut命令預設分隔符是製表符(tab鍵),而不是使用空格來進行分隔,因為cut命令不識別空格作為分隔符。

如果有特定的符號,也是可以用-d選項進行指定做為分隔符。

而空格不推薦作為cut命令的分隔符。

如檢視磁碟情況的df命令:

[[email protected] localhost]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        19G  2.1G   16G  12% /
tmpfs           491M     0  491M   0% /dev/shm
/dev/sda1       240M   34M  194M  15% /boot

這個命令中間的分隔就是空格。

如我們通過cut命令獲取二列資訊,如下:

[[email protected] localhost]# df -h | cut -f 2
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        19G  2.1G   16G  12% /
tmpfs           491M     0  491M   0% /dev/shm
/dev/sda1       240M   34M  194M  15% /boot

我們看到cut命令預設是不識別空格作為分隔符的。

如果我們用-d選項指定空格作為分隔符,如下:

image

可以看到獲取的是一列空格,也非常的不好用。

所以不推薦空格作為cut命令的分隔符。

總結一下:

  • cut命令的預設分隔符是製表符,也就是tab鍵,對空格作為分隔符是支援的,但是不怎麼好用,不推薦使用。
  • 如果需要用空格來擷取文字資料,可以用後邊講的awk來進行擷取。