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 总用量
即分别显示每个文件的字节数,最后一行是所有文件的总字节数。