sort・uniq入門|行を並べ替える・重複を数える基本

sort・uniq入門|行を並べ替える・重複を数える基本

「このログ、どのエラーが一番多かったんだろう」と、ファイルを目で追って数えていた時期があります。

その「並べ替え」と「重複の数え上げ」を一瞬で片づけてくれるのが 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 と組み合わせると、さらに応用が利きます。あわせてどうぞ。

grep入門|ファイルから必要な行だけを検索・抽出する基本

以上です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA