
2017/02/12 追記
以下の内容を記述していた時は知らなかったのだが、GNU sortを使っているのであれば普通に「-V(--version-sort)」で処理するほうがいい。
(Mac OS Xだとgsortが必要)
bashsort -V
shellblacknon@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アドレスが文字列として扱われてしまい、かつ「.(ドット)」で区切られているからだ。
では、どうすればうまくソートさせることが出来るのだろうか?
以下のようなリストを例にしてみよう。
shelltest@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オクテット)でソートする
となっている。
実際に実行した例がこちら。
shelltest@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列目のリストだった場合でも、上記コマンドであればソートすることが出来る。
shelltest@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