sort命令排列文本行,並把檔案列印輸出到螢幕上。
sort命令提供了一種以字母或者數字順序快速組織資料的方法。預設下,sort命令使用white space來分割檔案中的不同域。
排序檔案、對已排序的檔案進行合并,並檢查檔案以確定它們是否已排序。
sort 命令對 File 參數指定的檔案中的行排序,並將結果寫到標準輸出。如果 File 參數指定多個檔案,那麼 sort 命令將這些檔案串連起來,併當作一個檔案進行排序。-(減號)代替檔案名稱指定標準輸入。如果您不指定任何檔案名稱,那麼該命令對標準輸入排序。可以使用 -o 標誌指定輸出檔案。
如果不指定任何標誌,sort 命令基於當前語言環境的整理順序對輸入檔案的所有行排序。
使用排序關鍵字時,sort 命令首先根據第一個排序關鍵字的內容對所有行排序。然後,根據第二個排序關鍵字的內容,對所有第一個排序關鍵字相同的行排序,如此進行下去。按照排序關鍵字在命令列中出現的順序給它們編號。如果兩行對所有排序關鍵字的排序都相同,則對全部行依據當前語言環境的整理順序進行比較。
主要參數
-A 使用 ASCII 整理順序代替當前語言環境的整理順序在逐位元組的基礎上排序。
-b 忽略前置空格和定位字元,找出欄位的第一或最後列。
-c 檢查輸入是否已按照標誌中指定的定序進行排序。如果輸入檔案排序不正確,就返回一個非零值。
-d 使用字典順序排序。比較中僅考慮字母、數字和空格。
-f 比較前將所有小寫字母改成大寫字母。
-i 比較中忽略所有非顯示字元。
-k KeyDefinition 指定排序關鍵字。KeyDefinition 選項的格式為:
[ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ]
排序關鍵字包括所有以 FStart 變數指定的欄位和 CStart 變數指定的列開頭的字元及以 FEnd 變數指定的欄位和
CEnd 變數指定的列結束的字元。Modifier 變數的值可以是 b、d、f、i、n 或 r。修飾符與同一字母的標誌等價。
-m 只合并多個輸入檔案;假設輸入檔案已經排序。
-n 按算術值對數字欄位排序。數字欄位可包含前置空格、可選減號、十進位數字、千分位分隔字元和可選基數符。
對包含任何非數字字元的欄位進行數字排序會出現無法預知的結果。
-o OutFile 將輸出指向 OutFile 參數指定的檔案,而不是標準輸出。OutFile 參數值可以與 File 參數值相同。
-r 顛倒指定排序的順序。
-t Character 指定 Character 為單一的欄位分隔符號。
-u 禁止按照排序關鍵字和選項的所有等同排序(每一組行中一行除外)。
-T Directory 將建立的所有臨時檔案放入 Directory 參數指定的目錄中。
-y[Kilobytes] 用 Kilobytes 參數指定的主儲存的KB數啟動 sort 命令,並根據需要增加儲存量。
(如果 Kilobytes 參數指定的值小於最小儲存網站或大於最大儲存網站,就以這個最小儲存網站或最大儲存網站取代)。
如果省略 -y 標誌,sort 命令以預設的儲存大小啟動。
-y0 標誌用最小儲存啟動,而 -y 標誌(不帶 Kilobytes 值)用最大儲存啟動。sort 命令使用的儲存量顯著地影響效能。
以大儲存量對小檔案排序將很浪費。
-z RecordSize 如果正在排序的任一行大於預設的緩衝區大小,要防止出現異常終止。
指定 -c 或 -m 標誌時,省略排序階段,使用系統的預設緩衝大小。如果已排序行超出這一大小,排序異常終止。
-z 選項指定排序階段最長行的記錄,因而可在合并階段分配足夠的緩衝區。
RecordSize 必須指明等於或大於要合并的最長行的位元組值。
[舉例]
(網上說的,設在 LC_ALL、LC_COLLATE 或 LANG 環境變數設定為 En_US 的情況下排序,我看我的機器上面只有LANG=zh_CN.UTF-8,實踐之後發現,有的排序混亂了,設定為LANG=En_US就行了)
假設檔案forsort1如下:
$ cat forsort1
yams:104
turnips:8
potatoes:15
carrots:104
green beans:32
carrots:104
radishes:5
lettuce:15
*對檔案內容按行排序,結果輸出到標準輸出:
$sort forsort1
輸入之後,輸出如下:
carrots:104
carrots:104
green beans:32
lettuce:15
potatoes:15
radishes:5
turnips:8
yams:104
這裡,forsort的內容將會按行由小到大重新排列,如果有多個關鍵字(預設空白分割),開始幾個關鍵字相同的行,將繼續按照次關鍵字進行排序。
*逆序對檔案內容進行排序,結果輸出到標準輸出:
$sort -r forsort1
輸入之後,輸出如下:
yams:104
turnips:8
radishes:5
potatoes:15
lettuce:15
green beans:32
carrots:104
carrots:104
這裡,可以看出,結果和sort forsort1相反。
*對檔案內容排序,結果輸出到out.txt檔案中:
$sort forsort1 -o out.txt
這裡.使用-o選項指定輸出檔案,結果和sort forsort1唯一不同的是結果沒有輸出到標準輸出而是輸出到了out.txt檔案中。
*排序,相同的行只保留一行:
$sort -u forsort1
輸入之後,輸出如下:
carrots:104
green beans:32
lettuce:15
potatoes:15
radishes:5
turnips:8
yams:104
這裡,將兩個carrots行刪去了一個。
*指定分隔欄位的字元為':',然後按第2個關鍵字進行排序:
$sort -t: -k 2 forsort1
輸入之後,輸出如下:
carrots:104
carrots:104
yams:104
lettuce:15
potatoes:15
green beans:32
radishes:5
turnips:8
這裡,-t指定分割符號,-k指定位置(預設1),-t和-k後面的空格可有可無;如果位置是從第2個到第4個,那麼這樣:sort -k2,4 forsort1
*先根據第3欄位排序,相等再根據第4列排序/etc/passwd:
sort -t: -k3 -k4 -n /etc/passwd
這裡,因為需要比較多列,所以就再加上-k。
*對第2個欄位按照數位值進行排序:
$sort -t: -k2 -n forsort1
輸入之後,輸出如下:
radishes:5
turnips:8
lettuce:15
potatoes:15
green beans:32
carrots:104
carrots:104
yams:104
這裡,-n按照數字方式排序,不加-n參數時排序結果根據最左面的數字開始,等同於字母的比較方式。