Linux sort命令詳解:字串排序

2020-07-16 10:04:34
sort 是 Linux 的排序命令,而且可以依據不同的資料型別來進行排序。sort 將檔案的每一行作為一個單位,相互比較。比較原則是從首字元向後,依次按 ASCII 碼值進行比較,最後將它們按升序輸出。

sort 命令格式如下:

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

選項:
  • -f:忽略大小寫;
  • -b:忽略每行前面的空白部分;
  • -n:以數值型進行排序,預設使用字串排序;
  • -r:反向排序;
  • -u:刪除重複行。就是 uniq 命令;
  • -t:指定分隔符,預設分隔符是製表符;
  • -k [n,m]:按照指定的欄位範圍排序。從第 n 個欄位開始,到第 m 個字(預設到行尾);

sort 命令預設是用每行開頭的第一個字元來進行排序的,比如:

[[email protected] ~]# sort /etc/passwd
#排序使用者資訊檔案
abrt:x:173:173::/etc/abrt:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin apache:x:48:48:Apache:/var/www:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
…省略部分輸出…


如果想要反向排序,則使用“-r”選項,比如:

[[email protected] ~]# sort -r /etc/passwd
#反向排序
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
…省略部分輸出…


如果想要指定排序的欄位,則需要使用"-t"選項指定分隔符,並使用"-k"選項指定欄位號。假如我想要按照 UID 欄位排序 /etc/passwd 檔案,命令如下:

[[email protected] ~]# sort -t":"-k 3,3 /etc/passwd
#指定分隔符是":",以第三個欄位開頭,以第三個欄位結尾排序,也就是只用第三個欄位排序
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
…省略部分輸出…


看起來好像很美,可是如果仔細看看,怎麼 daemon 使用者的 UID 是 2,反而排在了下面?這是因為 sort 預設是按照字元排序的,前面使用者的 UID 的第一個字元都是 1,所以這麼排序。要想按照數位排序,請使用"-n"選項,比如:

[[email protected] ~]# sort -n -t":" -k 3,3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spod/lpd:/sbin/nologin
...省略部分輸出...

當然,"-k"選項可以直接使用"-k 3",代表從第三個欄位到行尾都排序(第一個欄位先排序,如果一致,則第二個欄位再排序,直到行尾)。