wc コマンド入門 - 行数・単語数・文字数を数える

wc コマンド入門 - 行数・単語数・文字数を数える

この記事で学べること

  • wc行数・単語数・バイト数 をまとめて数える基本が分かる
  • -l / -w / -c / -m使い分け が身につく
  • ls | wc -l のように パイプで「件数」を数える 定番形が書けるようになる
  • 初心者がハマりやすい 「バイト数と文字数がずれる(日本語)」「最終行のカウントが合わない」 の理由が腑に落ちる

結論(先に覚える型)

  • とりあえず全部数えたい → wc ファイル
  • 行数だけ欲しい → wc -l
  • 件数を数えたい(一覧の数え上げ) → 何かのコマンド | wc -l
  • 日本語の「文字数」を数えたい → wc -m-c はバイト数なので注意)

前提(対象環境)

  • OS:Ubuntu / 一般的な Linux
  • GNU coreutils の wcwc = word count の略)
  • 文字コードは UTF-8 を想定

1. wc とは何か?まずは全部数えてみる

結論: wc ファイル は「行数・単語数・バイト数」を左から順に 3 つ表示する。名前は word count だが行もバイトも数えられる。

リナ: 先輩、「このファイル何行あるんだろう?」とか「単語いくつ?」って数えたいとき、手で数えるしかないんですか…?
ライニー先輩: そんなときのためのコマンドが wc だよ。word count の略で、名前は「単語を数える」だけど、実は 行数・単語数・バイト数 をまとめて数えてくれるんだ。
リナ: 名前と中身がちょっと違うんですね。

サンプルとして次のファイルを用意しよう。

$ cat sample.txt
hello world
linux command
penguin gym

wc にそのまま渡してみる。

$ wc sample.txt
 3  6 38 sample.txt

3 つの数字の意味(左から順番)

位置 数字 意味
1 番目 3 行数
2 番目 6 単語数
3 番目 38 バイト数

最後にファイル名が付く。

リナ: 3 つも数字が出てきて、どれが何だか分からなくなりそう…
ライニー先輩: 順番さえ覚えれば大丈夫。「行・単語・バイト」 の順だよ。でも実際の現場では「行数だけ欲しい」みたいに 1 種類だけ 使うことの方が多い。次でオプションを見ていこう。

2. 行数だけ数える -l

結論: wc -l は行数だけを表示する。ログの行数やリストの件数を数えるときの定番。

$ wc -l sample.txt
3 sample.txt

-lline(行)の頭文字。

ログファイルが「何行あるか」を知りたいときの定番。

# エラーログが何行たまっているか
$ wc -l /var/log/syslog

3. 単語数・バイト数・文字数 -w / -c / -m

結論: -w は単語数、-c はバイト数、-m は文字数。日本語など多バイト文字では -c-m の値がずれる。

3-1. 単語数 -w

$ wc -w sample.txt
6 sample.txt

-wword(単語)。空白や改行で区切られたかたまり を 1 単語として数える。

3-2. バイト数 -c

$ wc -c sample.txt
38 sample.txt

-ccharacter… と言いたいところだが、実際に数えるのは バイト数。ここが最初の落とし穴。

3-3. 文字数 -m

$ wc -m sample.txt
38 sample.txt

英数字だけのファイルなら バイト数と文字数は一致 する(1 文字 = 1 バイト)。違いが出るのは日本語のときだ。

オプション 数えるもの
-l line 行数
-w word 単語数
-c バイト数
-m 文字数

4. 初心者がハマる罠:日本語で「バイト」と「文字数」がずれる

結論: UTF-8 では日本語 1 文字が 3 バイト。文字数を数えたいなら -c(バイト)ではなく -m(文字)を使う。

リナ: 「あいう」って 3 文字のファイルを数えたら、wc -c10 って出ました。バグですか?
ライニー先輩: バグじゃないんだ。-cバイト数 を数える。UTF-8 という文字コードでは、日本語 1 文字 = 3 バイト。だから「あいう」=3 文字 × 3 バイト = 9 バイト、さらに末尾の改行 1 バイトで合計 10 になる。

実際に見てみよう。

$ echo "あいう" > jp.txt
$ wc jp.txt
 1  1 10 jp.txt
# バイト数
$ wc -c jp.txt
10 jp.txt
# 文字数(改行も 1 文字として数える)
$ wc -m jp.txt
4 jp.txt

初心者あるある

  • 日本語の「文字数」を数えたいのに -c を使ってしまい、3 倍くらいの数字が出て混乱する
  • 文字数を数えたいなら -m、データ容量(バイト)を知りたいなら -c と覚える
  • どちらも末尾の改行を 1 つ数える点に注意

5. パイプで「件数」を数える定番形

結論: 何かのコマンド | wc -l で出力行数=件数を数えられる。ls | wc -lgrep ... | wc -l が頻出。

リナ: ファイルの行数は分かりました。でも「このフォルダにファイルいくつある?」みたいなのも数えたいです。
ライニー先輩: そこで wc が真価を発揮する。wcパイプ(|)で受け取った出力 も数えられる。ls | wc -l で「ls が出した行数」=「ファイルの数」が分かるんだ。

5-1. ファイル・ディレクトリの個数を数える

$ ls | wc -l
12

ls の出力 1 行 = 1 項目なので、行数を数えれば 個数 になる。

5-2. 検索にヒットした行数を数える

# ログから "error" を含む行が何件あるか
$ grep "error" app.log | wc -l
27

grep には件数を数える -c オプションもある。grep -c "error" app.log でも同じことができるので、こちらの方が短い。wc -l はあらゆるコマンドに使える汎用形として覚えておくと便利。

パイプ + wc -l が便利なポイント

  • ファイル名が出力に付かない(数字だけ返る)ので、そのまま集計に使いやすい
  • lsgrepfind など 何でも数えられる 汎用テクニック

6. 複数ファイルをまとめて数える&合計

結論: 複数ファイルを渡すと 1 行ずつ表示し、最後に total 行で合計を出す。

$ wc -l *.txt
  3 sample.txt
  1 jp.txt
  4 total

最後の total全ファイルの合計 行数。プロジェクト全体の行数を測るときに便利。

7. よくある初心者のつまずき

結論: 文字数のずれは -c/-m 取り違え、ファイル名が邪魔なときはリダイレクトで渡す、最終行のカウントは改行有無で変わる。

7-1. 出力にファイル名が付いて邪魔

wc -l file はファイル名も一緒に出る。数字だけ欲しい ときは、リダイレクト < で「標準入力」として渡す。

# ファイル名が付く
$ wc -l sample.txt
3 sample.txt
# 数字だけ(ファイル名なし)
$ wc -l < sample.txt
3

仕組み

  • wc -l filewc は「ファイルを開いた」ので、どのファイルか名前を添える
  • wc -l < file … シェルが中身を流し込むだけで wc はファイル名を知らない → 数字だけ

7-2. 最終行に改行がないと行数が 1 少なく見える

wc -l改行の数 を数える。最後の行に改行がないと、その行はカウントされない。

# 改行で終わらないファイル
$ printf "a\nb\nc" | wc -l
2

a b c の 3 行に見えるが、改行は 2 個しかないので 2。テキストファイルは通常「最終行も改行で終わる」のが作法、と覚えておくと混乱しない。

7-3. 日本語の文字数なのに数字が大きすぎる

「7. 4 節」の通り -cバイト数。文字数なら -m

$ wc -m jp.txt   # 文字数
$ wc -c jp.txt   # バイト数(日本語は約 3 倍)

8. ミニ課題:実際にやってみよう

結論: 行数カウント・件数カウント・文字数の 3 問で、wc の基本とパイプ連携を手で確かめる。

リナ: 知識は入りました! 手を動かして確かめたいです。
ライニー先輩: いいね、3 問用意したよ。ターミナルで試してみて。

課題 1:次のファイルが何行あるか数えよう。

$ cat << 'EOF' > memo.txt
りんご
ばなな
みかん
ぶどう
EOF
ヒントを見る

行数を数えるオプションは -l(line)。

解答例
$ wc -l memo.txt
4 memo.txt

課題 2:いまいるディレクトリにある .txt ファイルが何個あるか数えよう。

ヒントを見る

ls *.txt の出力をパイプで wc -l に渡す。

解答例
$ ls *.txt | wc -l

(環境によって数字は変わる)

課題 3memo.txt文字数 を数えよう(バイト数ではなく)。

ヒントを見る

日本語の文字数は -m(文字数)。-c はバイト数なので注意。

解答例
$ wc -m memo.txt
13 memo.txt

(4 単語 × 3 文字 = 12 + 改行 4 個…ではなく、各行 3 文字 + 改行 1 で 1 行 4 文字 × 4 行 = 16 になる場合もある。環境・入力で変わるので、-c との差を観察するのがポイント)

9. コピペ用テンプレート

結論: 行数・件数・文字数・合計のよく使う型を手元に置いておく。

よく使う型をまとめておく

# 全部数える(行・単語・バイト)
wc file.txt

# 行数だけ
wc -l file.txt

# 数字だけ欲しい(ファイル名なし)
wc -l < file.txt

# 件数を数える(一覧の数え上げ)
ls | wc -l

# 検索ヒット件数
grep "keyword" file.txt | wc -l

# 日本語の文字数
wc -m file.txt

# バイト数(データ容量の目安)
wc -c file.txt

# 複数ファイルの合計行数
wc -l *.txt

まとめ:次に読む