如何在 Linux 中使用 wc 命令

计算文件中的行数、字数和字节数很有用,但 Linux wc
命令的真正灵活性来自与其他命令的配合使用。让我们来看看。
wc 命令是什么?
wc
命令是一个小应用程序。它是核心 Linux 实用程序之一,因此无需安装。它已经在你的 Linux 计算机上了。
您可以用几句话描述它的作用。它计算文件或文件选择中的行数、字数和字节数,并在终端窗口中打印结果。它还可以从 STDIN 流中获取输入,这意味着您希望它处理的文本可以通过管道传输到其中。这是 wc
真正开始增加价值的地方。
这是 Linux 口头禅“做一件事,做好它”的一个很好的例子。因为它接受管道输入,所以它可以用于多命令咒语。正如我们将看到的,这个独立的小实用程序实际上是一个很好的团队合作伙伴。
我使用 wc
的一种方式是在我准备的复杂命令或别名中用作占位符。如果完成的命令具有破坏性和删除文件的潜力,我经常使用 wc
作为真正的、危险的命令的替代品。
这样,在命令的开发过程中,我得到了每个文件都按预期处理的视觉反馈。当我与语法搏斗时,不会有任何不好的事情发生。
就像 wc
一样简单,您仍然需要了解一些小怪癖。
厕所入门
使用wc
的最简单方法是在命令行上传递文本文件的名称。
wc lorem.txt

这会导致 wc
扫描文件并计算行数、字数和字节数,并将它们写出到终端窗口。
单词被认为是任何以空格为界的东西。它们是否来自真实语言是无关紧要的。如果一个文件只包含“frd g lkj”,它仍然算作三个单词。
行是由回车符或文件末尾终止的字符序列。在编辑器或终端窗口中换行并不重要,直到 wc
遇到回车符或文件末尾,它仍然是同一行。
我们的第一个例子在整个文件中找到了一行。这是“lorem.txt”文件的内容。
cat lorem.txt

所有这些都算作一行,因为没有回车。将此与另一个文件“lorem2.txt”进行比较,以及 wc
是如何解释它的。
wc lorem2.txt
cat lorem2.txt

这一次,wc
计数为 15 行,因为已将回车符插入到文本中以在特定点开始新行。但是,如果您计算其中包含文本的行,您会发现只有 12 行。
其他三行是文件末尾的空行。这些仅包含回车符。即使这些行中没有文本,新行已经开始,所以 wc
将它们算作这样。
我们可以将任意数量的文件传递给 wc
。
wc lorem.txt lorem2.txt

我们得到每个单独文件的统计信息和所有文件的总数。
我们还可以使用通配符,以便我们可以选择匹配的文件而不是明确命名的文件。
wc *.txt *.?

命令行选项
默认情况下,wc
将显示每个文件中的行、字和字节。它与使用 -l
(行)-w
(单词)和 -c
(字节)选项相同。
wc lorem.txt
wc -l -w -c lorem.txt

我们可以指定我们希望看到的图形组合。
wc -l lorem.txt
wc -w lorem.txt
wc -c lorem.txt
wc -l -c lorem.txt

要特别注意最后一个数字,由 -c
(bytes) 选项生成。很多人误以为这是在数字符。它实际上计算字节。字符数和字节数可能完全相同。但不总是。
让我们看一下名为“unicode.txt”的文件的内容。
cat unicode.txt

它有三个单词和一个非拉丁字母字符。我们将让 wc
使用其默认设置 bytes 处理文件,我们将再次执行此操作,但使用 请求 characters >-m
(字符)选项。
wc unicode.txt
wc -l -w -m unicode.txt

字节数多于字符数。
让我们看一下文件的十六进制转储,看看发生了什么。 hexdump
命令的 -C
(规范)选项以 16 行为单位显示文件中的字节,并在末尾显示它们的纯 ASCII 等效项(如果有的话)线。如果没有相应的 ASCII 字符,则会显示句点“.
”。
hexdump -C unicode.txt

在 ASCII 中,0x20
的十六进制值表示空格字符。如果我们从左边数三个值,我们会看到下一个值是一个空格字符。因此,前三个值 0x62
、0x6f
和 0x79
代表“boy”中的字母。
跳过 0x20
,我们看到另一组三个十六进制值:0x63
、0x61
和 0x74
。这些拼出“猫”。跳过下一个空格字符,我们看到“dog”中字母的三个值。它们是 0x64
、0x5f
和 0x67
。
在单词“dog”的后面,我们可以看到一个空格字符 0x20
,以及另外五个十六进制值。最后两个是回车,0x0a
。
其他三个字节代表非拉丁字符,我们用绿色圈起来了。它是一个 Unicode 字符,需要三个字节来对其进行编码。它们是 0xe1
、0xaf
和 0x8a
。
因此,请确保您知道自己在计算什么,并且字节和字符不必相同。通常,计算字节数更有用,因为它告诉您文件中实际有什么。。按字符计数可以得到文件内容代表的事物的数量。
从文件中获取文件名
还有另一种方法可以为 wc
提供文件名。您可以将文件名放在一个文件中,并将那个文件的名称传递给wc
。它打开文件,提取文件名,并处理它们,就好像它们是在命令行上传递的一样。这允许您存储任意文件名集合以供重复使用。
但是有一个问题,而且是一个很大的问题。文件名必须以null结尾,而不是回车结尾。也就是说,在每个文件名之后必须有一个空字节 0x00
而不是通常的回车字节 0x0a
。
您无法打开编辑器并创建具有此格式的文件。通常,像这样的文件是由其他程序生成的。但是,如果您有这样的文件,这就是您使用它的方式。
这是包含文件名的文件。在 less
中打开它会显示 less
用来表示空字节的奇怪的“^@
”字符。
less source-files-list.txt

要使用带有 wc
的文件,我们需要使用 --files0-from
(从中读取输入)选项并传入包含文件名的文件名。
wc ---files0-from=source-files-list.txt

这些文件的处理方式与它们在命令行上提供的完全一样。
管道输入到 wc
将输入发送到 wc
的一种更常见、更灵活、更高效的方法是将其他命令的输出通过管道传输到 wc
中。我们可以使用 echo
命令来演示这一点。
echo "Count this for me" | wc
echo -e "Count this\nfor me" | wc

第二个 echo
命令使用 -e
(转义字符)选项来允许转义序列,例如“\n
”换行格式代码。这会注入一个新行,导致 wc
将输入视为两行。
这是一系列命令,将它们的输入从一个输入到另一个。
find ./* -type f | rev | cut -d'.' -f1 | rev | sort | uniq
- find 从当前目录开始以递归方式查找文件 (
type -f
)。rev
反转文件名。 - cut 通过将字段分隔符定义为句点“
.
”并从“反向文件名的前面”,直到它找到的第一个句点。我们现在已经提取了文件扩展名。 - rev 反转提取的第一个字段。
- sort 按字母升序对它们进行排序。
- uniq 列出终端窗口的唯一条目。

此命令列出当前目录和任何子目录中的所有唯一文件扩展名。
如果我们将 -c
(计数)选项添加到 uniq
命令,它将计算每种扩展类型的出现。但是如果我们想知道有多少不同的、唯一的文件扩展名,我们可以将 wc
作为该行的最后一个命令,并使用 -l
(行)选项。
find ./* -type f | rev | cut -d'.' -f1 | rev | sort | uniq | wc -l

最后
这是 wc
可以为您做的最后一个技巧。它会告诉你文件中最长行的长度。可悲的是,它没有告诉你它是哪一行。它只是给你长度。
wc -L taf.c

但要注意,制表符被算作八个空格。在我的编辑器中查看,该行的开头有三个两个空格的制表符。它的实际长度是 124 个字符。所以报告的数字是人为扩大的。
我会用一大撮盐来对待这个功能。我的意思是不要使用它。它的输出具有误导性。
尽管有它的怪癖,wc
是一个很好的工具,当您需要计算各种值而不仅仅是文件中的单词时,可以将其放入管道命令中。