2017-07-17 32 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)