wc(word count )是 Linux / Unix 中非常常用的一个文本处理命令,
名字虽然是"word count",但它其实可以统计:
- 行数(lines)
- 单词数(words)
- 字符数(characters)
- 字节数(bytes)
下面我们系统、详细地学习它👇
🧩 一、基本语法
bash
wc [选项] [文件名]
如果不加选项,wc 会默认输出:
行数 单词数 字节数 文件名
🧠 二、常用选项说明
| 选项 | 含义 | 示例 | 输出说明 |
|---|---|---|---|
-l |
只统计行数(line) | wc -l file.txt |
仅输出行数 |
-w |
只统计单词数(word) | wc -w file.txt |
仅输出单词数量 |
-c |
统计字节数(byte) | wc -c file.txt |
以字节为单位统计文件大小 |
-m |
统计字符数(character) | wc -m file.txt |
适用于多字节字符(UTF-8) |
-L |
统计最长行的长度(longest line) | wc -L file.txt |
输出最长一行的字符数 |
📘 三、基础示例
假设有文件 text.txt:
Hello world
Linux is powerful
Shell script
执行:
bash
wc text.txt
输出:
3 5 41 text.txt
解释:
| 数字 | 含义 |
|---|---|
| 3 | 行数 |
| 5 | 单词数 |
| 41 | 字节数 |
只统计行数:
bash
wc -l text.txt
输出:
3 text.txt
只统计单词数:
bash
wc -w text.txt
输出:
5 text.txt
只统计字符数(区分字节 vs 字符):
bash
wc -m text.txt
wc -c text.txt
如果文件是 UTF-8 多字节字符(比如中文),
-m 和 -c 结果会不一样。
🌍 四、处理中文与多字节文件
假设 chinese.txt 内容是:
你好 世界
bash
wc -c chinese.txt # 字节数
wc -m chinese.txt # 字符数
输出可能是:
12 chinese.txt # 每个中文占3字节(UTF-8)
4 chinese.txt # 4个字符(你好+空格+世界)
⚙️ 五、从标准输入读取(无文件)
wc 不仅能统计文件,还能直接统计 管道(stdin) 数据。
示例1:统计输出行数
bash
ls | wc -l
👉 统计当前目录中有多少行(即文件/目录数量)。
示例2:统计命令输出字数
bash
echo "I love Linux shell scripting" | wc -w
输出:
5
🔁 六、结合管道的常见技巧
| 任务 | 命令 | 说明 |
|---|---|---|
| 统计文件行数 | `cat file | wc -l` |
| 统计某用户进程数 | `ps -u $USER | wc -l` |
| 统计日志行数 | `grep "error" logfile | wc -l` |
| 统计配置文件中非空行 | `grep -v '^$' config.txt | wc -l` |
(1)cat file | wc -l
这条命令的作用是统计file文件的总行数(包括空行),各部分含义如下:
cat file:cat命令用于读取file文件的内容,并将内容输出到标准输出(屏幕)。|:管道符,将前一个命令(cat file)的输出结果传递给后一个命令作为输入。wc -l:wc是统计命令,-l选项表示"统计行数",这里会统计从管道接收的内容(即file的所有内容)的总行数。
最终结果:输出file文件包含的总行数(例如,若文件有10行内容,包括空行,会输出10)。
(2) ps -u $USER | wc -l
这条命令的作用是统计当前用户($USER对应的用户)运行的进程总数(包含标题行),各部分含义如下:
-
ps -u $USER:ps是用于查看系统进程的命令;-u $USER表示"只显示指定用户的进程",其中$USER是环境变量,代表当前登录的用户名(比如你的用户名是"test",则等价于ps -u test);
这部分命令会输出当前用户所有进程的信息,包括一行标题行(如PID TTY TIME CMD,表示进程ID、终端、运行时间、命令名等列名)和各个进程的具体行。
-
|:管道符,将前一个命令(ps -u $USER)的输出结果传递给后一个命令作为输入。 -
wc -l:统计输入内容的行数(-l是"行数统计"选项)。
最终结果说明:
输出的数字 = 当前用户实际运行的进程数 + 1(标题行)。例如,若当前用户有8个进程,ps -u $USER 会输出9行(8行进程+1行标题),则命令结果为9。
(3) grep "error" logfile | wc -l
这条命令的作用是统计logfile文件中包含"error"字符串的行的总数,各部分含义如下:
-
grep "error" logfile:grep用于在文件中搜索匹配指定模式的行,这里的"error"是要搜索的字符串(不区分大小写,若需区分可加-i选项)。- 作用是:从
logfile文件中筛选出所有包含"error"的行(整行只要出现"error"就会被保留)。
-
|:管道符,将前一个命令(grep)的输出结果作为后一个命令的输入。 -
wc -l:wc是统计命令,-l选项表示"统计行数"。- 作用是:统计前一步筛选出的"包含error的行"的总数量。
最终结果:输出logfile中包含"error"的行的具体数量(例如,若有5行含"error",则输出5)。
(4) grep -v '^$' config.txt | wc -l
这条命令的作用是统计config.txt文件中非空行的行数,各部分含义如下:
-
grep -v '^$' config.txt:grep用于文本搜索,-v表示"反向匹配"(即输出不匹配模式的行)。'^$'是正则表达式,^代表行首,$代表行尾,两者结合表示"空行"(行首到行尾之间没有任何字符)。
因此,这部分命令的作用是:从config.txt中过滤掉所有空行,只保留非空行。
-
|:管道符,将前一个命令的输出作为后一个命令的输入。 -
wc -l:wc是"字数统计"命令,-l选项表示"统计行数"。
因此,这部分会统计前一步过滤后得到的非空行的总数量。
最终结果:输出config.txt文件中非空行的具体行数。
🧮 七、与 find 结合
统计目录中所有文件的总行数:
bash
find . -type f -name "*.sh" -exec cat {} + | wc -l
统计所有 .log 文件的总字节数:
bash
find . -name "*.log" -exec cat {} + | wc -c
🧩 八、与 awk 区别
| 工具 | 优点 | 缺点 |
|---|---|---|
wc |
快、简单、系统命令 | 无法过滤、处理复杂逻辑 |
awk |
可条件筛选统计 | 稍复杂但更灵活 |
例如:
bash
awk '{lines++; words+=NF; chars+=length($0)} END {print lines, words, chars}' file.txt
等价于 wc file.txt。
🧠 九、文件统计对比实例
假设:
$ cat sample.txt
Hello world
Bash shell
Script test
执行:
| 命令 | 输出 | 含义 |
|---|---|---|
wc sample.txt |
3 6 36 sample.txt |
3 行,6 单词,36 字节 |
wc -l sample.txt |
3 sample.txt |
3 行 |
wc -w sample.txt |
6 sample.txt |
6 单词 |
wc -m sample.txt |
36 sample.txt |
36 字符 |
⚡ 十、统计多个文件
bash
wc file1.txt file2.txt
输出示例:
10 45 210 file1.txt
20 89 415 file2.txt
30 134 625 total
最后一行 "total" 表示合计结果。
🧩 十一、总结表
| 任务 | 命令 | 示例输出 |
|---|---|---|
| 行数 | wc -l file |
35 file |
| 单词数 | wc -w file |
212 file |
| 字节数 | wc -c file |
1234 file |
| 字符数(含中文) | wc -m file |
428 file |
| 最长行长度 | wc -L file |
83 file |
| 多文件合计 | wc file1 file2 |
带 total 汇总行 |
💡 十二、技巧小结
| 用法 | 命令 | 说明 |
|---|---|---|
| 统计行数最简写 | wc -l < file |
从标准输入统计行数 |
| 统计日志中错误行数 | `grep error /var/log/syslog | wc -l` |
| 统计当前文件总大小 | `find . -type f | xargs wc -c` |
| 统计 shell 脚本行数 | `find . -name "*.sh" | xargs cat |
find . -type f | xargs wc -c
这条命令的作用是查找当前目录及其子目录下的所有普通文件,并分别统计每个文件的字节数(文件大小),最后输出所有文件的总字节数,各部分含义如下:
-
find . -type f:find是用于查找文件/目录的命令;.表示"当前目录"(搜索起点);-type f表示"只查找普通文件"(排除目录、符号链接、设备文件等);
这部分命令会输出当前目录及所有子目录中,所有普通文件的完整路径(如./docs/note.txt、./src/main.py等)。
-
|:管道符,将前一个命令(find)输出的文件路径传递给后一个命令作为输入。 -
xargs wc -c:xargs用于将前一个命令的输出(文件路径列表)转换为后续命令的参数(避免因文件过多导致命令行参数过长的问题);wc -c是统计命令,-c选项表示"统计文件的字节数"(即文件大小,单位为字节);
这部分会接收find找到的所有文件路径,逐个统计每个文件的字节数,最后在末尾输出所有文件的总字节数。
最终结果示例:
假设当前目录及子目录下有 a.txt(100字节)、b.jpg(2000字节)两个文件,命令输出类似:
100 ./a.txt
2000 ./b.jpg
2100 总用量
即分别显示每个文件的字节数,最后一行是所有文件的总字节数。