2017-07-17 5 views
0

Ich habe einen Prozess namens "gao", der "grep" der Prozessanzeige zwei Prozesse einschließlich "awk".was ist die Ausgabe von grep Pipeline

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

wo der Ausgang zwei Zeilen hat, während ich nur einen einschließlich "Gao" nur wollen.

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} 

Also ich möchte "Grep -v awk" in dieses Shell-Skript einfügen. Aber ich weiß nicht, welchen Platz ich machen soll. Nach dem Versuch, diesen Satz nach "ps aux" einzufügen, funktioniert es.

[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 

Das verwirrte mich sehr, weil in meinem Verständnis, die ersten „ps aux“ Pipeline gibt alle Prozesse, die zweite „ps aux | grep -v awk“ werden die Prozesse mit Ausnahme von „awk alle Ausgaben ", und die zweite Pipeline wird einen Prozess mit" awk "erneut auslösen. Also ich denke, es sollte zwei Prozesse wie folgt sein:

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} 

Könnte mir jemand sagen, warum? Danke vielmals.

Antwort

4

Wenn Sie die Shell anweisen, eine Befehlskette in einer Pipeline auszuführen, erstellt die Shell die Pipeline und startet dann jeden Befehl in dieser Pipeline in der Reihenfolge, in der sie sie zu starten beginnen. Also diese Pipeline gegeben:

A | B | C 

die Pipeline erstellt und dann den Prozess in der Reihenfolge B erstellt, A, C oder C, B, A oder einer anderen Reihenfolge. Wenn B eine Ausgabe von A benötigt, um etwas zu tun, dann blockiert B das Warten auf A, um Ausgabe zu produzieren, in dieser Hinsicht wird die Reihenfolge, in der jedes Werkzeug Eingaben empfängt und Ausgabe erzeugt, durch die Reihenfolge bestimmt, in der sie in der Pipeline erscheinen, aber was NICHT garantiert ist dass die processes will be created in der Reihenfolge, wie sie in der Pipeline auftreten, dh A dann B dann C

also, wenn Sie

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

dann könnte die Schale awk starten, nachdem es ps beginnt und dann, wenn das passiert, dann Die Zeichenfolge awk wird nicht einmal in dem ps-Ausgang angezeigt, der an grep übergeben wird. Auf der anderen Seite kann die Shell awk starten, bevor sie startet ps und dann die Zeichenfolge awk wird in der ps Ausgabe erscheinen, aber dann von grep entfernt werden. So oder so wirst du awk in der Ausgabe dieser Pipeline nicht sehen.

btw brauchen Sie nie grep, wenn Sie awk verwenden und print ist awks Standardverhalten, so dass Sie wie genau das Pipeline schreiben könnte:

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

Ob Sie grep verwenden oder einfach nur halten diese Annäherung an awk zerbrechlich natürlich wegen der Möglichkeit für eine teilweise Übereinstimmung oder Anpassung in den falschen Teil der PS-Ausgabe, so schauen Sie mit pgrep stattdessen.

+0

Danke, Ed. Wie Sie bereits erwähnt haben, ist es möglich, dass das Ergebnis von 'ps aux' durch' grep -v awk' gefiltert wird und schließlich das Ergebnis von 'awk'. Wenn dies der Fall ist, sollte die Ausgabe zwei Zeilen umfassen. – vinllen

+0

1) ja, und 2) nein.Bitte lesen Sie noch einmal, was ich in meiner Antwort gesagt habe, denn Sie scheinen es falsch verstanden zu haben und ich weiß nicht, wie ich es deutlicher ausdrücken soll. –

+1

Wow, das ist so toll! Es hilft mir, vielen Dank! – vinllen

1

können Sie pgrep verwenden Prozesse grep:

ps u $(pgrep -f gao) 
Verwandte Themen