[Linux] ファイルの行数や文字数をカウントする - wc

ファイルの文字数や行数を簡単にカウントできるのがwcコマンドです。 恐らく「Word Count」の略称で、ワールドカップでもトイレでもありませんw

以下のように調査したいファイルのパスを渡すと、ファイルの行数、単語数、バイト数を表示してくれます。

$ wc Linux*.md
      45      86    2384 Linuxの使い方.md
     392    1223   12589 Linuxコマンド.md
      17      17     343 Linux上のアカウント.md
     454    1326   15316 total

注意点として、ファイルの文字コードはUTF-8、改行コードをLFにしておくと安全に(正しく)集計が行えます。

利用方法

行数を調べる

-lオプションで行数をカウントできます。

$ wc -l Linuxの使い方.md
      45 Linuxの使い方.md

パイプを利用すれば、直前のコマンドの実行結果の行数のカウントも可能です。

$ ls -1 . | wc -l

バイト数を調べる

ファイル容量を調べるには-cオプションを利用します。

$ wc -c Linuxの使い方.md
    2384 Linuxの使い方.md

文字数を調べる

文字数を調べるには-mオプションを利用します。日本語などのマルチバイトに対応していますが、文字コードをUTF-8にしておく必要があります。

$ wc -m Linuxの使い方.md
    1240 Linuxの使い方.md

また対応していないロケールでは-cと同じ意味になるそうです。(macOSのman wcより)

-m The number of characters in each input file is written to the standard output. If the current locale does not support multibyte characters, this is equivalent to the -c option. This will cancel out any prior usage of the -c option.

その他

警告が表示され集計結果がおかしい

時折、以下のような警告をwcが吐くことがあります。値は出ているのでカウント自体はしてくれるのですがちょっと気持ち悪いですね。というかよく見ると文字数も正確にカウントしてくれてないようです。

$ cat a.txt 
あいうえお
かきくけこ
さしすせそ

$ wc -m a.txt
wc: a.txt: Illegal byte sequence
      36 a.txt

この現象はどうやら以下の条件下で発生するようです。

  • 日本語が含まれる(マルチバイト)
  • UTF-8以外のエンコード(ShiftJISなど)
  • Windowsの改行コード(CR+LF)

というわけで、文字コードをUTF-8に変換しつつ、改行コードをLinuxやmacOSなどで利用されるLFに変換してやると警告が出なくなります。

$ nkf -w80 -Lu a.txt | wc -m
      18

そもそもUTF-8でないと正確に集計できないようですので、文字コードの確認はお忘れなきよう。

blog.katsubemakito.net blog.katsubemakito.net