ログファイルの行数を数えたい、リストを並び替えたい、重複した行を1つにまとめたい――こうしたテキスト処理は、Linux の wc・sort・uniq という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」のように出現回数ランキングを一行で作れます。ログ解析や集計の強い味方になるので、ぜひ手を動かして試してみてください。