在Unix中使用grep和管道来查找特定的单词

时间:2015-07-25 06:52:33

标签: bash unix filter grep pipe

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

我正在考虑使用管道并单独使用 rc 命令。那会有用吗?感谢。

4 个答案:

答案 0 :(得分:2)

实际上,我认为你想要wc,而不是rc,如:

grep -civ '[aeiouy]' words.txt

例如,考虑文件:

$ cat words.txt
the
words
mph
tsk
hmmm

然后,以下正确计算没有元音的三个“单词”:

$ grep -civ '[aeiouy]' words
3

我在元音列表中加入了y。您可以决定是否应删除y

另外,我假设你的文件每行有一个单词。

上面使用的grep选项如下:

  • -v表示排除匹配行

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

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

每行多个单词

$ echo the tsk hmmm | grep -io '\b[bcdfghjklmnpqrstvxz]*\b' | wc -l
2

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

答案 1 :(得分:1)

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

#!/bin/bash

# File can be a script parameter
FILE="$1"

let count=0
while read line; do
    for word in $line; do
        grep -qv "[aeiou]" <<< "$word"
        if [ $? -eq 0 ]; then
           let count++
        fi
    done
done < FILE
echo "words without vowels: $count"

如果每行只有一个单词,那么以下就足够了:

grep -cv "[aeiou]" < file

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

或者,您可以在Awk中完成所有操作:

awk '!/[aeiou]/ {n++} END {print n}' file

对于包含多个字段的行:

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