grep管道的输出是什么

时间:2017-07-17 04:08:54

标签: bash shell awk grep

我有一个名为“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}

有人可以告诉我为什么吗?非常感谢。

2 个答案:

答案 0 :(得分:4)

当你要求shell在管道中执行一系列命令时,shell会创建管道,然后按照它认为适合启动它们的顺序启动该管道中的每个命令。所以考虑到这个管道:

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可能会在awk启动ps之后启动{所以如果发生这种情况,那么字符串awk甚至不会出现在ps输出中grep {1}}。另一方面,shell可能会在awk开始之前启动ps,然后字符awk将出现在ps输出中,但之后会被grep删除。因此,无论哪种方式,您都不会在该管道的输出中看到awk

顺便说一句,当你使用awk时你永远不需要grep而print是awks的默认行为,所以你可以把这个管道编写为:

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

无论你使用grep还是坚持使用awk,这种方法当然很脆弱,因为ps输出的错误部分可能会部分匹配或匹配,所以请改用pgrep

答案 1 :(得分:1)

您可以使用pgrep来处理进程:

ps u $(pgrep -f gao)