【问题标题】:what is the output of grep pipelinegrep管道的输出是什么
【发布时间】:2017-07-17 12:38:42
【问题描述】:

我有一个名为“gao”的进程,进程的“grep”显示包括“awk”在内的两个进程。

ps aux | awk '/gao/{print}'

输出有两行,而我只想要一个包含“gao”的行。

vinllen           1205 100.0  0.0  2432780    652 s005  R+   12:01PM   0:14.80 ./gao
vinllen           1271   0.0  0.0  2423460    232 s006  R+   12:01PM   0:00.00 awk /gao/{print}

所以我想在这个 shell 脚本中插入“grep -v awk”。但我不知道我应该去哪个地方。尝试在“ps aux”之后插入这句话后,它起作用了。

vinllen@ ~/code/tmp/2017_07_17$ ps aux | grep -v awk | awk '/gao/{print}'
vinllen           1205 100.0  0.0  2432780    652 s005  R+   12:01PM   2:39.12 ./gao

这让我很困惑,因为在我的理解中,第一个“ps aux”管道将输出所有进程,第二个“ps aux | grep -v awk”将输出除“awk”之外的所有进程,而第二个管道将再次引发一个带有“awk”的进程。所以我认为应该有两个过程,如下所示:

vinllen           1205 100.0  0.0  2432780    652 s005  R+   12:01PM   0:14.80 ./gao
vinllen           1271   0.0  0.0  2423460    232 s006  R+   12:01PM   0:00.00 awk /gao/{print}

谁能告诉我为什么?非常感谢。

【问题讨论】:

    标签: bash shell awk grep


    【解决方案1】:

    当您要求外壳程序在管道中执行一系列命令时,外壳程序会创建管道,然后以它认为适合启动它们的任何顺序启动该管道中的每个命令。所以给定这条管道:

    A | B | C
    

    将创建管道,然后按 B、A、C 或 C、B、A 或其他顺序创建流程。如果 B 需要 A 的输出来做某事,那么 B 将阻止等待 A 产生输出,因此在这方面,每个工具接收输入和产生输出的顺序由它们在管道中出现的顺序决定,但不能保证的是processes will be created 按照它们出现在管道中的顺序,即 A 然后 B 然后 C。

    如果你有

    ps aux | grep -v awk | awk '/gao/{print}'
    

    那么 shell 可能会在启动 ps 之后启动 awk,因此如果发生这种情况,则字符串 awk 甚至不会出现在 ps 输出中,该输出被馈送到 grep。另一方面,shell 可能在启动ps 之前启动awk,然后字符串awk 将出现在ps 输出中,但随后被grep 删除。因此,无论哪种方式,您都不会在该管道的输出中看到 awk

    顺便说一句,当您使用 awk 时,您永远不需要 grep,print 是 awks 的默认行为,因此您可以编写该管道:

    ps aux | awk '!/awk/ && /gao/'
    

    无论您使用 grep 还是仅仅坚持使用 awk,这种方法当然是脆弱的,因为可能会在 ps 输出的错误部分进行部分匹配或匹配,因此请考虑改用 pgrep

    【讨论】:

    • 谢谢,埃德。所以正如你提到的,ps aux 的结果是否有可能被grep -v awk 过滤,最后由awk 处理结果。如果是这样,输出应该是两行。
    • 1) 是,2) 不是。请重新阅读我在回答中所说的内容,因为您似乎误解了它,我不知道如何更清楚地说明它。
    【解决方案2】:

    您可以使用pgrep grep 进程:

    ps u $(pgrep -f gao)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      • 2017-08-02
      • 2018-11-18
      • 2019-04-01
      • 2021-09-10
      • 2015-04-18
      • 2012-12-01
      相关资源
      最近更新 更多