【问题标题】:Piping 2 grep commands into wc管道 2 grep 命令到 wc
【发布时间】:2017-01-12 16:34:00
【问题描述】:

我有一个名为 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 行中的一行两者都有,但我想要 only 'Rake' 的行。我试过grep Rake a.txt | grep -v rake a.txt | wc返回90行?

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

【问题讨论】:

  • 一些示例输入和预期输出在这里会很有用。

标签: linux shell command-line grep word-count


【解决方案1】:

我试过grep Rake a.txt | grep -v rake a.txt | wc返回90行?

管道的要点是命令的输出馈送下一个命令。取而代之的是,您正在使用管道然后说 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

【讨论】:

  • 我将不得不考虑使用 awk。我对使用终端非常陌生,目前通过一些在线资源学习基础知识。不过感谢您的回答!
  • @Aaron 不客气 :) 欢迎来到 UNIX 世界,如果你会发现很多有趣的东西。
  • 为什么不使用 grep -c 而不是通过管道连接到 wc?
  • @VarunM 这是一个很好的提示。 grep Rake a.txt | grep -vc rake 会成功的。无论如何,我会选择awk 方法。
【解决方案2】:

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

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

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

【讨论】:

  • 很高兴知道这一点。我目前正在上的在线课程在介绍 grep 和管道时排除了这个有趣的事实
猜你喜欢
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 2018-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多