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