「このファイル、何行あるんだろう?」「ログファイルのエラー行だけ数えたい…」——LinuxLinux [リナックス / ライナックス]オープンソースのOSカーネルで作業をしていると、ファイルの行数を知りたい場面は頻繁に訪れます。
Linuxでファイルの行数をカウントする最も基本的な方法は wc -l コマンド です。しかし、用途によっては grep -c や awk、sed を使い分けることで、より柔軟に行数を取得できます。
本記事では、Linux 行数 カウント の方法を、基本から応用まで体系的に解説します。この記事を読めば、どんな場面でも最適なコマンドを選んで、素早く行数を把握できるようになるでしょう。
記事のポイント
wc -lはファイルの行数をカウントする最も基本的かつ高速なコマンドです。grep -cを使えば、特定の文字列を含む行だけをカウントできます。awkやsedを使うと、空行の除外や複雑な条件付きカウントが可能です。findとwcを組み合わせれば、複数ファイルやディレクトリ全体の行数を一括集計できます。- パイプ(
|)を活用することで、コマンドの出力結果の件数も簡単に数えられます。
wc -l:Linuxで行数をカウントする基本コマンド
Linuxでファイルの行数をカウントする際、最初に覚えるべきコマンドが wc(Word Count) です。名前の通り「単語を数える」コマンドですが、-l オプションを付けることで、行数のカウントに特化した使い方ができます。
wc コマンドの基本的な使い方
wc コマンドは、ファイルの行数・単語数・バイト数を表示するLinuxの標準コマンドです。
$ wc sample.txt 44 120 980 sample.txt# ↑ ↑ ↑# 行数 単語数 バイト数オプションを指定しない場合は、「行数」「単語数」「バイト数」の3つが一度に表示されます。行数だけを知りたい場合は、次に説明する -l オプションを使います。
wc -l で行数だけを表示する
行数のみを取得する最もシンプルな方法です。
$ wc -l sample.txt44 sample.txtこの出力は「sample.txt は44行」であることを示しています。-l は line(行) の頭文字で、改行文字(\n)の数をカウントしています。
注意:
wc -lは厳密には「改行文字の数」をカウントしています。そのため、ファイル末尾に改行がない場合、最後の1行がカウントされないことがあります。この点については後述の「よくある疑問」で詳しく解説します。
wc コマンドの主要オプション一覧
wc コマンドには、行数以外にもさまざまな情報を取得するオプションがあります。
| オプション | 機能 | 使用例 |
|---|---|---|
-l | 行数を表示 | wc -l file.txt |
-w | 単語数を表示 | wc -w file.txt |
-c | バイト数を表示 | wc -c file.txt |
-m | 文字数を表示 | wc -m file.txt |
-L | 最長行の文字数を表示 | wc -L file.txt |
-c と -m の違い
-c(バイト数)と -m(文字数)は、ASCII文字のみのファイルでは同じ値になりますが、日本語などのマルチバイト文字を含む場合は異なる値になります。
注意:
wc -mでマルチバイト文字を正しくカウントするには、環境のロケール設定(LANG環境変数)がja_JP.UTF-8やC.UTF-8などの対応ロケールになっている必要があります。LANG=CやPOSIXロケールなどの場合、-mも-cと同じく単なる「バイト数」としてカウントされてしまうため注意してください。
$ echo "こんにちは" > japanese.txt$ wc -c japanese.txt16 japanese.txt # バイト数(UTF-8で1文字3バイト × 5 + 改行1バイト = 16)
$ wc -m japanese.txt6 japanese.txt # 文字数(5文字 + 改行1つ = 6)複数ファイルの行数を一度に確認する
wc -l にスペース区切りで複数のファイルを指定すると、各ファイルの行数と合計が表示されます。
$ wc -l file1.txt file2.txt file3.txt 10 file1.txt 25 file2.txt 30 file3.txt 65 totalワイルドカードを使えば、特定のパターンに一致するファイルをまとめてカウントすることもできます。
# カレントディレクトリの.txtファイルすべての行数を表示$ wc -l *.txt
# .logファイルすべての行数を表示$ wc -l *.logパイプと wc -l:コマンド出力の件数をカウントする
wc -l の真価は、他のコマンドと パイプ(|) で組み合わせたときに発揮されます。パイプを使うことで、コマンドの出力結果が「何行あるか(=何件あるか)」を簡単に数えることができます。
パイプの基本と wc -l の組み合わせ
パイプ(|)は、左側のコマンドの出力を右側のコマンドの入力に渡す仕組みです。
コマンドA | コマンドB# コマンドAの出力 → コマンドBの入力これを wc -l と組み合わせると、さまざまな場面で件数カウントが可能になります。
実用例:よく使うパイプ + wc -l パターン
ファイル・ディレクトリ数を数える
# カレントディレクトリのファイル・ディレクトリ数$ ls | wc -l12
# 隠しファイルを含めた数$ ls -a | wc -l15
# ファイルのみ(ディレクトリを除く)$ ls -l | grep "^-" | wc -l8実行中のプロセス数を数える
# 特定のプロセスが何個動いているかを確認$ ps aux | grep "nginx" | grep -v grep | wc -l4
# 全プロセス数を確認(結果からヘッダーの1行を引く必要があります)$ ps aux | wc -l128補足:
ps auxの出力には先頭にUSER PID %CPU...というヘッダー行が含まれるため、単純にwc -lでカウントすると実際のプロセス数より「1」多くなります。正確なプロセス数を知りたい場合は、結果から1を引いてください(以降のssコマンド等も同様です)。また、grep -v grepを挟むことで、grepコマンド自身のプロセスがカウントに含まれるのを防いでいます。
特定の条件でフィルタリングしたログの件数
# エラーログの件数を数える$ cat /var/log/syslog | grep "error" | wc -l23
# 今日の日付のログ行数$ grep "$(date '+%b %d')" /var/log/syslog | wc -l156ネットワーク接続数を数える
# 現在のTCP接続数(結果からヘッダーの1行を引く必要があります)$ ss -t | wc -l15
# ESTABLISHED状態の接続数(結果からヘッダーの1行を引く必要があります)$ ss -t state established | wc -l8cat file | wc -l と wc -l file の違い
行数をカウントする際、以下の2つの書き方がよく使われますが、微妙な違いがあります。
# 方法1: ファイルを直接指定$ wc -l sample.txt44 sample.txt
# 方法2: catでパイプに渡す$ cat sample.txt | wc -l44| 方法 | 出力形式 | 特徴 |
|---|---|---|
wc -l file | 44 sample.txt | ファイル名も表示される |
cat file | wc -l | 44 | 数値だけが表示される |
数値だけを取得したい場合(例:スクリプト内で変数に代入する場合)は、パイプを使う cat file | wc -l のほうが便利です。ただし、不要な cat の使用は「Useless Use of Cat」と呼ばれ、以下のように入力リダイレクトで代替できます。
$ wc -l < sample.txt44grep -c:条件に一致する行数をカウントする
特定のキーワードやパターンを含む行だけをカウントしたい場合は、grep -c が最適です。grep は「パターン検索」のコマンドで、-c オプション(count)を付けると、マッチした行数を返します。
grep -c の基本的な使い方
# "error" を含む行数をカウント$ grep -c "error" /var/log/syslog23
# "TODO" を含む行数をカウント(ソースコード内)$ grep -c "TODO" main.py5wc -l が「全行数」をカウントするのに対し、grep -c は「条件に合致する行数」をカウントするという点が大きな違いです。
大文字・小文字を区別しないカウント(-i オプション)
# "Error", "ERROR", "error" すべてをカウント$ grep -ci "error" /var/log/syslog31-c と -i(ignore case)を組み合わせることで、大文字・小文字の違いを無視してカウントできます。
条件に一致しない行数をカウント(-v オプション)
# 空行を除いた行数をカウント$ grep -vc "^$" sample.txt38
# コメント行を除いた行数をカウント(#で始まる行を除外)$ grep -vc "^#" config.conf12-v(invert match)は検索パターンに一致しない行を対象にします。これを -c と組み合わせると、「特定のパターン以外の行数」が得られます。
複数ファイルに対する grep -c
# 複数ファイルで "error" を含む行数を確認$ grep -c "error" *.logaccess.log:0error.log:23app.log:7複数ファイルを対象にした場合、ファイル名と一致行数がコロン区切りで表示されます。
grep -c と grep | wc -l の違い
一見同じ結果に見えますが、微妙な違いがあります。
# grep -c:マッチした行数を表示$ grep -c "pattern" file.txt3
# grep | wc -l:grepの出力行数をwcでカウント$ grep "pattern" file.txt | wc -l3通常は同じ結果になりますが、grep -c のほうが効率的です。パイプを使う方法は余分なプロセスが発生するためです。ただし、パイプを使う方法は grep の出力をさらに加工してからカウントしたい場合に便利です。
awk・sed:高度な条件で行数をカウントする
wc や grep では対応しきれない、より複雑な条件で行数をカウントしたい場合は、awk や sed を使います。
awk で行数をカウントする
awk はテキスト処理に特化した強力なコマンドです。組み込み変数 NR(Number of Records)を使うことで、行数を取得できます。
全行数をカウントする
$ awk 'END {print NR}' sample.txt44END ブロックは、すべての行を処理した後に実行されます。このとき NR にはファイルの最終行番号(=総行数)が入っています。
空行を除外してカウントする
# 方法1: フィールド数(単語数)が0より大きい行をカウント$ awk 'NF > 0 {count++} END {print count}' sample.txt38
# 方法2: 正規表現で空行以外をマッチ$ awk '/[^ \t]/ {count++} END {print count}' sample.txt38NF(Number of Fields)はその行のフィールド数(単語数)を表します。空行は NF が 0 になるため、NF > 0 で空行を除外できます。
特定の条件に合致する行をカウントする
# 3列目が100以上の行をカウント(CSVデータなど)$ awk -F',' '$3 >= 100 {count++} END {print count}' data.csv15
# 特定の文字列を含み、かつ数値条件も満たす行$ awk '/error/ && $5 > 500 {count++} END {print count}' access.log3awk は条件式を組み合わせられるため、単純な文字列マッチだけでは実現できない複雑なフィルタリングとカウントが可能です。
sed で行数をカウントする
sed(Stream Editor)はテキストの変換・編集を行うコマンドですが、行数のカウントにも使えます。
全行数をカウントする
$ sed -n '$=' sample.txt44$= は「最終行の行番号を表示する」という意味です。-n オプションで通常の出力を抑制し、行番号のみを表示します。
空行を削除してカウントする
$ sed '/^$/d' sample.txt | wc -l38/^$/d は「空行を削除する」というsedの命令です。削除後の結果を wc -l に渡すことで、空行を除いた行数が得られます。
コメント行と空行を同時に除外する
# #で始まるコメント行と空行を除外してカウント$ sed -e '/^#/d' -e '/^$/d' config.conf | wc -l25
# 空白のみの行も除外する場合$ sed -e '/^#/d' -e '/^[[:space:]]*$/d' config.conf | wc -l25-e オプションで複数の編集コマンドを指定できます。設定ファイルの実質的な設定行数を数えたい場合に便利です。
wc・grep・awk・sed の使い分け早見表
| 目的 | 推奨コマンド | コマンド例 |
|---|---|---|
| ファイルの全行数を知りたい | wc -l | wc -l file.txt |
| 特定の文字列を含む行数 | grep -c | grep -c "error" file.txt |
| 空行を除外した行数 | grep -vc | grep -vc "^$" file.txt |
| 複雑な条件でカウント | awk | awk 'NF>0 {n++} END{print n}' file.txt |
| コメント・空行を除外 | sed + wc | sed '/^#/d;/^$/d' file.txt | wc -l |
| コマンド出力の件数 | パイプ + wc -l | ls | wc -l |
複数ファイル・ディレクトリの行数を一括カウントする
プロジェクト全体のコード行数を調べたい場合や、特定の拡張子のファイルだけを対象に行数を数えたい場合は、find コマンドと wc を組み合わせます。
find + wc -l でディレクトリ内のファイルを一括カウント
# カレントディレクトリ以下の全 .py ファイルの行数を表示$ find . -name "*.py" -type f -exec wc -l {} + 50 ./src/main.py 120 ./src/utils.py 30 ./tests/test_main.py 200 totalfind コマンドの各オプションの意味は以下の通りです。
| オプション | 意味 |
|---|---|
. | 検索開始ディレクトリ(カレントディレクトリ) |
-name "*.py" | ファイル名のパターン |
-type f | ファイルのみ(ディレクトリを除外) |
-exec wc -l {} + | 見つかったファイルに wc -l を実行 |
特定の拡張子を複数指定してカウントする
# .py と .js ファイルの行数を集計$ find . -type f \( -name "*.py" -o -name "*.js" \) -exec wc -l {} +
# .java ファイルの合計行数のみ表示$ find . -name "*.java" -type f -exec cat {} + | wc -l1250-o は OR条件 を意味し、複数の拡張子を対象にできます。
特定のディレクトリを除外してカウントする
# node_modules と .git を除外してカウント$ find . -type f -name "*.js" \ -not -path "*/node_modules/*" \ -not -path "*/.git/*" \ -exec wc -l {} +
# vendor ディレクトリを除外して PHP ファイルをカウント$ find . -type f -name "*.php" \ -not -path "*/vendor/*" \ -exec wc -l {} +大規模なプロジェクトでは、依存ライブラリやバージョン管理ディレクトリを除外することで、自分たちが書いたコードの行数を正確に把握できます。
xargs を使った効率的なカウント
ファイル数が非常に多い場合、xargs を使うとより効率的に処理できます。
# 大量のファイルを効率的にカウント$ find . -name "*.txt" -type f | xargs wc -l
# ファイル名にスペースが含まれる場合の安全な方法$ find . -name "*.txt" -type f -print0 | xargs -0 wc -l-print0 と -0 の組み合わせは、ファイル名にスペースや特殊文字が含まれていても正しく処理するためのテクニックです。
よくある疑問とトラブルシューティング
Linuxで行数をカウントする際に、初心者がつまずきやすいポイントや、知っておくと便利な知識をまとめます。
wc -l で行数が1つ少なくカウントされる問題
wc -l は改行文字(\n)の数をカウントしています。そのため、ファイルの最終行に改行がない場合、その行はカウントされません。
# 末尾に改行がないファイル$ printf "line1\nline2\nline3" > no_newline.txt
# wc -l では2行と表示される(改行が2つしかない)$ wc -l no_newline.txt2 no_newline.txt
# awk なら正確に3行とカウントできる$ awk 'END {print NR}' no_newline.txt3正確な行数が必要な場合は、awk 'END {print NR}' の使用をおすすめします。
空行を含めたくない場合のカウント方法
設定ファイルやソースコードの「実質的な行数」を知りたい場合、空行を除外してカウントする方法です。除外したい「空行」の定義によって、適したコマンドが変わります。
# 方法1: grep -v で「完全に空(0文字)の行」を除外$ grep -vc "^$" file.txt
# 方法2: grep で「何らかの文字がある行」だけカウント(これも完全な空行のみ除外)$ grep -c "." file.txt
# 方法3: awk で「空白やタブだけの行」も含めて除外$ awk 'NF' file.txt | wc -l補足: 方法1と方法2は、スペースやタブといった空白文字だけが入っている行を「文字がある」とみなしてカウントに含めます。一方、方法3の
awk 'NF'は、空白文字だけで構成された行をフィールド数0と判定するため、完全に空の行だけでなく、見えない「空白行」も除外してカウントできます。
巨大ファイルの行数を高速にカウントしたい場合
数GBを超える巨大なログファイルの行数をカウントする場合、処理速度が重要になります。
# wc -l は最も高速(Cで実装されているため)$ wc -l huge_file.log
# 処理時間を計測する場合$ time wc -l huge_file.logwc -l はC言語で実装されており、内部的に最適化されているため、行数カウントにおいて最も高速です。awk や sed は柔軟性が高い分、wc よりは処理が遅くなる傾向があります。
標準入力から行数をカウントする場合
ファイルではなく、コマンドの出力や対話的な入力から行数を数えたい場合の方法です。
# ヒアドキュメントから行数をカウント$ wc -l <<EOFline1line2line3EOF3
# 変数に格納された文字列の行数$ text="line1line2line3"$ echo "$text" | wc -l3まとめ:Linuxでの行数カウントをマスターしよう
本記事では、Linuxでファイルの行数をカウントするさまざまな方法を解説しました。最後に、各コマンドの特徴と使い分けを整理します。
コマンド別の特徴まとめ
| コマンド | 速度 | 柔軟性 | 主な用途 |
|---|---|---|---|
wc -l | ★★★ | ★☆☆ | ファイル全体の行数カウント |
grep -c | ★★★ | ★★☆ | 条件に一致する行数のカウント |
awk | ★★☆ | ★★★ | 複雑な条件付きカウント |
sed | ★★☆ | ★★☆ | テキスト変換と組み合わせたカウント |
find + wc | ★★☆ | ★★★ | 複数ファイル・ディレクトリの一括カウント |
目的別クイックリファレンス
迷ったときは、以下を参考にしてください。
- 「ファイルが何行あるか知りたい」 →
wc -l file.txt - 「エラーが何件あるか数えたい」 →
grep -c "error" file.txt - 「空行を除いた行数が知りたい」 →
grep -vc "^$" file.txt - 「プロジェクト全体のコード行数を把握したい」 →
find . -name "*.py" -exec wc -l {} + - 「コマンドの結果が何件あるか知りたい」 →
command | wc -l
Linuxでの行数カウントは、wc -l という一つのコマンドから始まりますが、grep、awk、sed、find と組み合わせることで、あらゆる場面に対応できるようになります。ぜひ日々の作業で積極的に活用し、Linuxスキルを向上させていきましょう。
以上で本記事の解説を終わります。
よいITライフを!
人気記事
- 1
- 2
- 3
- 4
- 5
Rocky Linux対応。実際にWebサーバーを公開するまでのプロセスを体験できる、最も確実で実践的なガイドブックです。