次に示すのは、ソートに複数のキーを使うことが望ましい例である。まず、第2列に基づいてソートするが、この列には100という値がいくつもある。したがって、そうしたレコードについては、つづいて第1列に基づくソートを行うと、出力が読みやすくなる。-n/--positionコマンドラインオプションは、指定のフィールドをキーとしてソートするようmsortに伝えている。フィールド間の分離にはホワイトスペースを使うのがデフォルトであり、第1列と第2列の間のスペースでデータが2つの列に正しく分割される。しかし、-d/--field-separators引数を用いて、複数のフィールド分離文字を指定することもできる。コマンドラインの中央にある-c nオプションは、指定されたキーを数値的にソートせよ、という指示である。デフォルトでは辞書的な比較が行われるため、20という値が100という値の後ろに来ることになるが、ここでは数値比較により、出力のいちばん上に置かれている。
$ cat multi-key-charnum.txt act 100 there 100 foo 100 bar 300 urusai 300 small 20 one 20 $ msort.utf8proc --quiet --line -n 2 -c n -n 1 multi-key-charnum.txt one 20 small 20 act 100 foo 100 there 100 bar 300 urusai 300
-cで指定できるソート順オプションには、日付、時刻、ドメイン、電子メールアドレス、角度、ハイブリッドなど、さまざまなものがある。数値オプションにも何通りかある。ハイブリッドモードは、テキストと数値の反復パターンに基づいてフィールドを分割するというもので、システムログによくあるIPアドレスのソートに非常に便利なオプションである。次に示すのは、syslogで得たiptablesパケットレポートの部分サンプルである。これを、まずソースアドレスで、次に宛先アドレスでソートしてみよう。-t/--tagオプションでログからIPアドレスを拾い出し、-c hオプションで、どのキーについてもハイブリッド比較モードでのソートを行うよう指示する。
$ cat hybrid-ips.txt Apr 29 20:14:58 fots kernel: invalides IN=eth2 OUT=eth0 SRC=192.168.3.2 DST=192.168.3.4 LEN=76... Apr 29 20:15:48 fots kernel: invalides IN=eth2 OUT=eth0 SRC=192.168.3.4 DST=192.168.4.12 LEN=76... Apr 29 20:15:48 fots kernel: invalides IN=eth2 OUT=eth0 SRC=192.168.3.2 DST=192.168.0.33 LEN=76... Apr 29 20:15:48 fots kernel: invalides IN=eth1 OUT=eth0 SRC=192.168.3.3 DST=192.168.3.33 LEN=76... Apr 29 20:15:48 fots kernel: invalides IN=eth2 OUT=eth0 SRC=192.168.3.4 DST=192.168.0.33 LEN=76... Apr 29 20:15:48 fots kernel: invalides IN=eth2 OUT=eth0 SRC=192.168.3.2 DST=192.168.0.33 LEN=76... Apr 29 20:15:48 fots kernel: invalides IN=eth2 OUT=eth0 SRC=192.168.3.2 DST=192.168.0.133 LEN=76... Apr 29 20:15:48 fots kernel: invalides IN=eth2 OUT=eth0 SRC=192.168.3.2 DST=192.168.1.33 LEN=76... $ msort.utf8proc -ql -t SRC= -c h -t DST= -c h hybrid-ips.txt Apr 29 20:15:48 fots kernel: invalides IN=eth2 OUT=eth0 SRC=192.168.3.2 DST=192.168.0.33 LEN=76... Apr 29 20:15:48 fots kernel: invalides IN=eth2 OUT=eth0 SRC=192.168.3.2 DST=192.168.0.33 LEN=76... Apr 29 20:15:48 fots kernel: invalides IN=eth2 OUT=eth0 SRC=192.168.3.2 DST=192.168.0.133 LEN=76... Apr 29 20:15:48 fots kernel: invalides IN=eth2 OUT=eth0 SRC=192.168.3.2 DST=192.168.1.33 LEN=76... Apr 29 20:14:58 fots kernel: invalides IN=eth2 OUT=eth0 SRC=192.168.3.2 DST=192.168.3.4 LEN=76... Apr 29 20:15:48 fots kernel: invalides IN=eth1 OUT=eth0 SRC=192.168.3.3 DST=192.168.3.33 LEN=76... Apr 29 20:15:48 fots kernel: invalides IN=eth2 OUT=eth0 SRC=192.168.3.4 DST=192.168.0.33 LEN=76... Apr 29 20:15:48 fots kernel: invalides IN=eth2 OUT=eth0 SRC=192.168.3.4 DST=192.168.4.12 LEN=76...
msortでは、ソートキーを--tag正規表現で指定できるし、そのキーの比較方法をいろいろに選択できる。このため、Perlスクリプトなどの世話にならなくても、直接、コマンドラインから多種多様なソート作業を実行できる。扱うデータの種類によっては、外国語の記数法がサポートされることも大きな利点となる。
Ben Martinは、ファイルシステムに携わって10数年。現在、PH.D.も取得し、libferris、各種ファイルシステム、検索ソリューションを中心にコンサルティング事業を展開している。
