Linux管理員 - sort 命令



sort命令針對基於資料型別的排序進行了一些最佳化。此命令將所有檔案的排序連線寫入標準輸出。但是,需要注意的是,對幾個GB的大檔案的複雜排序操作可能會影響系統性能。

當執行具有有限CPU和/或記憶體可用性的生產伺服器時,建議在高峰業務時間將這些較大的檔案解除安裝到工作站進行排序操作。

開關 功能
-b 忽略開頭的空行
-d 字典順序,只考慮空格和字母數字字元
-f 忽略大小寫,摺疊大小寫字元
-g 常規數值排序
-M 月份排序
-h 人類可讀的數值排序 1KB,1MB,1GB
-R 隨機排序
-m 合併已排序的檔案

隨意複製下面的表格文字,並按照我們的sort示例進行操作。確保每列都用製表符分隔。

名字 姓氏 辦公室
Ted Daniel 101
Jenny Colon 608
Dana Maxwell 602
Marian Little 903
Bobbie Chapman 403
Nicolas Singleton 203
Dale Barton 901
Aaron Dennis 305
Santos Andrews 504
Jacqueline Neal 102
Billy Crawford 301
Rosa Summers 405
Kellie Curtis 903
Matt Davis 305
Gina Carr 902
Francisco Gilbert 101
Sidney Mack 901
Heidi Simmons 204
Cristina Torres 206
Sonya Weaver 403
Donald Evans 403
Gwendolyn Chambers 108
Antonia Lucas 901
Blanche Hayes 603
Carrie Todd 201
Terence Anderson 501
Joan Parsons 102
Rose Fisher 304
Malcolm Matthews 702

使用sort命令最基本的預設形式:

[root@centosLocal centos]# sort ./Documents/names.txt  
Aaron         Dennis         305 
Antonia       Lucas          901 
Billy         Crawford       301 
Blanche       Hayes          603 
Bobbie        Chapman        403 
Carrie        Todd           201 
Cristina      Torres         206 
Dale          Barton         901 
Dana          Maxwell        602 
Donald        Evans          403 
Francisco     Gilbert        101 
Gina          Carr           902 
Gwendolyn     Chambers       108 
Heidi         Simmons        204 
Jacqueline    Neal           102 
Jenny         Colon          608 
Joan          Parsons        102 
Kellie        Curtis         903 
Malcolm       Matthews       702 
Marian        Little         903 
Matt          Davis          305 
Nicolas      Singleton       203 
Rosa         Summers         405 
Rose         Fisher          304 
Santos       Andrews         504 
Sidney       Mack            901 
Sonya        Weaver          403 
Ted          Daniel          101 
Terence      Anderson        501

[root@centosLocal centos]#

有時,我們希望根據除第一列以外的其他列對檔案進行排序。可以使用-t-k開關將sort應用於其他列。

-t : define a file delimiter 
-k : key count to sort by (think of this as a column specified from the delimiter. 
-n : sort in numeric order

注意 - 在某些示例中,我們使用了cat管道到grep。這是為了演示管道命令的概念。對於大型檔案,將cat輸出到grep會使系統負載增加數百倍,同時還會增加複雜的排序。這會讓資深的Linux管理員感到痛苦。

現在我們瞭解了管道字元的工作原理,在接下來的章節中將避免這種不好的做法。保持系統資源低的關鍵在於學習如何高效地使用像sort這樣的命令。

[root@centosLocal centos]# sort -t '    ' -k 3n ./Documents/names.txt  
Ted           Daniel           101 
Francisco     Gilbert          101 
Jacqueline    Neal             102 
Joan          Parsons          102 
Gwendolyn     Chambers         108 
Carrie        Todd             201 
Nicolas       Singleton        203 
Heidi         Simmons          204 
Cristina      Torres           206 
Billy         Crawford         301 
Rose          Fisher           304 
Aaron         Dennis           305 
Matt          Davis            305 
Bobbie        Chapman          403 
Donald        Evans            403 
Sonya         Weaver           403 
Rosa          Summers          405 
Terence       Anderson         501 
Santos        Andrews          504 
Dana          Maxwell          602 
Blanche       Hayes            603 
Jenny         Colon            608 
Malcolm       Matthews         702
Antonia       Lucas            901 
Dale          Barton           901 
Sidney        Mack             901 
Gina          Carr             902 
Kellie        Curtis           903  
Marian        Little           903 

[root@centosLocal centos]#

現在我們的列表按辦公室編號排序。細心的讀者會在-t開關之後注意到一些不尋常的地方;單引號分隔了看起來像是幾個空格的東西。這實際上是傳送到shell的文字製表符。可以使用以下按鍵組合將文字製表符傳送到BASH shell:control+Shift+v

大多數shell會將Tab鍵解釋為命令。例如,BASH中的自動補全。shell需要一個轉義序列來識別文字製表符。這就是製表符不是Linux分隔符的最佳選擇的原因之一。一般來說,最好避免空格和製表符,因為它們在編寫shell指令碼時可能會導致問題。

讓我們修復我們的names.txt檔案。

[root@centosLocal centos]# sed -i 's/\t/:/g' ./Documents/names.txt && 
cat ./Documents/names.txt 
Ted:Daniel:101 
Jenny:Colon:608 
Dana:Maxwell:602 
Marian:Little:903 
Bobbie:Chapman:403 
Nicolas:Singleton:203 
Dale:Barton:901 
Aaron:Dennis:305 
Santos:Andrews:504 
Jacqueline:Neal:102 
Billy:Crawford:301 
Rosa:Summers:405 
Kellie:Curtis:903: 
Matt:Davis:305 
Gina:Carr:902 
Francisco:Gilbert:101 
Sidney:Mack:901 
Heidi:Simmons:204 
Cristina:Torres:206
Sonya:Weaver:403 
Donald:Evans:403 
Gwendolyn:Chambers:108 
Antonia:Lucas:901 
Blanche:Hayes:603 
Carrie:Todd:201 
Terence:Anderson:501 
Joan:Parsons:102 
Rose:Fisher:304 
Malcolm: Matthews:702 
[root@centosLocal centos]#

現在,處理文字檔案會容易得多。如果有人要求將其轉換回製表符分隔符以用於另一個應用程式(這很常見),我們可以輕鬆完成此任務,如下所示:

sed -i 's/:/\t/g' ./Documents/names.txt

常見的終端使用者應用程式可以很好地使用製表符作為分隔符(會計師不想看到冒號分隔資料列,同時使用電子表格)。因此,學習來回轉換字元是一種良好的實踐;這種情況經常出現。

注意 - 辦公室使用執行在Windows上的具有圖形使用者介面的文字處理器和電子表格。因此,Linux管理員通常擅長完成轉換操作,以適應最終辦公室使用者(大多數情況下,我們的老闆將是終端使用者)。

介紹了一個名為sed的命令。sed是一個流編輯器,可以用作非互動式文字編輯器來操作文字流和檔案。我們稍後將學習更多關於sed的內容。但是,現在請記住,使用sed,我們避免了在更改文字檔案時需要管道多個過濾器命令。從而最大限度地提高了所用工具的效率。

我們還介紹了一個Bash shell運算子:&&。只有當第一個命令以“0”的成功狀態完成時,&&才會執行第二個命令。

[root@centosLocal centos]# ls /noDir &&  echo "You cannot see me" 
ls: cannot access /noDir: No such file or directory 
[root@centosLocal centos]# ls /noDir ;  echo "You cannot see me" 
ls: cannot access /noDir: No such file or directory 
You cannot see me 
[root@centosLocal centos]# ls /noDir ;  echo "You cannot see me"

在上面的程式碼中,請注意&&和;之間的區別?第一個只有在第一個成功完成時才會執行第二個命令,而;只是將命令連結起來。當我們學習shell命令指令碼時,將對此進行更多介紹。

廣告