Dlaczego grep nie działa z przekierowaniem?

15

Użycie toppolecenia z przekierowaniem działa dobrze:

top > top.log

Teraz chcę użyć grep do filtrowania określonej linii:

top | grep "my_program" > top.log

Ale plik dziennika pozostanie pusty. Ale grep dostarcza dane wyjściowe podczas używania

top | grep "my_program"

Gdzie my_programmusi zostać zastąpiony działającym programem, aby zobaczyć dane wyjściowe.

Dlaczego moje podejście nie działa? Jak mogę to naprawić?


źródło
2
Właśnie tego spróbowałem i działa dla mnie. Jednak prawdopodobnie powinieneś spojrzeć na -bopcję toplub pszamiast tego.
Lev Levitsky,
-bnie rozwiązał mojego problemu, ale rozwiązał niektóre problemy z kodowaniem. Dziękuję Ci.

Odpowiedzi:

22

Mam takie samo zachowanie, jakie opisujesz. W systemie Ubuntu 11.10

top | grep "my_program" > top.log

nie wytwarza żadnych wyników.

Uważam, że powodem tego jest to, że grep buforuje swoje dane wyjściowe. Aby powiedzieć GNU grep, aby wyrzucał dane wyjściowe linia po linii, użyj --line-bufferedopcji:

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

Zobacz także to pytanie SO, aby znaleźć inne potencjalne rozwiązania.

unutbu
źródło
3
+1 --line-bufferedrozwiązuje problem.
Dziękuję, to też rozwiązuje problem dla mnie. Ta -bopcja jest nadal dobrą radą Lwa Lewitskiego. To rozwiązało niektóre problemy z kodowaniem pliku dziennika.
2

powinieneś użyć:

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

„-n 1” uruchamia się na szczycie dla jednej iteracji, a następnie kończy działanie zamiast ciągle aktualizować co kilka sekund

ponieważ szukasz tylko jednej linii, chociaż ps byłoby lepszym narzędziem do użycia.

h3rrmiller
źródło
1

Moje obejście tego problemu:

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

W ten sposób mogłem mieć uruchomiony monitor w tle dla mojego_programu i zachować wszystkie wyniki w pliku top.log.

Alex Sed
źródło
0

Spróbuj tego:

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

Co oznacza 2>&1?

Yamaneko
źródło
0

Chociaż oba działają dla mnie, myślę, że rada Lwa Lewitskiego jest słuszna. Użyj -bargumentu.

Istnieje duża szansa, że ​​problemem jest przekierowanie danych wyjściowych i że nic nie osiąga się przez standardowe wyjście, więc spróbuj tego:

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

Pamiętaj, że możesz mieć również problemy z buforowaniem danych wyjściowych. Twoja powłoka nie będzie ciągle zapisywać do pliku, więc top.logwypełnienie może trochę potrwać .

Wolph
źródło