Linux sort命令中文手冊(info sort翻譯)
說明:
(1).本手冊只挑選了有用的資訊進行翻譯,如要檢視完完整整的內容,請自行info sort。
(2).譯文中,在括號中使用了"註"的,為本人所加,非原文內容,助於理解和說明。
(3).本文的sort命令為CentOS 7.2上的,版本為sort (GNU coreutils) 8.22,有些選項在CentOS 6上可能不支援,如"--debug"。
(4).在沒搞懂sort處理欄位和排序機制時,強烈建議不要看man sort。
7.1 'sort': Sort text files
===========================
sort命令用於排序、合併或比較給定檔案(可給定多個)的所有行,如果沒有給定輸入檔案或輸入檔案為"-",則讀取標准輸入。預設情況下,sort將操作結果列印在標準輸出中。
語法:
sort [OPTION]... [FILE]...
sort有3種操作模式:排序(預設)、合併以及檢查是否已經排過序。使用以下3個選項改變操作模式:
'-c'
'--check'
'--check=diagnose-first'
檢查給定檔案是否已經排序過:如果檢測出未排序,將輸出診斷資訊並以狀態碼1退出,該診斷資訊中包含第一個亂序的行。否則以成功狀態退出。最多只能給定一個檢測檔案。
'-C'
'--check=quiet'
'--check=silent'
它類似於"-c",但不會輸出診斷資訊。如果檔案已排序,則以成功狀態退出,否則以狀態碼1退出。最多只能給定一個檔案。
'-m'
'--merge'
合併多個檔案,每個輸入檔案必須已經排序。合併時將根據已排序的結果合併為各個組。sort一般都用來排序,但仍然提供合併功能,因為它的合併速度很快。
sort排序規則為:按照命令列中給定的欄位順序對給定的欄位進行排序,排序時根據為每個欄位分配的排序選項進行排序,直到發現不同的排序選項或者排序列結束。如果沒有給定排序key(註:key即為-k指定的值),則對整行進行排序。最後,如果所有給定的key的比較結果都相等時,將對整行進行完全預設的排序(註:即以字母升序排序),但"-r"可以改變這次的升、降序結果。這次排序稱為"最後的排序"。使用"-s"選項可以禁止"最後的排序",使得那些排序結果相同的行保留最初的相對順序。"-u"選項同樣也會禁止"最後的排序"。
除非明確指定,否則所有的比較都按照"LC_COLLATE"指定的字元集的排序規則進行排序。
退出狀態碼:
0 沒有任何錯誤發生時
1 如果"-c"或"-C"檢測發現輸入資料未排序時
2 發生了錯誤時
如果設定了環境變數"TMPDIR",sort將使用它作為臨時目錄而不是預設的"/tmp"。"-T"選項將覆蓋該環境變數設定的值。
以下選項影響排序的輸出結果。它們既可以指定為全域性選項,也可以作為key的一部分。如果未指定任何key,則全域性選項將作用於整行,否則指定的key將繼承全域性選項,除非key自身也指定了選項(注:自身指定了選項的key將覆蓋全域性選項)。
為了考慮可移植性,建議將全域性選項指定在"-k"(或"--key")的前面。
'-b'
'--ignore-leading-blanks'
忽略key的前導空白符號(包括空格、製表符)。不給定該選項時,空白符號對"-k"選項指定字元位置有影響(註:例如"-k 2.2"指定的第2個字元可能是空白)。
'-f'
'--ignore-case'
將小寫字元當作大寫字元。例如,"b"和"B"是相等的。當和"-u"選項一起使用時(注:重複的行只能輸出一次),那些小寫字元的等價行會被丟棄(註:也就是說,輸出的是大寫字元行)。(目前沒有任何方法可以拋棄大寫字元的等價行,即使使用"-r"也不行,因為在任何時,"-r"選項都只是反轉最終的排序結果,不會影響排序過程)。
'-h'
'--human-numeric-sort'
'--sort=human-numeric'
對檔案大小格式進行排序。首先對正負性排序(正數>0>負數),再對大小字尾排序(0<k=K<M<G<T...),最後對數值排序。它不在乎轉換精度是1000還是1024,因為它總會自動不斷擴大到最接近的字尾(注:例如999M和1G比較時將以1000作為轉換單位,1023M和1G比較時將以1024作為轉換單位)。
'-M'
'--month-sort'
'--sort=month'
按字元格式的月份進行排序。
An initial string, consisting of any amount of blanks, followed by a month name abbreviation, is folded to UPPER case and compared in the order 'JAN' < 'FEB' < ... < 'DEC'. Invalid names compare low to valid names.
'-n'
'--numeric-sort'
'--sort=numeric'
按數值排序。空字串""或" "被當作無。數值排序是精確排序,不會四捨五入後排序。
(註:數值排序和預設的排序規則所不同的是,當key中遇到非數學字元時,如空白、字母、特殊字元等,將直接結束排序(在sort內部認為找不到匹配值)。也就是說,"-k 2"和"-k 2n"不同,雖然這兩個key都會擴充套件到行尾,前者會從第二個欄位一直按字元集順序比較到行尾,而後者可能只對第2欄位匹配,因為第二欄位和第三欄位中間可能有特殊符號,導致數值排序直接結束。
因此,對於"abc 100 200"這樣的輸入,假設欄位分隔符為空格,當指定"-k 2n"時,該key為"100 200",但由於中間包含了空白,使得該key的排序在第二欄位就結束。如果是"abc 100 200 200","-k 2n"在排序時,雖然看上去是100200,但卻只對100進行排序,也就是說,如果此時另有一行第2欄位值為110,看上去很大的100200將小於110。測試語句:
echo -e "b 100:200 200na 110 300" | tr ':' '