17. Linux wc命令

wcword 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 filecat命令用于读取file文件的内容,并将内容输出到标准输出(屏幕)。
  • |:管道符,将前一个命令(cat file)的输出结果传递给后一个命令作为输入。
  • wc -lwc是统计命令,-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 总用量

即分别显示每个文件的字节数,最后一行是所有文件的总字节数。

相关推荐
A小辣椒11 小时前
TShark:Wireshark CLI 功能
linux
A小辣椒15 小时前
TShark:基础知识
linux
AlfredZhao17 小时前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao1 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334662 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪2 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush42 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5202 天前
Linux 11 动态监控指令top
linux
不会C语言的男孩2 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言