日付でソート!sortコマンドは有能です

古都の老兵
2023-01-23
2023-01-23

はじめに

日本だと日付の表現はほぼ一択で、年、月、日と並んでいますから日付順にソートするのは難しくありません。
しかし、特にsyslogに出力される日付は月がJan,Feb,Mar...と英語表記の為にそのままソートすると正常にソートされません。
日本も元号を使われると困ったりしますが、幸いシステム関係のログには元号は使われていませんからね。

やり方

sort コマンドには最初から月がJan,Feb,Mar...と言った表記をソートするオプションが用意されています。
-M, --month-sort    compare (unknown) < 'JAN' < ... < 'DEC'

数字はそのままだと文字としてしか認識しませんので、0~9の1桁ならうまくいきますが2桁以上だと思った通りになりません。例えば、
 9
 10
 2
だと、2,9,10 とソートしたいのですが、
 10
 2
 9
となりますので、数字であると教えてあげないといけません。
-n, --numeric-sort

最後に何番目かを -k で指定すれば完了します。
syslog だと例えば以下のフォーマットを取りますから
Jan 15 03:27:02 hostname run-parts(/etc/cron.daily)[28720]: finished logrotate
Jan 15 03:27:03 hostname run-parts(/etc/cron.daily)[28683]: starting man-db.cron
Jan 15 03:27:05 hostname run-parts(/etc/cron.daily)[28733]: finished man-db.cron

sort -k1M -k2n -k3 [ファイル名]
尚、syslog には年が入らない為、年を跨ぐようなsortだとうまくsortできないので注意が必要です。

最後に

sort コマンドには何故かランダムソートというオプションがあります。
ソートは一定の規則に沿って並び替える事のはずがバラバラにしてしまうオプションがあるというのも面白いですね。