1. ホーム
  2. Linux

【Linux】wc・sort・uniq の使い方|行数カウント・並び替え・重複除去をコマンドで行う

Share

ログファイルの行数を数えたい、リストを並び替えたい、重複した行を1つにまとめたい――こうしたテキスト処理は、Linux の wcsortuniq という3つのコマンドで手早く行えます。この記事では、それぞれの基本的な使い方とよく使うオプション、そしてパイプでつないで組み合わせる実践例までを、コマンド例とともに解説します。ターミナルでのちょっとした集計が、ぐっと楽になります。

wc で行数・単語数・文字数を数える

wc は「word count」の略で、ファイルの行数・単語数・バイト数を数えるコマンドです。オプションを付けずに実行すると、この3つがまとめて表示されます。

ターミナル
$ wc access.log
  1200   9600  85000 access.log
# 左から「行数」「単語数」「バイト数」ファイル名

実際には「行数だけ知りたい」というケースが多く、その場合はオプションで数えたい対象を絞ります。よく使うオプションは次の通りです。

オプション数える対象
-l行数(lines)
-w単語数(words)
-cバイト数(bytes)
-m文字数(characters)。日本語など複数バイト文字を数えるとき
ターミナル
$ wc -l access.log
1200 access.log

# 他のコマンドの出力を数えることも多い
$ ls | wc -l    # カレントディレクトリのファイル数を数える
42

2つ目の例のように、|(パイプ)で他のコマンドの出力を wc -l に渡すと、その出力が何行あるかを数えられます。「該当する項目がいくつあるか」を調べる定番の使い方です。

sort で行を並び替える

sort は、テキストを行単位で並び替えるコマンドです。何も指定しないと、文字コード順(おおむねアルファベット順)で昇順に並びます。

ターミナル
$ sort names.txt    # 昇順(あいうえお・アルファベット順)に並べる

並び方はオプションで変えられます。特に数値を扱うときの -n は重要です。オプションなしだと「10」が「2」より前に来てしまう(文字として先頭の「1」で比較される)ため、数値の大小で並べたいときは -n を付けます。

オプション効果
-r逆順(降順)に並べる
-n数値として大小を比較する
-f大文字・小文字を区別しない
-k並び替えの基準にする列(フィールド)を指定する
-u並び替えたうえで重複行を1つにまとめる
ターミナル
$ sort -n scores.txt      # 数値の小さい順
$ sort -rn scores.txt     # 数値の大きい順(-r と -n を同時指定)

オプションはまとめて -rn のように書けます。ランキングの上位を見たいときなどに sort -rn はよく使います。

uniq で重複した行をまとめる

uniq は、連続して並んでいる同じ行を1つにまとめるコマンドです。ここで重要なのは、uniq が見るのは「隣り合った行」だけという点です。離れた場所に同じ行があっても、間に別の行が挟まっていると重複とはみなされません。そのため、uniq は先に sort で並べてから使うのが基本になります。

ターミナル
# まず sort で同じ行を隣り合わせてから uniq に渡す
$ sort access.log | uniq

uniq のオプションでは -c が特に便利で、各行が何回出現したかを数えて先頭に付けてくれます。

オプション効果
-c各行の出現回数を先頭に付ける
-d重複している行だけを表示する
-u重複せず1回だけ現れた行を表示する
-i大文字・小文字を区別しない

3つを組み合わせてランキングを作る

これらのコマンドはパイプでつなぐと真価を発揮します。定番なのが「出現回数の多い順ランキング」です。たとえばアクセスログから、リクエストの多い IP アドレスを上位順に並べるには次のように書きます。

ターミナル
$ sort access.log | uniq -c | sort -rn | head
#   1) sort     … 同じ行を隣り合わせる
#   2) uniq -c  … 重複をまとめ、出現回数を先頭に付ける
#   3) sort -rn … 回数(数値)の多い順に並べる
#   4) head     … 上位10件だけ表示する

この「sort | uniq -c | sort -rn」という並びは、頻度を数えて多い順に見る定番のパターンです。ログ解析や、テキスト中の単語の集計など、さまざまな場面で応用できます。head を付けて上位だけに絞ると結果が見やすくなります。

思った結果にならないとき

uniq で重複が消えない

uniq を使ったのに同じ行が残っている」ときは、たいてい sort を通していないのが原因です。前述の通り uniq は隣り合う行しか比較しないので、離れた重複は消えません。重複を確実に取り除くには、必ず sort で並べてから uniq に渡してください。単純に重複を消すだけなら sort -u でも同じことができます。

数字が正しく並ばない

sort で「100」より「9」が後ろに来てしまうときは、数値ではなく文字として比較されています。これは -n オプションの付け忘れが原因です。数値の大小で並べたいときは sort -n、大きい順なら sort -rn を使いましょう。

まとめ

wc は行数・単語数・文字数を数えるコマンドで、wc -l による行数カウントが特によく使われます。sort は行の並び替えを行い、数値を扱うときは -n、逆順は -r を指定します。uniq は連続した重複行をまとめますが、隣り合う行しか見ないため sort と組み合わせるのが基本です。この3つをパイプでつなげば、「sort | uniq -c | sort -rn」のように出現回数ランキングを一行で作れます。ログ解析や集計の強い味方になるので、ぜひ手を動かして試してみてください。

参考ページ