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ć?

bash  grep 

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.


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.


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.



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ć .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.