管道 2 grep 命令到 wc

Piping 2 grep commands into wc

我有一个名为 a.txt 的文件,它有 100 行长。

grep    rake a.txt | wc    #returns 10 lines

grep -v rake a.txt | wc    #returns 90 lines

grep    Rake a.txt | wc    #returns  3 lines

这 100 行中有一个同时包含两者,但我想要 只有 'Rake' 的行。我试过grep Rake a.txt | grep -v rake a.txt | wcreturns90行?

我想找到带有 'Rake' 的所有 3 行,将其通过管道传输到 grep,查找这 3 行中是否包含 'Rake' 但不包含 'rake',以及然后使用 wc 来计算行数。我可以使用重定向来制作另一个文件,然后 grep -v 那个新文件,但这并不是我真正的目标。我确定这很简单,但我该如何修复我的命令?

不要为第二个 grep 提供文件参数,即:

grep Rake a.txt | grep -v rake | wc -l

使用文件参数,grep 将再次搜索文件。没有它,它只会过滤它的输入。

I have tried grep Rake a.txt | grep -v rake a.txt | wc returns 90 lines?

管道的要点是一个命令的输出提供下一个命令。相反,你在管道然后说 grep -v rake a.txt,这使得前面的命令变得多余。

所以你只需要正常管道:

grep Rake a.txt | grep -v rake   | wc
#                              ^
#                             removed a.txt

您也可以使用 awk 并告诉它计算包含 Rake 的行,而不是 rake。最后,打印计数器:

awk '/Rake/ && !/rake/ {count++} END {print count+0}' a.txt