wc默认统计文件的行数、单词数和字节数;支持-l、-w、-c等参数精准输出;-l对无换行结尾文件少计1行;递归统计需find配合-exec +;流式处理高效,但-w比-l慢。

统计单个文件的行数、单词数和字节数
wc 默认行为就是一次性输出三列:行数、单词数、字节数(注意不是字符数,含换行符)。直接跟文件路径即可:
wc /etc/hosts
输出类似 21 128 947 /etc/hosts —— 分别对应行、词、字节。如果只传 -(短横线),它会从标准输入读,比如 ps aux | wc 统计进程列表总行数。
只统计行数或只统计单词数
加参数能精准控制输出项,避免多余信息干扰脚本解析:
-
wc -l filename:只输出行数(末尾带空格和文件名) -
wc -w filename:只输出单词数 -
wc -c filename:只输出字节数(-m才是字符数,但需 locale 支持 Unicode)
注意:wc -l 对“最后一行没换行符”的文件会少算 1 行——这是 POSIX 定义,不是 bug。比如 echo -n "hello" | wc -l 输出 0。
递归统计目录下所有 .log 文件的总行数
wc 本身不支持递归,得靠 find 配合:
find /var/log -name "*.log" -type f -exec wc -l {} +
关键点:
- 用
-exec ... +而非\;,减少进程调用次数,性能更好 - 结尾的
total行是wc自动汇总的,但仅当多个文件时才出现;单文件无此行 - 如果只想看总数(不含各文件明细),加
| tail -n1提取最后一行
别用 find ... | xargs wc -l——遇到含空格路径会出错,-exec ... + 更健壮。
处理大文件时避免卡死或内存溢出
wc 是流式处理,一般不占内存,但某些场景仍需小心:
- 对超大日志(如 50GB+),
wc -l依然快,但wc -w会更慢——因为要逐字符切分单词,受 locale 影响大 - 若只需行数且文件确定以
\n结尾,grep -c "^" file可能更快(但不等价,空行也算) - 管道中慎用
wc -l做条件判断,比如[ $(wc -l <file>,若 <code>file不存在,命令会报错并返回非零退出码,脚本可能意外中断
真正容易被忽略的是:不同系统上 wc 对“单词”的定义可能不一致——GNU 版本按空白符分割,而 BusyBox 的 wc 在嵌入式设备里可能行为略有差异,自动化脚本里若依赖 -w,务必在目标环境实测。










