如何在 Linux 中使用 wc 命令如何在 Linux 中使用 wc 命令如何在 Linux 中使用 wc 命令如何在 Linux 中使用 wc 命令
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

如何在 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 是一个很好的工具,当您需要计算各种值而不仅仅是文件中的单词时,可以将其放入管道命令中。

©2015-2025 艾丽卡 support@alaica.com