「このログ、どのエラーが一番多かったんだろう」と、ファイルを目で追って数えていた時期があります。
その「並べ替え」と「重複の数え上げ」を一瞬で片づけてくれるのが sort と uniq です。
sort は行を並べ替えるコマンド、uniq は連続する重複行をまとめるコマンド。
この2つはセットで使うことが多く、sort で並べてから uniq で数えるのが定番の流れになります。
この記事では、明日からそのまま使える最小限の sort と uniq を、実際のコマンドと一緒にまとめました。
sort の基本 ——行を並べ替える
まずは sort から。引数にファイルを渡すと、行を辞書順に並べ替えて表示します。
sort file.txt
注意したいのが数字の並びです。
sort は既定では文字として比較するので、そのままだと「10」が「9」より前に来てしまうのです。
数値として並べたいときは -n を付けます。
sort -n numbers.txt
大きい順にしたいなら -r で逆順、あわせて -rn とすれば数値の降順になります。
sort -rn numbers.txt
CSV のように区切りのある行を特定の列で並べたいときは、-t で区切り文字を、-k で列番号を指定します。
sort -t, -k2 -n data.csv
これで「2列目の数値の小さい順」に並びます。ファイルサイズのような単位つきの数値は -h を使うと 1K・2M もまとめて正しく並びます。
du -h | sort -h
uniq の基本 ——重複をまとめる・数える
uniq は連続して並んだ同じ行を1行にまとめます。
ここで一番大事なのが、uniq は「隣り合った」行しか見ないという点です。
なのでバラバラに散らばった重複を扱うときは、先に sort で並べておくのが前提になります。
sort access.log | uniq
各行が何回出てきたかを数えるなら -c を付けます。行の先頭に回数が入ります。
sort access.log | uniq -c
重複した行だけを見たいなら -d、逆に1回しか出てこない行だけを見たいなら -u です。
sort access.log | uniq -d
sort access.log | uniq -u
定番の組み合わせ ——多い順に数える
実務で一番よく使うのが、sort | uniq -c | sort -rn の3段構えです。
「並べる → 数える → 多い順に並べ直す」という流れで、アクセスの多い IP やエラーメッセージの集計にそのまま使えます。
sort access.log | uniq -c | sort -rn
上位だけ見たいときは head を足すと、ランキングの形になります。
sort access.log | uniq -c | sort -rn | head
なお、行全体の重複を消すだけなら sort -u が sort | uniq と同じ働きをします。
sort -u names.txt
ただしこの等価は万能ではありません。
sort -n -u は行の先頭の数値だけを見て重複を判定するのに対し、sort -n | uniq は行全体で判定します。数値を含む行では、意図した方を選んでください。
最後に
sort で並べて、uniq で数える。
この2つを覚えるだけで、ログ調査やデータの下ごしらえがぐっと速くなります。
特に sort | uniq -c | sort -rn は、一度手に馴染ませておくと長く使える定番です。
行を絞り込む grep と組み合わせると、さらに応用が利きます。あわせてどうぞ。
以上です。









コメントを残す