wc オプション ファイル名
またはパイプの形式でcat ファイル名 | wc オプション
のようにして、行数や文字数などを数える。
ファイルの行数を数えるのなら、パイプを使わずにファイル名をパラメータに渡したほうが速い。他のコマンドの出力を数えるにはパイプの形式を使う。
ファイル名を引数で渡す場合は複数のファイル名を渡すこともできる。その場合は合計ではなく、ファイルごとに数えてくれる。
行数はあくまで改行の数を数えているにすぎないことに注意。最後に改行のない行があった場合はその行がカウントされない。
Coreutilsというパッケージに入っているので、CentOSにもUbuntuにも始めから入っている。
-c
,--bytes
--help
-l
,--lines
"1\n2\n"
は2行と数えるが、"1\n2"
は1行と数える。改行が1つもないと中身が存在しても0行と数える。-m
,--chars
--version
--
というパラメータを渡すとそれ以降のパラメータをオプションではなくファイル名とみなしてくれるので、-
で始まるファイル名を扱いたい場合に使うとよい。
カレントディレクトリの中にサブディレクトリがなくてファイルしかない場合は
$ wc -l *
これで、最後の行に合計の行数が表示される。
Perlでは$.
という暗黙の変数が便利。$.
は最後に読み込んだファイルハンドルの現在の行番号を表す。以下のように使える。
$ perl -nle 'END {print $.}'
$ grep -c '' foo.txt
わずかにwc -l
のほうが速い。一行がとても長いファイルだと、wc -l
のほうが5倍以上速いケースもあり、行数を数えるだけであればわざわざgrep
を使う必要性はほとんどない。
grep -c ''
もwc -l
もほとんどはIOに時間がかかる。CPUの使用量はgrep
のほうが多い。
ただ、2つのコマンドはカウント結果が異なる場合がある。最後の行に改行が含まれない場合、wc -l
では最後の行をカウントしないが、grep -c ''
では最後の行もカウントする。wc -l
は実際には行数ではなく改行の数を数えているためである。
なお、正規表現にマッチする行のみの行数をカウントする場合は
$ grep PATTERN foo.txt | wc -l
よりも
$ grep -c PATTERN foo.txt
のほうが速い。
つまりサロゲートペアになる文字は2文字とカウントさせるには、UTF-16に変換してそのバイト数を2で割ればよい。
$ cat foo.txt | iconv -f UTF-8 -t UTF-16 | wc --bytes | perl -nle 'print $_/2'## または$ cat foo.txt | iconv -f UTF-8 -t UTF-16 | wc --bytes | awk '{print $1/2}'