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

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

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

20150501_000001

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
Sponsored Links

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

20150501_000002

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

 

http://larsmichelsen.com/open-source/quickie-sort-ip-addresses-on-linux-command-line-bash/

Pocket

Written by blacknon

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

Leave a Comment

メールアドレスが公開されることはありません。