Warum funktioniert grep nicht mit Umleitung?

15

Das Verwenden des topBefehls mit Umleitung funktioniert einwandfrei:

top > top.log

Jetzt möchte ich grep verwenden, um eine bestimmte Zeile zu filtern:

top | grep "my_program" > top.log

Die Protokolldatei bleibt jedoch leer. Aber grep liefert bei Verwendung eine Ausgabe

top | grep "my_program"

Wo my_programmuss durch ein laufendes Programm ersetzt werden, um eine Ausgabe zu sehen.

Warum funktioniert mein Ansatz nicht? Und wie kann ich das beheben?


quelle
2
Ich habe es gerade ausprobiert und es funktioniert für mich. Sie sollten sich jedoch wahrscheinlich die -bOption ansehen topoder psstattdessen verwenden.
Lev Levitsky
-blöste nicht mein Problem, löste aber einige Kodierungsprobleme. Vielen Dank.

Antworten:

22

Ich habe das gleiche Verhalten, das Sie beschreiben. Unter Ubuntu 11.10

top | grep "my_program" > top.log

erzeugt keine Ausgabe.

Ich glaube, der Grund dafür ist, dass grep seine Ausgabe puffert. Verwenden Sie die folgende --line-bufferedOption, um GNU grep anzuweisen, die Ausgabe zeilenweise auszuspucken :

top | grep --line-buffered "my_program" > top.log

Siehe auch diese SO-Frage für andere mögliche Lösungen.

unutbu
quelle
3
+1 --line-bufferedlöst das Problem.
Danke, das löst das Problem auch für mich. Die -bOption ist auch nach wie vor ein guter Rat von Lev Levitsky. Dadurch wurden einige Codierungsprobleme mit der Protokolldatei behoben.
2

du solltest benutzen:

top -n 1 | grep "blah" > top.log

Das "-n 1" wird für eine Iteration oben ausgeführt und dann beendet, anstatt alle paar Sekunden fortlaufend zu aktualisieren

da du nur nach einer Zeile suchst, wäre ps ein besseres Werkzeug.

h3rrmiller
quelle
1

Mein Workaround für dieses Problem war:

while :;do top -b -n 1 | grep "my_program" >> top.log;done &

Auf diese Weise könnte ich einen laufenden Monitor für my_program im Hintergrund haben und alle Ergebnisse in der Datei top.log speichern.

Alex Sed
quelle
0

Versuche dies:

top | grep "my_program" 2>&1 > top.log

Was bedeutet 2>&1?

Yamaneko
quelle
0

Obwohl beide für mich arbeiten, denke ich, dass Lev Levitskys Rat der richtige ist. Verwenden Sie das -bArgument.

Es besteht eine gute Chance, dass die Ausgabeumleitung das Problem ist und dass Sie nichts über stdout erhalten. Versuchen Sie stattdessen Folgendes:

top -b 2>&1 | grep "my_program" > top.log

Beachten Sie, dass Sie möglicherweise auch Probleme mit der Ausgabepufferung haben. Ihre Shell schreibt nicht ständig in die Datei, daher kann es eine Weile dauern, bis die Datei top.loggefüllt ist.

Wolph
quelle