2017-07-17 73 views
0

我有一个名为“gao”的进程,进程的“grep”显示两个进程包括“awk”。什么是grep管道的输出

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

其中输出有两条线,而我只想要一个包括“高”只。

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”之后插入此句后,它可以正常工作。

[email protected] ~/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} 

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

回答

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}' 

然后开始ps等,如果出现这种情况之后再把外壳可能开始awk字符串awk甚至不会出现在要送入grepps输出中。另一方面,在启动ps之前,shell可能会启动awk,然后字符串awk将出现在ps输出中,但会被grep删除。因此无论哪种方式,您都不会在该管道的输出中看到awk

顺便说一句,你永远需要的grep,当你使用awk和print是awks默认行为,所以你可以写管道刚才:无论你使用grep

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

或只是坚持awk的这种做法是脆弱的当然是由于ps输出的错误部分可能会部分匹配或匹配,所以请使用pgrep来代替。

+0

谢谢你,埃德。所以,正如你提到的那样,是否有可能'ps aux'的结果被'grep -v awk'过滤,最后是'awk'处理的结果。如果是这样,输出应该是两行。 – vinllen

+0

1)是,2)否。请重新阅读我在答复中所说的内容,因为您似乎误解了这一点,但我不知道如何更清楚地陈述它。 –

+1

哇,太棒了!它帮助我,非常感谢! – vinllen

1

您可以使用pgrep到grep流程:

ps u $(pgrep -f gao)