wc コマンド入門 - 行数・単語数・文字数を数える
この記事で学べること
wcで 行数・単語数・バイト数 をまとめて数える基本が分かる-l/-w/-c/-mの 使い分け が身につくls | wc -lのように パイプで「件数」を数える 定番形が書けるようになる- 初心者がハマりやすい 「バイト数と文字数がずれる(日本語)」「最終行のカウントが合わない」 の理由が腑に落ちる
結論(先に覚える型)
- とりあえず全部数えたい →
wc ファイル - 行数だけ欲しい →
wc -l - 件数を数えたい(一覧の数え上げ) →
何かのコマンド | wc -l - 日本語の「文字数」を数えたい →
wc -m(-cはバイト数なので注意)
前提(対象環境)
- OS:Ubuntu / 一般的な Linux
- GNU coreutils の
wc(wc= 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 |
バイト数 |
最後にファイル名が付く。
2. 行数だけ数える -l
結論:
wc -lは行数だけを表示する。ログの行数やリストの件数を数えるときの定番。
$ wc -l sample.txt
3 sample.txt
-l は line(行)の頭文字。
ログファイルが「何行あるか」を知りたいときの定番。
# エラーログが何行たまっているか $ wc -l /var/log/syslog
3. 単語数・バイト数・文字数 -w / -c / -m
結論:
-wは単語数、-cはバイト数、-mは文字数。日本語など多バイト文字では-cと-mの値がずれる。
3-1. 単語数 -w
$ wc -w sample.txt
6 sample.txt
-w は word(単語)。空白や改行で区切られたかたまり を 1 単語として数える。
3-2. バイト数 -c
$ wc -c sample.txt
38 sample.txt
-c は character… と言いたいところだが、実際に数えるのは バイト数。ここが最初の落とし穴。
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(文字)を使う。
wc -c が 10 って出ました。バグですか?-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 -lやgrep ... | 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 が便利なポイント
- ファイル名が出力に付かない(数字だけ返る)ので、そのまま集計に使いやすい
ls・grep・findなど 何でも数えられる 汎用テクニック
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 file…wcは「ファイルを開いた」ので、どのファイルか名前を添える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の基本とパイプ連携を手で確かめる。
課題 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
(環境によって数字は変わる)
課題 3:memo.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