Bash 在Unix中使用grep和pipes查找特定单词

Bash 在Unix中使用grep和pipes查找特定单词,bash,unix,filter,grep,pipe,Bash,Unix,Filter,Grep,Pipe,假设我使用的是grep,我在文本文件中使用-v选项来查找所有不包含元音的单词。如果我想看看这个文件中有多少不包含元音的单词,我该怎么办 我正在考虑使用管道并单独使用rc命令。这样行吗?谢谢。以下脚本将计算不包含元音的单词数(如果每行有几个单词): #/bin/bash #文件可以是脚本参数 FILE=“$1” 让计数=0 读行时;做 对于$line中的单词;做 grep-qv“[aeiou]”实际上,我相信您想要的是wc,而不是rc,如: grep -civ '[aeiouy]' words.t

假设我使用的是grep,我在文本文件中使用-v选项来查找所有不包含元音的单词。如果我想看看这个文件中有多少不包含元音的单词,我该怎么办


我正在考虑使用管道并单独使用rc命令。这样行吗?谢谢。

以下脚本将计算不包含元音的单词数(如果每行有几个单词):

#/bin/bash
#文件可以是脚本参数
FILE=“$1”
让计数=0
读行时;做
对于$line中的单词;做

grep-qv“[aeiou]”实际上,我相信您想要的是
wc
,而不是
rc
,如:

grep -civ '[aeiouy]' words.txt

例如,考虑文件:

$ cat words.txt
the
words
mph
tsk
hmmm
然后,下面正确计算三个没有元音的“单词”:

$ grep -civ '[aeiouy]' words
3
我在元音列表中包括了
y
。您可以决定是否将其删除

另外,我在上面假设您的文件每行有一个单词

上面使用的grep选项如下所示:

  • -v
    表示排除匹配行

  • -i
    使匹配不区分大小写

  • -c
    告诉grep返回一个计数,而不是实际的匹配

每行多个字
因为
\b
在单词边界处匹配,所以上面的正则表达式只匹配缺少元音的单词
-o
告诉grep只打印行的匹配部分,而不是整个行。因为
-c
计算匹配的行数,所以它在这里没有用处
wc-l
用于计算匹配项。

如果多个单词可以在同一行上,并且您也想对它们进行计数,您可以使用
grep-o
wc-l
正确计算所有匹配项,如下所示:

$ echo "word work no-match wonder" | grep -o "wo[a-z]*" | wc -l
3

或者,您可以在Awk中完成这一切:

awk '!/[aeiou]/ {n++} END {print n}' file
对于具有多个字段的行:

awk '{for(i=1; i<=NF; i++) if($i !~ /[aeiou]/) n++} END {print n}' file

awk'{for(i=1;i每行包含多个单词,或者是每行排列一个单词?将-c^[^aeiou]*$not work?@higuaro,单词按每行一个排列。如果每行没有一个单词,
wc-w
不是更好吗?@cdarke因为行中的一些单词可能有元音,而其他没有元音,所以需要一种不同的方法。请参阅更新的答案。
grep-civ
本身已经产生了一个不匹配的计数行。@tripleee非常好的建议。我检查了
-c
是。我更新了答案以使用
-c
。奇怪的是,
-c
装载匹配的输入行,而不是匹配的数量,因此它在这里对每行多个字的大小写没有用处。
$ echo "word work no-match wonder" | grep -o "wo[a-z]*" | wc -l
3
awk '!/[aeiou]/ {n++} END {print n}' file
awk '{for(i=1; i<=NF; i++) if($i !~ /[aeiou]/) n++} END {print n}' file