wc命令详解
wc
(Word Count)是Linux系统中用于统计文本的重要工具,可以统计文件或输入流中的行数、字数、字符数和字节数。
基本语法
wc [选项] [文件...]
主要选项
基本统计选项
-l, --lines
- 统计行数-w, --words
- 统计单词数-c, --bytes
- 统计字节数-m, --chars
- 统计字符数(支持多字节字符)-L, --max-line-length
- 显示最长行的长度
输出控制选项
--files0-from=F
- 从文件F读取以NUL分隔的文件名列表--total=WHEN
- 何时显示总计(always, auto, never)
默认行为
当不指定任何选项时,wc
会显示行数、单词数、字节数:
$ wc filename
10 50 300 filename
# 行数 单词数 字节数 文件名
基本使用示例
单个文件统计
# 显示所有统计信息(行数、单词数、字节数)
wc filename.txt
# 只统计行数
wc -l filename.txt
# 只统计单词数
wc -w filename.txt
# 只统计字符数
wc -m filename.txt
# 只统计字节数
wc -c filename.txt
# 显示最长行的长度
wc -L filename.txt
多个文件统计
# 统计多个文件并显示总计
wc file1.txt file2.txt file3.txt
# 只统计行数,多个文件
wc -l *.txt
# 统计目录下所有文件
wc /var/log/*.log
标准输入统计
# 从标准输入读取并统计
echo "Hello World" | wc -w
# 统计命令输出的行数
ps aux | wc -l
# 统计当前目录下的文件数量
ls | wc -l
# 统计代码行数
cat *.c | wc -l
实际应用场景
代码统计
# 统计项目中所有C语言代码行数
find . -name "*.c" -o -name "*.h" | xargs wc -l
# 统计不同语言的代码行数
echo "C/C++文件:" && find . -name "*.c" -o -name "*.cpp" -o -name "*.h" | xargs wc -l | tail -1
echo "Python文件:" && find . -name "*.py" | xargs wc -l | tail -1
echo "Java文件:" && find . -name "*.java" | xargs wc -l | tail -1
# 统计项目总代码行数(排除空行和注释)
find . -name "*.c" -o -name "*.h" | xargs cat | grep -v '^$' | grep -v '^\s*//' | wc -l
日志分析
# 统计日志文件行数
wc -l /var/log/messages
# 统计错误日志数量
grep "ERROR" /var/log/application.log | wc -l
# 统计今天的日志行数
grep "$(date '+%Y-%m-%d')" /var/log/access.log | wc -l
# 统计不同级别日志的数量
echo "错误日志: $(grep -i error /var/log/messages | wc -l)"
echo "警告日志: $(grep -i warning /var/log/messages | wc -l)"
echo "信息日志: $(grep -i info /var/log/messages | wc -l)"
系统监控
# 统计当前进程数
ps aux | wc -l
# 统计网络连接数
netstat -an | wc -l
# 统计登录用户数
who | wc -l
# 统计某个用户的进程数
ps aux | grep username | wc -l
# 统计系统服务数量
systemctl list-units --type=service | wc -l
文件内容分析
# 统计配置文件中的有效配置行(非注释和空行)
grep -v '^#' /etc/config.conf | grep -v '^$' | wc -l
# 统计CSV文件的记录数(减去标题行)
tail -n +2 data.csv | wc -l
# 统计文本中的段落数(以空行分隔)
grep -c '^$' document.txt
# 统计文件中某个单词的出现次数
grep -o "word" textfile.txt | wc -l
高级用法和技巧
组合命令统计
# 统计目录中所有文件的总行数
find /path/to/directory -type f -name "*.txt" -exec cat {} \; | wc -l
# 统计压缩文件中的内容
zcat file.gz | wc -l
gunzip -c file.gz | wc -l
# 统计远程文件内容
curl -s http://example.com/file.txt | wc -l
# 统计数据库查询结果行数
mysql -u user -p database -e "SELECT * FROM table;" | wc -l
实用脚本示例
#!/bin/bash
# file_stats.sh - 文件统计脚本
FILE=${1:-""}
if [ -z "$FILE" ]; then
echo "用法: $0 <文件名>"
exit 1
fi
if [ ! -f "$FILE" ]; then
echo "错误: 文件 '$FILE' 不存在"
exit 1
fi
echo "文件统计报告: $FILE"
echo "========================="
echo "文件大小: $(ls -lh $FILE | awk '{print $5}')"
echo "总行数: $(wc -l < $FILE)"
echo "总单词数: $(wc -w < $FILE)"
echo "总字符数: $(wc -m < $FILE)"
echo "总字节数: $(wc -c < $FILE)"
echo "最长行长度: $(wc -L < $FILE)"
echo "空行数: $(grep -c '^$' $FILE)"
echo "非空行数: $(grep -c -v '^$' $FILE)"
# 计算平均行长度
if [ "$(wc -l < $FILE)" -gt 0 ]; then
avg_length=$(echo "scale=2; $(wc -c < $FILE) / $(wc -l < $FILE)" | bc)
echo "平均行长度: $avg_length 字符"
fi
批量文件统计
#!/bin/bash
# batch_stats.sh - 批量统计脚本
echo "目录文件统计报告"
echo "=================="
total_files=0
total_lines=0
for file in *.txt; do
if [ -f "$file" ]; then
lines=$(wc -l < "$file")
words=$(wc -w < "$file")
chars=$(wc -c < "$file")
printf "%-20s %8d 行 %8d 词 %8d 字节\n" "$file" "$lines" "$words" "$chars"
((total_files++))
((total_lines += lines))
fi
done
echo "=================="
echo "总计: $total_files 个文件, $total_lines 行"
性能监控脚本
#!/bin/bash
# log_monitor.sh - 日志增长监控
LOG_FILE="/var/log/application.log"
INTERVAL=60 # 检查间隔(秒)
echo "开始监控日志文件: $LOG_FILE"
# 记录初始行数
prev_lines=$(wc -l < "$LOG_FILE" 2>/dev/null || echo 0)
while true; do
sleep $INTERVAL
current_lines=$(wc -l < "$LOG_FILE" 2>/dev/null || echo 0)
diff_lines=$((current_lines - prev_lines))
if [ $diff_lines -gt 0 ]; then
echo "$(date): 新增 $diff_lines 行日志 (总计: $current_lines 行)"
# 如果日志增长过快,发出警告
if [ $diff_lines -gt 1000 ]; then
echo "警告: 日志增长过快!"
fi
fi
prev_lines=$current_lines
done
字符编码考虑
多字节字符处理
# UTF-8文件的字符统计
wc -m utf8_file.txt # 字符数
wc -c utf8_file.txt # 字节数
# 比较字符数和字节数的差异
echo "字节数: $(wc -c < file.txt)"
echo "字符数: $(wc -m < file.txt)"
# 检查文件是否包含非ASCII字符
if [ "$(wc -c < file.txt)" -ne "$(wc -m < file.txt)" ]; then
echo "文件包含多字节字符"
else
echo "文件只包含ASCII字符"
fi
性能优化技巧
大文件处理
# 对于大文件,只统计行数更快
wc -l large_file.txt
# 使用sed快速统计(某些情况下更快)
sed -n '$=' large_file.txt
# 并行处理多个文件
find . -name "*.log" | xargs -P 4 -I {} wc -l {}
# 流式处理,避免加载整个文件到内存
tail -f growing_file.log | while read line; do
echo "$line" | wc -w
done
避免常见错误
# 错误:统计目录而非文件
# wc directory/ # 这会失败
# 正确:统计目录中的文件
wc directory/*
# 处理文件名包含空格的情况
find . -name "*.txt" -print0 | xargs -0 wc -l
# 安全地处理可能不存在的文件
[ -f "$file" ] && wc -l "$file" || echo "文件不存在: $file"
注意事项
- 换行符差异: Windows(CRLF)和Unix(LF)的换行符不同,可能影响统计
- 权限问题: 确保有读取文件的权限
- 大文件性能: 处理GB级文件时考虑内存和时间消耗
- 字符编码:
-m
和-c
在多字节字符文件中结果不同 - 空文件处理: 空文件的统计结果为0
相关命令
cat
- 显示文件内容grep
- 文本搜索awk
- 文本处理工具sed
- 流编辑器sort
- 排序文本uniq
- 去除重复行
wc
命令虽然简单,但在日常运维、开发和数据分析中都是不可或缺的工具。熟练掌握其用法可以大大提高工作效率。