まず結論:行数・バイト数・文字数は1コマンドで同時に取得できる
ログファイルやSQLダンプ、CSVを扱う現場では、「中身を開く前にまず行数とサイズを把握したい」という場面が頻繁にあります。wcコマンドにファイル名を渡すだけで、行数・単語数・バイト数が一度に取得できます。
wc 対象ファイル名
実行例:
$ wc access.log
38420 345876 4123891 access.log
左から順に行数・単語数・バイト数・ファイル名です。多くの実務では「行数」と「バイト数」が特に重要で、それぞれ専用オプションで取り出せます。
目的別オプションの使い方
行数だけを取り出す(-l)
CSVやログの件数確認など「行数だけほしい」場面に使います。
$ wc -l access.log
38420 access.log
スクリプト内で件数を変数に格納したい場合は、リダイレクトでファイルを渡すと数値だけを取得できます。
LINE_COUNT=$(wc -l < access.log)
echo "行数: ${LINE_COUNT}"
<でファイルを渡すとファイル名が出力に混入せず、数値だけが変数に入ります。シェルスクリプトで件数チェックをするときの定番パターンです。
バイト数(ファイルサイズ)を確認する(-c)
転送前のサイズ確認や、処理前後のサイズ比較に使います。
$ wc -c access.log
4123891 access.log
バイト単位で表示されます。人が読みやすい単位(KB・MB)で確認したい場合はls -lhやdu -shが便利ですが、スクリプト内でバイト数を数値として比較・演算するにはwc -cが適しています。
文字数を数える(-m):日本語ファイルに必須
日本語などマルチバイト文字が含まれるファイルで「バイト数ではなく文字数を数えたい」場合は-mを使います。
$ wc -m message.txt
1024 message.txt
-cはバイト数、-mは文字数(コードポイント単位)です。UTF-8環境では日本語1文字が3バイトを消費するため、-cと-mの値は大きく異なります。文字数制限チェックなどには必ず-mを使ってください。
パイプと組み合わせた実務活用
wcの真価はパイプとの組み合わせにあります。条件に合う行を絞り込んでからカウントするというパターンが、現場で特に頻出します。
エラーログの件数を瞬時に確認する
# ERROR を含む行数をカウント(grep -c が最短)
grep -c "ERROR" app.log
# 後段にさらにフィルタを追加したい場合
grep "ERROR" app.log | grep "timeout" | wc -l
grep -cはシンプルなカウントに最適ですが、フィルタを複数段階でかけたい場合はgrep | wc -lの形が柔軟です。ある監視スクリプトの現場では、直近1時間のエラー件数が閾値を超えたらアラートを飛ばすロジックをこのパターンで実装していました。
プロセス数・TCP接続数を確認する
# 現在の nginx プロセス数
ps aux | grep nginx | grep -v grep | wc -l
# ESTABLISHED な TCP 接続数(ss は netstat の後継)
ss -tn state established | tail -n +2 | wc -l
netstatは多くのディストリビューションでデフォルトインストールされなくなっており、現在はssコマンドが標準です。tail -n +2でヘッダ行を除外してからカウントするのがポイントです。
systemd ジャーナルのログ件数を数える
# 今日の sshd のログ件数
journalctl -u sshd --since today --no-pager | wc -l
# 直近1時間の ERROR レベルのログ件数
journalctl -p err --since "1 hour ago" --no-pager | wc -l
systemd 環境ではログがjournalctlに集約されています。--no-pagerを付けないと対話モードになるため、パイプ接続時は必須です。
find の結果をカウントする
# /var/log 以下の .log ファイル数を数える
find /var/log -name "*.log" -type f | wc -l
# 7日以上更新されていないログファイル数
find /var/log -name "*.log" -type f -mtime +7 | wc -l
複数ファイルをまとめて集計する
引数に複数のファイルを渡すと、ファイルごとの集計に加えて合計行が自動で追加されます。
$ wc -l /var/log/syslog /var/log/auth.log /var/log/kern.log
12345 /var/log/syslog
3210 /var/log/auth.log
876 /var/log/kern.log
16431 total
ワイルドカードを使えばディレクトリ内の複数ファイルをまとめて集計できます。
# /var/log 直下の全ログファイルの行数合計
wc -l /var/log/*.log
よくある落とし穴と注意点
末尾に改行がないファイルは行数が1少なく見える
wc -lは改行文字(\n)の数を数えます。ファイル末尾に改行がない場合、最終行はカウントされません。3行のデータがあってもファイル末尾に改行がなければwc -lは2を返します。スクリプトで行数を厳密に扱う場合は事前に確認してください。
# 末尾に改行があるか確認(0a が改行コード)
tail -c 1 ファイル名 | xxd
巨大ファイルへの実行は完了まで時間がかかる
wc -lはファイルを先頭から末尾まで全走査します。数GB以上のログファイルに対して実行すると、完了まで数十秒〜数分かかることがあります。事前にls -lhでサイズを確認し、巨大ファイルには余裕をもって実行してください。処理を中断したい場合は Ctrl+C で停止できます。
-cと-mの混同に注意(UTF-8環境)
現代のLinuxディストリビューションはUTF-8がデフォルトのロケールです。-cはバイト数、-mは文字数(マルチバイト対応)と覚えておいてください。ロケールがCやPOSIXに設定されている環境では-mも-cと同じバイト数を返すため、混乱のもとになります。
# 現在のロケール確認
locale
# ロケールを明示して文字数確認
LANG=ja_JP.UTF-8 wc -m message.txt
ロケールに依存したくない場合は、python3 -c "print(len(open('message.txt').read()))"のようにスクリプト言語側で文字数を取得する方法も選択肢に入ります。
「コマンドは打てる。次は"現場で通用する型"を最短で身につけたい」——そんなあなたへ。
ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。
>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)
※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。
