2017-09-14 1 views
0

Ich war daran interessiert, den Header des Eingangs im grep Ausgang wie in der Frage Include header in the 'grep' result zu halten.Warum funktioniert eine Pipe zu einer Befehlsgruppe nur für einige Befehle?

Obwohl eine funktionierende Lösung (mit sed) direkt in der Frage präsentiert wird, zog die answer with most upvotes meine Aufmerksamkeit auf sich. Es ermöglicht beispielsweise die Verwendung von grep --color. Er schlägt vor, den Eingang zu einem command group mit den Befehlen kochenden head und grep, zB:

ps -ef | { head -1; grep python; } 

jedoch, wie in der verknüpften Antwort und ein Kommentar geschrieben, das nicht mit allen Befehlen auf der linken Seite des Rohres funktioniert . Es funktioniert gut mit ps oder lsof aber funktioniert nicht für df, ls und andere. Wenn sie verwendet wird, wird nur der Ausgang des ersten Befehls in der Gruppe gedruckt: nur

$ df | { head -1; grep '/'; } 
Filesystem         1K-blocks  Used Available Use% Mounted on 
$ 

Könnte jemand erklären, warum Rohrleitungen zu einer Befehlsgruppe für einige Befehle funktionieren? Gibt es eine Möglichkeit, es universell funktionieren zu lassen?

+0

Im Allgemeinen sollten Sie sich nicht darauf verlassen, dass der zweite Befehl irgendeine Eingabe erhält. –

+0

Sie können 'awk' verwenden, um die erste Zeile oder die übereinstimmenden Zeilen zu drucken ...' ps -ef | awk 'NR == 1 ||/python/'' –

Antwort

1

Die Antwort auf Ihre Frage ist in comments of the linked answer.

Anscheinend sendet ps -e die Kopfzeile zuerst, dann nichts senden, dann den Rest der Ausgabe puffern. head muss denken, dass der Stream nach der ersten Zeile geschlossen ist, so dass es austritt, grep zu verlassen, um den Rest zu sehen.

Es funktioniert nur zufällig.

Gibt es eine Möglichkeit, es universell arbeiten zu lassen?

Alles ist möglich, aber Sie müssen möglicherweise alles neu codieren und neu kompilieren. Also ... nicht möglich, Entschuldigung.

Verwandte Themen