전달하는 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
마지막 옥텟은 편리하게 다섯 번째 필드의 문자 오프셋 8에서 시작하므로 이 명령이면 충분하다고 이해합니다.
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
왜?
답변1
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
정렬에서는 이전 필드의 끝부터 시작하여 열을 계산하기 때문에 필요합니다 (맨 페이지:-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
___
답변2
정렬(또는 기타 항목)에 대한 현장 사양이 활력을 잃고 구성, 해독 및 디버깅이 어려워지면 데이터 전처리가 더 효율적이고 명확해질 수 있습니다.
awk -F. '{print $NF"\t"$0}' | sort -snk1,1 | cut -f2-