[英]Using grep and pipes in Unix to find specific words
假设我正在使用grep ,并且我在文本文件中使用-v选项来查找所有不包含元音的单词。 如果我想查看此文件中有多少单词不包含元音,我该怎么办?
我正在考虑使用管道并单独使用rc命令。 那会有用吗? 谢谢。
实际上,我相信你想要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
来计算匹配。
以下脚本将计算不包含元音的单词数(如果每行有多个单词):
#!/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
如果多个单词可以在同一行,并且您也想对它们进行计数,则可以使用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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.