簡體   English   中英

在Unix中使用grep和管道來查找特定的單詞

[英]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 -owc -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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM