バージョン番号のソート
item2、item10のようなバージョン番号を含む文字列を正しい順序でソートするには、-V(--version-sort)オプションを使用する。
$ cat versions.txt
item2
item10
item1
$ sort versions.txt
item1
item10
item2
オプションなしのsortは文字列として辞書順にソートするため、item10がitem2より前に並んでしまう。-Vオプションを使用すると、数値部分を認識してバージョン番号として正しい順序でソートできる。
$ sort -V versions.txt
item1
item2
item10
セマンティックバージョニングのソート
-Vオプションは1.2.0のようなドット区切りのバージョン番号にも対応している。
$ cat semver.txt
app-1.10.0
app-1.2.0
app-1.9.0
app-2.0.0
$ sort semver.txt
app-1.10.0
app-1.2.0
app-1.9.0
app-2.0.0
文字列としてソートすると1.10.0が1.2.0より前に並んでしまうが、-Vオプションを使用するとメジャー、マイナー、パッチの各セグメントを数値として比較するため、意図した順序でソートできる。
$ sort -V semver.txt
app-1.2.0
app-1.9.0
app-1.10.0
app-2.0.0
応用: ログローテーションされたファイルのソート
logrotateなどでローテーションされたaccess.log.1、access.log.2、access.log.10のようなファイルも、-Vオプションでソートすると番号順に並べられる。
$ ls access.log*
access.log
access.log.1
access.log.10
access.log.2
access.log.9
$ ls access.log* | sort -V
access.log
access.log.1
access.log.2
access.log.9
access.log.10
なおlsコマンド自体にも同様の-vオプションがあり、ls -v access.log*でも同じ順序に並べられる。
補足
-VオプションはGNU拡張であり、GNU Coreutils 7.0 (2008年リリース)
以降で利用可能である。詳細はsort(1) - Linux manual page
を参照。
指定したフィールドをキーにソートするには【sort -k】指定したフィールドをキーにソートする を参照。human readableな数値のソートについてはsortコマンドでhuman readableな数値をソートする を参照。
\第一線のプログラマーの行動原理を学べる!/
