Sort

按欄位內的字元欄位位置數字排序

  • November 16, 2017

我有一個前向 DNS 區域文件的摘錄,我想按 IP 地址升序對其進行排序。在將其標記為重複之前,請先閱讀片刻,因為這不是對 IP 地址進行排序(sort -k5V將解決該問題)。

以下是數據範例:

esx01.example.com.      3600    IN      A       10.1.1.212
ilo01.example.com.      3600    IN      A       10.1.1.211
nas01.example.com.      3600    IN      A       10.1.1.101
pc001.example.com.      1200    IN      A       10.1.1.42
pc002.example.com.      1200    IN      A       10.1.1.52
pc003.example.com.      1200    IN      A       10.1.1.29

在這種特定情況下,我知道我可以只按最後一個八位字節排序,所以這應該是sort.

手冊頁確認我-k不僅可以使用欄位,還可以使用該欄位內的偏移量,以及n數字修飾符

KEYDEFF[.C][OPTS][,F[.C][OPTS]]開始和停止位置,其中F是欄位編號和欄位C中的字元位置;兩者都是原點 1,停止位置預設為行尾。如果 -t 和 -b 均無效,則欄位中的字元從前一個空格的開頭開始計數。OPTS是一個或多個單字母排序選項 [ bdfgiMhnRrV],它覆蓋該鍵的全域排序選項。

最後一個八位字節方便地從第五個欄位中的字元偏移量八開始,所以我的理解是這個命令應該足夠了:

sort -k5.8n /tmp/axfr.10.1.1

但是,這根本不會對我的數據進行排序。根據經驗,我發現我需要從欄位位置15開始按預期的升序對這些數據進行排序:

sort -k5.15n /tmp/axfr.10.1.1

pc003.example.com.      1200    IN      A       10.1.1.29
pc001.example.com.      1200    IN      A       10.1.1.42
pc002.example.com.      1200    IN      A       10.1.1.52
nas01.example.com.      3600    IN      A       10.1.1.101
ilo01.example.com.      3600    IN      A       10.1.1.211
esx01.example.com.      3600    IN      A       10.1.1.212

為什麼?

使用該sort --debug選項獲取一些線索:

$ echo 'esx01.example.com.      3600    IN      A       10.1.1.212' | 
  sort --debug -k5.8n
sort: using simple byte comparison
sort: leading blanks are significant in key 1; consider also specifying 'b'
sort: key 1 is numeric and spans multiple fields
esx01.example.com.      3600    IN      A       10.1.1.212
                                               ____

它在排序欄位下劃線。這不是你所期望的。您需要-b,因為 sort 從前一個欄位的末尾開始計算列(手冊頁:如果 -t 和 -b 均無效,則欄位中的字元從前一個空格的開頭開始計算):

$ ... | sort --debug -b -n -k5.8 
sort: using simple byte comparison
sort: key 1 is numeric and spans multiple fields
esx01.example.com.      3600    IN      A       10.1.1.212
                                                      ___

-n需要分開:

$ ... | sort --debug -b -k5.8n
sort: using simple byte comparison
sort: leading blanks are significant in key 1; consider also specifying 'b'
sort: key 1 is numeric and spans multiple fields
sort: option '-b' is ignored
esx01.example.com.      3600    IN      A       10.1.1.212
                                               ____

b給定的n

$ ... | sort --debug  -k5.8nb
sort: using simple byte comparison
sort: key 1 is numeric and spans multiple fields
esx01.example.com.      3600    IN      A       10.1.1.212
                                                      ___

引用自:https://unix.stackexchange.com/questions/405046