《LINUX教程:Linux sort命令中文手冊(info sort翻譯)》要點:
本文介紹了LINUX教程: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'
按數值排序.空字符串""或"\0"被看成無.數值排序是精確排序,不會四舍五入后排序.
(注:數值排序和默認的排序規則所不同的是,當key中遇到非數學字符時,如空白、字母、特殊字符等,將直接結束排序(在sort內部認為找不到匹配值).也就是說,"-k 2"和"-k 2n"不同,雖然這兩個key都會擴展到行尾,前者會從第二個字段一直按字符集順序比擬到行尾,而后者可能只對第2字段匹配,因為第二字段和第三字段中間可能有特殊符號,導致數值排序直接結束.
因此,對于"abc 100 200"這樣的輸入,假設字段分隔符為空格,當指定"-k 2n"時,該key為"100 200",但由于中間包括了空白,使得該key的排序在第二字段就結束.如果是"abc 100\0200 200","-k 2n"在排序時,雖然看上去是100200,但卻只對100進行排序,也就是說,如果此時另有一行第2字段值為110,看上去很大的100200將小于110.測試語句:
因此,對于"-n"來說,它絕對不可能跨越key的界限.但默認的排序規則會跨越key起作用.)
?
'-r'
'--reverse'
反轉比擬的結果,使得結果中更大的key更早出現.(注:"-r"不會改變排序行為,而是將排序結束后的輸出結果進行反轉處理,因此只影響排序結束后的輸出結果)
?
'-k POS1[,POS2]'
'--key=POS1[,POS2]'
指定排序的key,即每行排序的起始和終止字段(若省略POS2,則終止地位為行尾).
POS的格式為"F[.C][OPTS]",其中F表示字段的序號,C表示該字段中字符的序號.字段和字符的位置都從1開始計算.如果POS2的字符位置指定為0,則表示POS2字段中的最后一個字符.如果POS1中省略".C",則默認值為1(字段的起始字符),如果POS2中省略".C",默認值為0(字段的終止字符).OPTS為排序選項,這些選項將覆蓋全局選項,使得該key可以依照獨立的排序選項進行排序.keys可以跨多個字段.
(注:OPTS指定在POS1和POS2的作用是一樣的,因為一個"-k"指定一個key,無論是POS1還是POS2中的OPTS都是對這個key有效,但"b"選項除外,見下文)
示例:為了排序第二個字段,使用"--key=2,2"(-k 2,2).可使用"--debug"選項贊助查看、分析和決定每行中被用于排序的字段.
?
'--debug'
顯示每行中用于排序的部門.還會給出額外的信息.
?
'-o OUTPUT-FILE'
'--output=OUTPUT-FILE'
將排序的輸出結果寫入到OUTPUT-FILE中.一般來說,sort在打開OUTPUT-FILE前讀取完所有輸入,因此可以平安地將排序結果保存到輸入文件中,就像"sort -o file1 file1"和"cat file1 | sort -o file1"一樣.但是,"-m"選項會在讀取輸入前先打開輸出文件,因此下面的語句是不平安的語句:
"cat file1 | sort -m -o file1 -"
?
'-s'
'--stable'
禁止sort執行"最后的排序".在沒有指定字段選項或全局選項時,該選項將不起作用,除非指定的是"-r"選項.
(注:最后的排序:在key的比較結果相同時,sort的最后手段是對整行再進行一次完全默認的排序,即依照字母、升序對整行做最后排序.這稱為"最后的排序".如果未指定任何選項,其本身就是完全默認的,因此沒必要再做最后的排序.如果指定的是"-r"選項,由于"-r"是對最終結果進行反轉排序,因此會影響這次的"最后的排序"的結果)
?
'-t SEPARATOR'
'--field-separator=SEPARATOR'
當在每行中搜索key的時候,使用SEPARATOR字符作為字段的分隔符.默認情況下,字段是由空白字符和非空白字符之間的空字符串朋分而來的.
因此,如果輸入行為" foo bar",默認將切分為兩個字段" foo"和" bar",(注:空白和非空白字符之間的空字符為行開頭和"oo"后的位置).字段分隔符不是分隔后字段中的內容,因此"sort -t ' '"對" foo bar"分隔時,將分割為3個字段:空字段、"foo"和"bar".但是,每個單獨的字段都是擴展到行結尾的,就像"-k 2",或像"-k 2,3"包括了范圍的字段,它們都在擴展的時候保留字段分隔符.
(注:以sort -t ' '為例,"-k 2"實際上表示的是"foo bar",它擴展到行尾,且中間的字段分隔符被保留.而"-k 1,2"實際上表示的是" foo",因為明確指定了這個key到第二個字段結束,但中間的字段分隔符仍保留)
如果要指定字段分隔符為空,則使用"\0",例如"sort -t '\0'".
?
'--parallel=N'
設置sort運行的并行線程數為N.默認N設置為可獲得的cpu個數,但最大限制為8,因為跨越8之后帶來的性能收益遞減.
?
'-u'
'--unique'
一般情況下,"-u"將僅輸出排序后反復行的第一行.該選項會禁止"最后的排序"(注:見前文譯文).
?
"sort -u"和"sort | uniq"是等價的,但擴展了更多選項??將可能不等價,例如,"sort -n -u"只會檢查數值部門的唯一性,但"sort -n | uniq"在sort對行的數值排序后,uniq將檢查整個行的唯一性.
?
'-z'
'--zero-terminated'
使用"\0"朋分每行而不是使用換行符.
?
"-k"指定的key后面可以指定"bfhgnr"等選項,這種情況下,該key將不會繼承全局選項.除了"b"選項,所有的選項都作用于整個key,無論該選項是寫在POS1還是POS2上.如果指定了"b"選項,它僅獨立作用于POS1或POS2上,但如果繼承了全局的"-b",則會作用于整個key上.如果輸入行中包括了前導空白字符,且沒有使用"-t"選項,"-k"通常會結合"-b"或某些隱含了忽略前導空白字符的選項(ghn)一起使用,否則前導空白字符可能會導致劃分的字段非常混亂.
如果POS中指定的字段或字符位置超出了行尾或字段,則該key為空.如果指定了"-b"選項,".C"部門將從字段的第一個非空白字符開始計算.
以下是一些示例,用于說明分歧選項的結合使用:
sort -n -r
sort -k 3b
sort -t : -k 2,2n -k 5.3,5.4
(注:任何時候,只想對某字段進行排序時,都建議明確指定其起始和結束位置)
注意,如果寫的是"-k 2n"而不是"-k 2,2n",該key將從第二字段一直擴展到行尾,這是主排序key,而副排序key"-k 5.3,5.4"在主排序key的排序基礎上再依照字母排序.絕大多數情況下,讓key向后擴展一般不是所期望的行為.
還需注意,"n"選項作用范圍為第一個key.這等價于"-k 2n,2"或"-k 2n,2n".所有的修飾符,除了"-b",無論寫在pos1還是pos2,都邑作用于整個key.
(注:由于n選項無法跨越key,因此上面即使寫成了"-k 2n"也是等價的,但下面兩個命令則紛歧樣:
sort -t : -k 2 -k 5.3,5.4n sort -t : -k 2,2 -k 5.3,5.4n
由于默認的字符集排序規則會超過key,第一條命令中主key從第2字段開始,直到行尾結束,于是會先對整個key按字符排序,然后在此基礎上再對副key按數值排序.
再如下面的例子:即使主key的字段在副key的字段后面,副key由于是做字符集排序,所以仍會超過主key.)
sort -t : -k 5n -k 2
sort -t : -k 5b,5 -k 3,3n /etc/passwd sort -t : -n -k 5b,5 -k 3,3 /etc/passwd sort -t : -b -k 5,5 -k 3,3n /etc/passwd
以上三個命令是等價的.第一個命令指定了第一個key的POS1要忽略前導空白,且第二個key要依照數值排序.另外兩個命令中,缺少選項的key將繼承全局選項.此處繼承之所以能正確工作,是因為"-k 5b,5b"和"-k 5b,5"是等價的.
4.150.156.3 - - [01/Apr/2004:06:31:51 +0000] message 1
211.24.3.231 - - [24/Apr/2004:20:17:39 +0000] message 2
使用單個空格可以精確分割這些字段.IPV4地址列依照字典順序排序,例如212.61.52.2小于212.129.233.201,因為61小于129.
sort -s -t ' ' -k 4.9n -k 4.5M -k 4.2n -k 4.14,4.21 file*.log |\ sort -s -t '.' -k 1,1n -k 2,2n -k 3,3n -k 4,4n
該示例無法僅使用一個sort語句實現,因為IPV4地址需要使用"."分隔,而時間戳需要使用空格分隔.因此,使用兩個sort語句:第一個sort語句依照時間戳排序,第二個語句依照IPV4排序.第一個sort命令中使用"-k"將每個字段進行隔離,先依照年排序,再依照月份排序,接著是日,最后對"時:分:秒"排序.除了"時:分:秒"這個key,其余的key都沒必要指定key的結束位置,因為"n"和"M"選項作用范圍不能跨域每個key的左邊界.第二個sort命令是對ipv4地址依照字典順序排序的.第二個sort語句中使用了"-s"選項,以防止主排序key的關系被副排序key破壞,第一個sort語句中使用"-s"選項是為了保證兩個sort語句在"-s"屬性上的一致性.
(注:由于n選項無法跨越key界限和非數學字符,因此上面第二個sort命令和下面的命令是等價的:)
sort -s -t '.' -n -k1 -k2 -k3 -k4
本文永遠更新鏈接地址:
更多LINUX教程,盡在維易PHP學院專欄。歡迎交流《LINUX教程:Linux sort命令中文手冊(info sort翻譯)》!
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/8873.html