리눅스 IP 주소 정렬

2019. 9. 16. 17:07 | 리눅스

리눅스에서 정렬할때 sort 명령어를 자주 사용한다. 그런데 IPv4 주소의 경우 sort로 그냥 정렬하면 원하는 결과가 나오지 않는다. 예를 들어 아래와 같은 IP 주소가 있다고 할 때


20.2.2.2

3.4.3.3

100.1.1.1

3.30.3.3


우리가 원하는 결과는 아래와 같다.


3.4.3.3
3.30.3.3
20.2.2.2
100.1.1.1

하지만 그냥 sort를 하면 아래와 같이 나오고

100.1.1.1
20.2.2.2
3.30.3.3
3.4.3.3

sort -n 옵션을 주어도 아래와 같이 나온다.

3.30.3.3
3.4.3.3
20.2.2.2
100.1.1.1

3.30.3.3보다 3.4.3.3이 먼저 나와야 하는데 -n은 그것까지 고려하지 못한다.

해결책은 약간의 트릭이기는 하지만 -V 옵션을 사용하는 것이다. -V는 버전넘버로 정렬인데 IPv4 주소가 딱 거기에 걸리는 형식이다. sort -V 옵션을 사용하면 아래와 같이 원하는 결과가 나온다.

3.4.3.3
3.30.3.3
20.2.2.2
100.1.1.1


참고로 MySQL의 경우 ORDER BY INET_ATON(column)을 사용하면 되고, Python의 경우 socket.inet_aton을 사용하면 된다.