wc -w 命令输出错误的答案

wc -w 命令输出错误的答案

我必须找出 shell 这个词在一个文件中使用了多少次。我用grep "shell" test.txt | wc -w它来计算该单词被使用了多少次,但结果是 4 而不是 3。文件内容是:

this is a test file
for shell_A
shell_B
sh
shel
and 
shell_C
script project

答案1

wc 命令正在计算 grep 输出中的单词数,其中包括“for”:

> grep shell test.txt
for shell_A
shell_B
shell_C

所以确实有4个字。

如果您只想计算文件中包含特定单词的行数,可以使用-cgrep 选项,例如,

grep -c shell test.txt

这些实际上都不算数,但可以匹配其他内容,其中包括细绳。大多数grep(GNU grep、现代 BSD 以及 AIX、HPUX、Solaris)的实现都提供了-w单词选项,但是不在 POSIX 中。他们还识别正则表达式,例如,

grep -e '\<shell\>' test.txt

对应于该-w选项。再次,不在 POSIX 中。 Solaris 确实文档对此,AIX 和 HPUX 的描述-w没有提及正则表达式。这些看起来都是一致的,将“单词”视为字母数字加下划线的序列。

您可以使用带有 grep 的 POSIX 正则表达式来匹配单词(用空格等分隔),但您的示例没有一个只是“shell”:它们都有一些其他字符接触匹配项。或者,如果您只关心字母数字(并且下划线)并且不介意匹配子字符串,你可以这样做

tr -c '[[:alnum:]]' '\n' test.txt |grep -c shell

建议的选项-o是非 POSIX 的,并且由于 OP 没有将问题限制在 Linux 或 BSD 上,所以不是我推荐的选项。无论哪种情况,它都不匹配, 但字符串(这是OP的期望)。

以供参考:

答案2

命令“grep”输出“shell”出现的整行。不仅仅是“壳”这个词。如下所示:

grep shell test.txt
for shell_A
shell_B
shell_C

我建议使用该选项

-o, --仅匹配

所以:

grep -o "shell" test.txt | wc -w

答案3

因为一行中可以出现多次“shell”这个词,所以我会先将文本分成每行单个单词,然后执行 grep

< test.txt tr -s "[[:blank:]]" "\n" | grep "shell" | wc -w

您还可以使用wc -l,或取消wc并使用grep -c "shell"

tr您甚至可以删除对您拥有和使用的文件的需求:

grep -c "shell" test.txt

答案4

你应该使用wc -l它,即grep shell test.txt | wc -l.返回 3。

相关内容