Linux/UNIXのsortコマンドでIPアドレスのソートを行う

2017/02/12 追記

以下の内容を記述していた時は知らなかったのだが、GNU sortを使っているのであれば普通に「-V(--version-sort)」で処理するほうがいい。
(Mac OS Xだとgsortが必要)

bash
sort -V
shell
blacknon@BS-PUB-DEVELOP:~$ cat test.txt 192.168.0.102 192.168.0.8 192.168.0.97 192.168.0.68 192.168.0.99 192.168.0.66 192.168.0.24 blacknon@BS-PUB-DEVELOP:~$ sort -V test.txt 192.168.0.8 192.168.0.24 192.168.0.66 192.168.0.68 192.168.0.97 192.168.0.99 192.168.0.102

その他、sortコマンドについてはこちらにも使い方を記述してある。


以下、当初の内容。  

Linux/UNIXのsortコマンドでIPアドレスをソートする場合、ただsortコマンドで指定しただけだとうまくソート出来ない。
というのも、IPアドレスが文字列として扱われてしまい、かつ「.(ドット)」で区切られているからだ。
では、どうすればうまくソートさせることが出来るのだろうか?

以下のようなリストを例にしてみよう。

shell
test@test-vm-ubuntu:/work$ cat test.list 192.168.0.102 192.168.0.8 192.168.0.97 192.168.0.68 192.168.0.99 192.168.0.66 192.168.0.24

このようなリストをソートさせる場合は、以下のようにsortコマンドを実行すると良いだろう。

bash
sort -n -t'.' -k1,1 -k2,2 -k3,3 -k4,4

一応、オプションの解説をする。

  • -n … ソート対象を数字として扱う
  • -t '.' … ソートキーの区切り文字として'.'を指定する
  • -k1,1 … 1列目(第1オクテット)でソートする
  • -k2,2 … 2列目(第2オクテット)でソートする
  • -k3,3 … 3列目(第3オクテット)でソートする
  • -k3,3 … 4列目(第4オクテット)でソートする

となっている。
実際に実行した例がこちら。

shell
test@test-vm-ubuntu:/work$ cat test.list 192.168.0.102 192.168.0.8 192.168.0.97 192.168.0.68 192.168.0.99 192.168.0.66 192.168.0.24 test@test-vm-ubuntu:/work$ cat test.list | sort -n -t'.' -k1,1 -k2,2 -k3,3 -k4,4 192.168.0.8 192.168.0.24 192.168.0.66 192.168.0.68 192.168.0.97 192.168.0.99 192.168.0.102

もしIPアドレスが2列目、3列目のリストだった場合でも、上記コマンドであればソートすることが出来る。

shell
test@test-vm-ubuntu:/work$ cat test.list test1 192.168.0.102 aaaa test333 192.168.0.8 bbbbb eeee 192.168.0.97 ccccc dadada 192.168.0.68 ddddd sssss 192.168.0.99 ssss ffdfd 192.168.0.66 sssss host 192.168.0.24 sssss test@test-vm-ubuntu:/work$ cat test.list | sort -n -t'.' -k1,1 -k2,2 -k3,3 -k4,4 test333 192.168.0.8 bbbbb host 192.168.0.24 sssss ffdfd 192.168.0.66 sssss dadada 192.168.0.68 ddddd eeee 192.168.0.97 ccccc sssss 192.168.0.99 ssss test1 192.168.0.102 aaaa