Sort
按欄位內的字元欄位位置數字排序
我有一個前向 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
數字修飾符
KEYDEF
是F[.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 ___