wc—字数统计
wc(字数统计)命令是一个非常简单的实用程序,在所有 Unix 变体中都可以找到。它的目的是统计文本文件的行数、字数和字符数。如果指定了多个文件,wc 将为每个文件生成一个计数,以及所有文件的总计。
当不带选项使用时,wc 按顺序打印行数、字数和字符数。单词是由空格分隔的一个或多个字符的序列。如果我们想要的计数少于三个,我们使用选项来选择要打印的内容:-l 打印行数,-w 打印字数,-c 打印字符数。Linux 系统中发现的 GNU 版本的 wc 也支持长选项格式:--chars(或 --bytes)、--words、--lines。
当我对这个文本的 LaTeX 源代码的早期版本应用 wc 时,我从 wc 收到了以下信息
wc wc.tex 98 760 4269 wc.tex
这一行意味着该文件有 98 行,760 个单词和 4269 个字符(字节)。实际上,我很少单独使用 wc。由于其简单性,wc 在与其他 Linux 命令结合使用时最有用。
如果我们使用 Linux(或 Unix)以外的文件系统,即 DOS,则由于换行符是回车符和换行符的组合而存在歧义。-c 应该将换行符算作两个字符还是仅算作一个字符?POSIX.2 标准规定 -c 实际上计数的是字节,而不是字符,并且它提供了 -m 选项来计数字符。此选项不能与 -c 一起使用,而且,GNU wc 不支持 -m。如果我们非常需要它,我们始终可以从字节数中减去行数,以获得 DOS 文件的字符数。以下是实现此目的的两种不同方法
wc /dosc/autoexec.bat | awk '{print $3-$1}' tr -d '\015' < /dosc/autoexec.bat | wc -c
第一个解决方案使用 awk 从第三个字段(字节数)中减去第一个字段(行数)。第二个解决方案使用 tr 在将输入馈送到 wc 之前,删除输入中的回车符(八进制字符 15)。
最近,我使用了一个连接到一台略有故障的机器的 CD-ROM 刻录机。有时,在不同的硬盘分区之间复制时,连续 32 个字节的块会被损坏。这导致相当多的 CD-ROM 备份损坏。有时损坏会影响一个大文件,在这种情况下,保留坏文件并在下一个备份中添加一个小补丁文件会更便宜。为了决定我们应该对损坏的文件进行新的完整备份还是仅制作差异补丁,我们使用了 cmp 命令来检测差异,然后使用 wc 来计数它们:。
cmp -l /original/foo /cdrom/foo | wc -l
cmp 的 -l 选项提供了差异的完整列表,每行一个,而不是在第一个差异处停止。因此,上面的命令输出的是错误的字节数。
如果我们想计算文件 foo.txt 的第 70 行有多少个单词,那么我们使用
head -70 foo.txt | tail -1 | wc -w
在这里,命令 head -70 输出文件的前 70 行,命令 tail -1(即数字 1)输出其输入的最后一行,恰好是 foo.txt 的第 70 行,而 wc 计算该行中有多少个单词。
如果我们的老板催促我们在每月项目报告中包含生成的代码行数的计数,那么我们可以这样做
wc -l */*.[ch] | tail -1 | awk '{print $1}'
这假设我们所有的代码都在扩展名为 .h 或 .c 的文件中,并且这些文件位于我们当前目录下一级深度的子目录中。如果文件深度是任意的,我们使用以下命令
wc -l `find . -name "*.[ch]" -print` | \ tail -1 | awk '{print $1}'请注意 find 命令行中使用反引号,以及 awk 命令中使用正(普通)引号。命令 find . -name "*.[ch]" -print 输出位于当前目录下的 *.c 和 *.h 文件,每行一个。反引号导致该命令被执行,然后将命令输出中的每个换行符替换为空格,并将该输出传递给 wc 命令行。
如果在良好的 GNU 风格中,您用单词 FIXME 标记源代码中的所有当前错误和肮脏的 hacks,那么您可以通过键入以下内容来查看有多少紧急工作待处理
grep FIXME *.c | wc -l
grep 输出所有包含 FIXME 的行,然后我们只需要计数它们。
正如您所见,wc 命令没有什么特别之处;但是,如果该命令不可用,我一半的 shell 脚本将停止工作。
