我必须找出 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个字。
如果您只想计算文件中包含特定单词的行数,可以使用-c
grep 选项,例如,
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。