今回はLinuxコマンドであるwcコマンドについて解説します
wcコマンドは、ファイルや他のコマンドの出力の行数・単語数・バイト数を数えるコマンドです
ログのエラー件数を数えたり、ファイルの数を数えたり、スクリプトで行数を変数に入れたりと、パイプと組み合わせて毎日のように使うコマンドなので、ぜひ覚えて帰ってくださいね!
※注 本文の△は半角スペースに置き換えてください。わかりやすくするために△で記述してます
wcコマンドとは??
wcコマンドは、テキストの行数・単語数・バイト数を数えて表示するコマンドです
名前は「word count(ワードカウント)」の略で、オプションを付けずに実行すると「行数 単語数 バイト数 ファイル名」の順に表示します
行数は「改行の数」を数えている点が大事なポイントで、最終行に改行がないファイルでは結果が1少なくなります(後ほど詳しく説明します)
ファイル名を指定しないときは、パイプなどで渡された標準入力を数えるので、grepやfindなど他のコマンドの結果を数えるときによく使います
この記事の実行結果は、GNU coreutils 9.4のwc(Ubuntu 24.04)を一般ユーザー(user)で実行して確認しています
wcコマンドの主なオプション
wcコマンドの主なオプションは次のとおりです
| オプション | 意味 |
|---|---|
| -l (–lines) | 行数(正確には改行の数)だけを表示するオプション |
| -w (–words) | 単語数だけを表示するオプション |
| -c (–bytes) | バイト数だけを表示するオプション |
| -m (–chars) | 文字数だけを表示するオプション |
| -L (–max-line-length) | 一番長い行の長さ(表示幅)を表示するオプション |
| –files0-from=F | 数えるファイルの名前を、引数ではなくファイルFから読み込むオプション(GNU版だけのオプション) |
| –total=WHEN | 複数のファイルを数えたときの合計(total)行を、いつ表示するかを指定するオプション |
ここからは、テスト用のディレクトリwc-testの中に練習用ファイルを作って説明します
次のコマンドで同じファイルを作れるので、一緒に試してみてください
mkdir△wc-test
cd△wc-test
printf△”Linux△is△fun\nwc△counts△lines,△words△and△bytes\n\napple△△banana△△△apple\n”△>△memo.txt
printf△”こんにちは世界\nLinux入門\n”△>△ja.txt
printf△”2026-11-01△10:00:01△INFO△192.168.0.10△GET△/index.html△200\n2026-11-01△10:00:03△INFO△192.168.0.11△GET△/login△200\n2026-11-01△10:00:05△ERROR△192.168.0.25△POST△/login△500\n2026-11-01△10:00:08△INFO△192.168.0.10△GET△/mypage△200\n”△>△access.log
printf△”2026-11-01△10:00:12△WARN△192.168.0.31△GET△/admin△403\n2026-11-01△10:00:15△ERROR△192.168.0.10△GET△/api/items△500\n2026-11-01△10:00:20△INFO△192.168.0.11△GET△/logout△200\n2026-11-01△10:00:21△ERROR△192.168.0.25△GET△/api/orders△500\n”△>>△access.log
mkdir△-p△docs/sub
printf△”aaa\n”△>△docs/a.txt
printf△”bbb\nbbb\n”△>△docs/b.txt
printf△”ccc\nccc\nccc\n”△>△docs/sub/c.txt
touch△-d△”2026-11-01△10:00″△memo.txt△ja.txt△access.log△docs/a.txt△docs/b.txt△docs/sub/c.txt△docs/sub△docs
# 作成したディレクトリの構成を確認する
ls△-lR
実行結果:
.:
total 16
-rw-rw-r– 1 user user 444 Nov 1 10:00 access.log
drwxrwxr-x 3 user user 4096 Nov 1 10:00 docs
-rw-rw-r– 1 user user 34 Nov 1 10:00 ja.txt
-rw-rw-r– 1 user user 69 Nov 1 10:00 memo.txt
./docs:
total 12
-rw-rw-r– 1 user user 4 Nov 1 10:00 a.txt
-rw-rw-r– 1 user user 8 Nov 1 10:00 b.txt
drwxrwxr-x 2 user user 4096 Nov 1 10:00 sub
./docs/sub:
total 4
-rw-rw-r– 1 user user 12 Nov 1 10:00 c.txt
# ファイルの中身を確認する
cat△memo.txt
実行結果:
Linux is fun
wc counts lines, words and bytes
apple banana apple
cat△ja.txt
実行結果:
こんにちは世界
Linux入門
cat△access.log
実行結果:
2026-11-01 10:00:01 INFO 192.168.0.10 GET /index.html 200
2026-11-01 10:00:03 INFO 192.168.0.11 GET /login 200
2026-11-01 10:00:05 ERROR 192.168.0.25 POST /login 500
2026-11-01 10:00:08 INFO 192.168.0.10 GET /mypage 200
2026-11-01 10:00:12 WARN 192.168.0.31 GET /admin 403
2026-11-01 10:00:15 ERROR 192.168.0.10 GET /api/items 500
2026-11-01 10:00:20 INFO 192.168.0.11 GET /logout 200
2026-11-01 10:00:21 ERROR 192.168.0.25 GET /api/orders 500
cat△docs/a.txt△docs/b.txt△docs/sub/c.txt
実行結果:
aaa
bbb
bbb
ccc
ccc
ccc
以降のコマンドは、すべてwc-testの中で実行します
memo.txtの3行目は空行で、4行目の単語の間には半角スペースを2つ・3つ入れています
-l (–lines)
行数(正確には改行の数)だけを表示するオプションです
wcのオプションの中で一番よく使うもので、ログの件数やファイルの数を数えるときに活躍します
wc△-l△access.log
実行結果:
8 access.log
# access.logは8行あることがわかります
# 長い形式のオプションで書いても同じ結果になる
wc△–lines△access.log
実行結果:
8 access.log
-w (–words)
単語数だけを表示するオプションです
空白(半角スペース・タブ・改行など)で区切られた文字のかたまりを1単語として数えます
wc△-w△memo.txt
実行結果:
12 memo.txt
# 3+6+0+3で12単語です(「lines,」のように記号が付いていても1単語です)
# 空白がいくつ続いても区切りは1つとして扱われる
echo△”apple△△banana△△△apple”△|△wc△-w
実行結果:
3
-c (–bytes)
バイト数だけを表示するオプションです
改行も1バイトとして数えるので、見た目の文字数より多くなることがあります
wc△-c△memo.txt
実行結果:
69 memo.txt
# 日本語のファイルのバイト数を数える
wc△-c△ja.txt
実行結果:
34 ja.txt
# UTF-8では日本語1文字が3バイトなので、文字数よりかなり多くなります
-m (–chars)
文字数だけを表示するオプションです
日本語のようなマルチバイト文字も1文字として数えますが、結果はロケール(言語の設定)によって変わります(詳しくは後の「-cと-mの違い」で説明します)
wc△-m△ja.txt
実行結果:
16 ja.txt
# 「こんにちは世界」7文字+「Linux入門」7文字+改行2つで16文字です
-L (–max-line-length)
一番長い行の長さ(表示幅)を表示するオプションです
POSIXの規格にはないオプションで(GNU版などで使えます)、日本語などの全角文字は幅2、タブは次のタブ位置(8の倍数)までの幅として数えます
wc△-L△access.log
実行結果:
58 access.log
# 一番長い行(/api/ordersの行)の長さが表示されます
# 全角文字は幅2として数えられる
wc△-L△ja.txt
実行結果:
14 ja.txt
# 「こんにちは世界」は7文字ですが、表示幅は14になります
# タブは次のタブ位置までの幅になる
printf△”a\tb\n”△|△wc△-L
実行結果:
9
# aの後のタブが8桁目まで進むので、bと合わせて幅9になります
–files0-from=F
数えるファイルの名前を、引数ではなくファイルFから読み込むオプションです(GNU版だけのオプション)
名前はNUL文字(\0)で区切って渡します
Fに-を指定すると標準入力から読み込むので、find△-print0と組み合わせると、ファイル名に空白や改行が入っていても安全に数えられます
# findで見つけた.txtファイルの行数をまとめて数える
find△docs△-name△”*.txt”△-print0△|△sort△-z△|△wc△-l△–files0-from=-
実行結果:
1 docs/a.txt
2 docs/b.txt
3 docs/sub/c.txt
6 total
# sort -zはNUL区切りのまま名前順に並べるために入れています
–total=WHEN
複数のファイルを数えたときの合計(total)行を、いつ表示するかを指定するオプションです(GNU版だけのオプションで、古いバージョンのwcにはありません)
WHENには、auto(ファイルが2つ以上のとき表示、既定値)、always(常に表示)、only(合計だけ表示)、never(表示しない)を指定できます
# 合計の行を表示しない
wc△-l△–total=never△memo.txt△access.log
実行結果:
4 memo.txt
8 access.log
# 合計だけを表示する
wc△-l△–total=only△memo.txt△access.log
実行結果:
12
# 「total」の文字も付かず、数字だけが表示されます
基本的な使い方
wcコマンドの基本的な構文は「wc△オプション△ファイル名」です
オプションを付けないと「行数 単語数 バイト数 ファイル名」の3つの数字が表示されます
ファイルを複数指定すると、最後に合計(total)の行が付きます
# 行数・単語数・バイト数をまとめて表示する
wc△memo.txt
実行結果:
4 12 69 memo.txt
# 左から4行、12単語、69バイトです
# 複数のファイルを指定する
wc△memo.txt△ja.txt△access.log
実行結果:
4 12 69 memo.txt
2 2 34 ja.txt
8 56 444 access.log
14 70 547 total
# 最後の行がすべてのファイルの合計です
# オプションを組み合わせる
wc△-lc△memo.txt
実行結果:
4 69 memo.txt
# オプションの順番を変えても、表示の順番は変わらない
wc△-cl△memo.txt
実行結果:
4 69 memo.txt
# 表示は常に「行数・単語数・文字数・バイト数・最大の行の長さ」の順です
標準入力から数える(ファイル名が出ない)
ファイル名を指定しないと、wcは標準入力(パイプやリダイレクト)から読み込んで数えます
この場合はファイル名がわからないので、結果に名前が表示されません
数字だけがほしいときに、この違いがとても役立ちます
# ファイル名を指定した場合
wc△-l△access.log
実行結果:
8 access.log
# リダイレクト(<)で渡した場合
wc△-l△<△access.log
実行結果:
8
# 数字だけが表示されます
# パイプで渡した場合
cat△access.log△|△wc△-l
実行結果:
8
数え方で注意したいポイント
wcの数字は「何を区切りとして数えているか」を知らないと、思っていた数と合わないことがあります
特につまずきやすい3つのポイントを紹介します
-c(バイト数)と-m(文字数)の違い
-cはバイト数、-mは文字数を数えます
半角英数字だけのファイルならどちらも同じ数になりますが、日本語が入ると結果が変わります
また、-mはロケールの設定に合わせて文字を判断するので、ロケールがC(英語のみ)のときは、日本語を1文字として扱えず、バイト数と同じ結果になります
# 半角英数字だけのファイル
wc△-c△memo.txt
実行結果:
69 memo.txt
wc△-m△memo.txt
実行結果:
69 memo.txt
# どちらも同じ69になります
# 日本語を含むファイル(この環境のロケールはC.UTF-8)
wc△-c△ja.txt
実行結果:
34 ja.txt
wc△-m△ja.txt
実行結果:
16 ja.txt
# ロケールをCにして文字数を数える
LC_ALL=C△wc△-m△ja.txt
実行結果:
34 ja.txt
# 日本語を文字として扱えないので、バイト数と同じ34になります
日本語の文字数を数えたいときは、ロケールがC.UTF-8やja_JP.UTF-8などのUTF-8になっているかを確認しましょう
最終行に改行がないと-lが1少なくなる
wc△-lは「行」ではなく「改行の数」を数えています
そのため、最終行の後ろに改行がないファイルでは、見た目の行数より1少ない結果になります
エディタの設定やプログラムによっては、最終行に改行を付けずに保存されることがあるので注意しましょう
# 事前準備:最終行に改行がないファイルを作る
printf△”line1\nline2\nline3″△>△nonl.txt
# cat -Aで行末を確認する
cat△-A△nonl.txt
実行結果:
line1$
line2$
line3
# 行末の改行は$で表示されます
# line3の後ろには$がないので、改行がありません
# 3行あるのに2と表示される
wc△-l△nonl.txt
実行結果:
2 nonl.txt
# grep -cなら最終行も1行として数えられる
grep△-c△””△nonl.txt
実行結果:
3
# grep -c “”は、すべての行にマッチさせて数を数える書き方です
-wの単語の区切り
-wは、半角スペース・タブ・改行などの空白で区切られたかたまりを1単語と数えます
空白がいくつ続いても区切りは1つとして扱われ、行頭や行末の空白は数えません
日本語の文章は単語の間に空白がないので、1行が丸ごと1単語として数えられます
# 空白やタブがいくつ続いても区切りは1つ
printf△”△△one△△△two\tthree△△\n\n△four\n”△|△wc△-w
実行結果:
4
# one・two・three・fourの4単語です
# 日本語の文章は空白がないので1行で1単語になる
wc△-w△ja.txt
実行結果:
2 ja.txt
# 全角スペースの扱いはロケールによって変わる
printf△”Linux 入門\n”△|△wc△-w
実行結果:
2
printf△”Linux 入門\n”△|△LC_ALL=C△wc△-w
実行結果:
1
# C.UTF-8では全角スペースも区切りになって2単語、Cでは区切りにならず1単語です
日本語の文章の文字数を知りたいときは、-wではなく-mを使いましょう
パイプと組み合わせた使い方
wcは、パイプ(|)で他のコマンドの結果を受け取って数える使い方がとても多いコマンドです
現場でよく使う組み合わせを紹介します
grepと組み合わせて件数を数える
grepで絞り込んだ行をwc△-lに渡すと、条件に合う行の数がわかります
grep△-cでも同じ数が出せますが、「行の数」と「出てきた回数」は違うので注意しましょう
# ERRORを含む行の数を数える
grep△ERROR△access.log△|△wc△-l
実行結果:
3
# grep -cでも同じ結果になる
grep△-c△ERROR△access.log
実行結果:
3
# 1行に2回出てくる単語の場合
grep△-c△apple△memo.txt
実行結果:
1
# appleを含む行は1行なので1になります
grep△-o△apple△memo.txt△|△wc△-l
実行結果:
2
# grep -oはマッチした部分を1つずつ1行で出力するので、出てきた回数(2回)が数えられます
ファイルの数を数える(ls・find)
lsやfindの結果をwc△-lに渡すと、ファイルの数を数えられます
ただし、lsは隠しファイル(.で始まるファイル)を表示しないことや、ls△-lは先頭に「total」の行が付くことなど、数え方にクセがあります
# 事前準備:docsの中に隠しファイルを作る
touch△docs/.hidden
ls△-A△docs
実行結果:
.hidden a.txt b.txt sub
# lsで数える(隠しファイルは数えない)
ls△docs△|△wc△-l
実行結果:
3
# a.txt・b.txt・subの3つです
# ls -Aで隠しファイルも含めて数える
ls△-A△docs△|△wc△-l
実行結果:
4
# ls -lで数えると、先頭のtotal行も数えてしまう
ls△-l△docs△|△wc△-l
実行結果:
4
# 3つしかないのに4になります
# findでサブディレクトリの中まで含めてファイルだけを数える
find△docs△-type△f△|△wc△-l
実行結果:
4
# a.txt・b.txt・sub/c.txt・.hiddenの4つです(findは隠しファイルも数えます)
# .txtのファイルだけを数える
find△docs△-type△f△-name△”*.txt”△|△wc△-l
実行結果:
3
# ディレクトリの数を数える(docs自身も含む)
find△docs△-type△d△|△wc△-l
実行結果:
2
ファイル名に改行が入っていると、wc△-lは1つのファイルを2行として数えてしまいます
めったにないケースですが、正確に数えたいときは、findの-printfで1ファイルにつき1文字を出力して、その文字数をwc△-cで数える方法があります(-printfはGNU版findの機能です)
# 事前準備:名前に改行を含むファイルを作る
touch△docs/$’bad\nname.txt’
ls△docs
実行結果:
a.txt b.txt ‘bad’$’\n”name.txt’ sub
# 端末ではlsが改行を$’\n’の形で表示してくれます
# lsとfindで数えると、実際より多くなる
ls△docs△|△wc△-l
実行結果:
5
find△docs△-type△f△|△wc△-l
実行結果:
6
# 名前に改行を含むファイルが2行として数えられるので、lsは4つのところが5、findは5つのところが6になります
# 1ファイルにつき「.」を1文字出力して数える
find△docs△-type△f△-printf△”.”△|△wc△-c
実行結果:
5
# 正しく5つと数えられます
# 練習用のファイルを削除する
rm△docs/$’bad\nname.txt’△docs/.hidden
sort・uniqと組み合わせてユニークな数を数える
sortで並べ替えてからuniqで重複をまとめ、wc△-lで数えると「何種類あるか」がわかります
ログに出てくるIPアドレスの種類を数えるときなどに便利です
# access.logの4列目(IPアドレス)を取り出す
awk△'{print△$4}’△access.log
実行結果:
192.168.0.10
192.168.0.11
192.168.0.25
192.168.0.10
192.168.0.31
192.168.0.10
192.168.0.11
192.168.0.25
# 重複をまとめてから数える
awk△'{print△$4}’△access.log△|△sort△|△uniq△|△wc△-l
実行結果:
4
# 8行のログに出てくるIPアドレスは4種類です
# sort -uでも同じ結果になる
awk△'{print△$4}’△access.log△|△sort△-u△|△wc△-l
実行結果:
4
# uniqは隣り合った重複しかまとめないので、先にsortで並べ替えるのがポイントです
数字だけを取り出して変数に入れる
シェルスクリプトで行数を変数に入れたいときは、wc△-l△<△ファイル名のようにリダイレクトで渡すのが定番です
wc△-l△ファイル名の形だと、ファイル名まで変数に入ってしまいます
# ファイル名を指定すると、ファイル名まで変数に入ってしまう
lines=$(wc△-l△access.log)
echo△”$lines”
実行結果:
8 access.log
# リダイレクトで渡すと数字だけが入る
lines=$(wc△-l△<△access.log)
echo△”access.logは${lines}行です”
実行結果:
access.logは8行です
# 数字なので計算にも使える
errors=$(grep△-c△ERROR△access.log)
echo△”エラーの割合は$((errors△*△100△/△lines))%です”
実行結果:
エラーの割合は37%です
# 8行中3行なので37%(シェルの計算は整数なので小数点以下は切り捨て)です
# 条件分岐に使う
if△[△”$errors”△-gt△0△];△then△echo△”ERRORが${errors}件あります”;△fi
実行結果:
ERRORが3件あります
wcコマンドの実践的な活用例
実際の現場でよく使われるwcコマンドの活用例をご紹介します
# 事前準備:10万行の大きなログを作る
seq△-f△”2026-11-01△batch△line△%g”△100000△>△big.log
# 大きなファイルを開かずに行数だけを確認する
wc△-l△big.log
実行結果:
100000 big.log
# 文字列のバイト数を数える(echoは最後に改行を付ける)
echo△”hello”△|△wc△-c
実行結果:
6
# hello(5バイト)+改行(1バイト)で6になります
# 改行を付けずに数える
echo△-n△”hello”△|△wc△-c
実行結果:
5
# 日本語の文字数を数える
echo△-n△”こんにちは”△|△wc△-m
実行結果:
5
# 複数のファイルを行数の多い順に並べる
wc△-l△*.txt△*.log△|△sort△-nr
実行結果:
100016 total
100000 big.log
8 access.log
4 memo.txt
2 nonl.txt
2 ja.txt
# 合計の行(total)が一番上に来ます
# 合計の行だけを取り出す
wc△-l△*.txt△*.log△|△tail△-n△1
実行結果:
100016 total
# サブディレクトリを含めた.txtファイルの合計行数を数える
find△docs△-name△”*.txt”△-exec△cat△{}△+△|△wc△-l
実行結果:
6
# 練習用のファイルを削除する
rm△big.log
トラブルシューティング
wcコマンドを使うときによくあるつまずきと、その解決方法です
「Is a directory」と表示される
wcにディレクトリを渡すと、「Is a directory」というエラーが表示されます
wc△-l△*のようにワイルドカードで指定したとき、ディレクトリが混ざっていると起きやすいエラーです
LC_ALL=C△wc△-l△docs
実行結果:
wc: docs: Is a directory
0 docs
# エラーと一緒に、0の行も表示されます
# LC_ALL=Cは英語のメッセージにするために付けています(日本語環境では、エラーメッセージが日本語で表示されることがあります)
# *にディレクトリ(docs)が混ざっている場合
LC_ALL=C△wc△-l△*
実行結果:
8 access.log
wc: docs: Is a directory
0 docs
2 ja.txt
4 memo.txt
2 nonl.txt
16 total
# ファイルは数えられますが、docsのところでエラーになります
# ファイルだけを指定する
wc△-l△*.txt△*.log
実行結果:
2 ja.txt
4 memo.txt
2 nonl.txt
8 access.log
16 total
# ディレクトリを渡さなければエラーになりません
ディレクトリの中のファイルをまとめて数えたいときは、前に紹介したfindと組み合わせる方法を使いましょう
「No such file or directory」と表示される
指定したファイルが存在しないときのエラーです
ファイル名のつづりや、今いるディレクトリ(pwdで確認できます)が正しいかを確認しましょう
LC_ALL=C△wc△-l△nofile.txt
実行結果:
wc: nofile.txt: No such file or directory
# 他のファイルと一緒に指定すると、存在するファイルだけ数えられる
LC_ALL=C△wc△-l△nofile.txt△access.log
実行結果:
wc: nofile.txt: No such file or directory
8 access.log
8 total
# エラーがあった場合、wcの終了ステータスは1になります
echo△$?
実行結果:
1
数字の前に空白が入る
wcは、複数の数字やファイルを表示するとき、桁をそろえるために数字の前に空白を入れます
そのため、結果をそのまま比較や計算に使うと、思わぬところでつまずくことがあります
数字だけがほしいときは、-lなどで1つの項目だけを指定し、リダイレクトかパイプで渡しましょう
# 複数のファイルを指定すると、桁がそろうように空白が入る
wc△-l△ja.txt△memo.txt△docs/sub/c.txt
実行結果:
2 ja.txt
4 memo.txt
3 docs/sub/c.txt
9 total
# パイプで渡して3つの数字を表示すると、空白が多く入る
cat△memo.txt△|△wc
実行結果:
4 12 69
# 1つの項目だけを指定すれば、数字だけになる
cat△memo.txt△|△wc△-l
実行結果:
4
# ファイル名付きの結果から数字だけを取り出す
wc△-l△access.log△|△awk△'{print△$1}’
実行結果:
8
まとめ
いかがでしたでしょうか
今回はwcコマンドについてまとめてみました
wcは、-lで行数、-wで単語数、-cでバイト数、-mで文字数を数えるシンプルなコマンドです
grep・find・sortなどとパイプで組み合わせると、エラー件数やファイル数、ユニークな数をすぐに数えられます
「-lは改行の数を数える」「-mはロケールで結果が変わる」「数字だけがほしいときはwc△-l△<△ファイル名」の3つを押さえておくと安心です
ぜひマスターしてください!
