Shell cut命令:查詢符合條件的行

2020-07-16 10:04:34
grep 命令是在檔案中提取符合條件的行,也就是分析一行的資訊,如果行中包含需要的資訊,就把該行提取出來。而如果要進行列提取,就要利用 cut 命令了。

不過要小心,雖然 cut 命令用於提取符合條件的列,但是也要一行一行地進行資料提取。也就是說,先要讀取文字的第一行資料,在此行中判斷是否有符合條件的欄位,然後再處理第二行資料。我們也可以把 cut 成為欄位提取命令。命令格式如下:

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

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

cut 命令的預設分隔符是製表符,也就是 Tab 鍵,不想對空格符支援得不怎麼好。我們先建立一個測試檔案,然後看看 cut 命令的作用。

[[email protected] ~]# vi student.txt
ID Name gender Mark
1 Liming M 86
2 Sc M 90
3 Gao M 83

建立學員成績表,注意這張表中所有的分隔符都是製表符,不能是空格,否則後面的實驗會出現問題。

先看看 cut 命令該如何使用:

[[email protected] ~]# cut -f 2 student.txt
#提取第二列的內容
Name
Liming
Sc
Gao


如果想要提取多列呢?將列號直接用","隔開,命令如下:

[[email protected] ~]# cut -f 2,3 student.txt
#提取第二列和第三列的內容
Name gender
Liming M
Sc M
Gao M


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

[[email protected] ~]#cut-c 8- student.txt
#提取取每行從第8個字元到行尾,好像很亂啊,那是因為每行的字元個數不相等
gender Mark
g M 86
90
83


當然,cut 命令也可以手工指定分隔符。例如,我想看看當前 Linux 伺服器中有哪些使用者、這些使用者的 UID 是什麼,就可以這樣操作:

[[email protected] ~]# cut -d ":" -f 1,3 /etc/passwd
#以":"作為分隔符,提取/etc/passwd檔案的第一列和第三列
root:0
bin:1
daemon:2
adm:3
lp:4


cut 命令很方便,不過最主要的問題是對空格識別得不好,很多命令的輸出格式中都不是製表符,而是空格符,比如:

[[email protected] ~]# df
#統計分割區使用狀況
檔案系統 1K-塊 已用 可用 已用% 掛載點
/dev/sda3 19923216 1848936 17062212 10% /
tmpfs 312672 0 312672 0% /dev/shm
/dev/sda1 198337 26359 161738 15% /boot
/dev/srO 3626176 3626176 0 100% /mnt/cdrom


如果想用 cut 命令擷取第一列和第三列,就會出現這樣的情況:

[[email protected] ~]# df -h|cut -d""-f 1,3
檔案系統
/dev/sda3
tmpfs
/dev/sda1
/dev/sr0


第三列去哪裡了?其實因為 df 命令輸出的分隔符不是製表符,而是多個空格符,所以 cut 命令會忠實地將每個空格符當作一個分隔符,而這樣數,第三列剛好也是空格,所以輸出才會是上面這種情況。

總之,cut 命令不能很好地識別空格符。如果想要以空格符作為分隔符,建議使用 awk 命令。