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

2017/02/12 追記

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

sort -V
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アドレスが文字列として扱われてしまい、かつ「.(ドット)」で区切られているからだ。
では、どうすればうまくソートさせることが出来るのだろうか?

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

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コマンドを実行すると良いだろう。

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オクテット)でソートする

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

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列目のリストだった場合でも、上記コマンドであればソートすることが出来る。

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