使用grep计数不必要的单词(Unix)

时间:2018-10-31 13:22:34

标签: regex unix grep

我正在尝试计算每一行的最后一个单词中火和水这个单词出现的次数

$cat file 
red,Fire
blue,water 
Fire red, Fire

我的解决方案:

$grep -Ewo "Fire" <file> | sort | uniq -c

我得到的输出是:

$Fire 3
$Water 1

我期望得到的是:

$Fire 2
$Water 1 

1 个答案:

答案 0 :(得分:0)

您要传递给grep的模式不符合您的要求。 Fire只是按字母顺序在字符串中的任何位置表示这些字母。

您包括了-w选项,该选项将其限制为单独显示,但仍可以在线上的任何位置。从我系统上的man grep

  

-w,--word-regexp
  仅选择包含构成整个单词的匹配项的行。测试是匹配的子字符串必须在该行的开头,或者必须在非单词组成字符之前。同样,它必须在行的末尾,或后跟非单词组成字符。单词构成的字符是字母,数字和下划线。

通常,每行将在输出中重复或隐藏,但是您包括了-o选项。从我系统上的man grep

  

-o,--only-matching
  仅打印匹配行中匹配的(非空)部分,并将每个这样的部分打印在单独的输出行上。

尤其要注意的最后一个子句:如果该行的多个部分匹配,则它们将全部作为单独的输出行输出。

比较:

# Match all three words, and output the line if it matches
$ echo 'one two three' | grep -E 'one|two|three'
one two three

# Match all three words, and output the matching parts
$ echo 'one two three' | grep -Eo 'one|two|three'
one
two
three

因此,您的命令告诉您“火”一词总共出现3次,而忽略了行上的位置或每行多少次。

要将其限制为仅与行末匹配 ,请在表达式中添加$

grep -Ewo 'Fire$'