Prawdopodobnie jest to problem buforowania. Zobacz ten post SO dotyczący wyłączania automatycznego buforowania podczas korzystania z potoków . Możesz użyć unbuffer
polecenia z expect
:
$ unbuffer tail -f log.txt | egrep 'WARN|ERROR' | tee filtered_output.txt
Edycja : Ponieważ masz dłuższy potok, prawdopodobnie musisz cofnąć buforowanie każdego polecenia (z wyjątkiem ostatniego):
$ unbuffer tail -f log.txt | unbuffer egrep 'WARN|ERROR' | tee filtered_output.txt
Edycja 2 : unbuffer
jest dostępna w Cygwin z expect
pakietu źródłowego (np. Expect-20030128-1-src.tar.bz2 , znaleziony w expect/examples
folderze), ale jest to bardzo krótki skrypt. Jeśli masz expect
już zainstalowany pakiet, po prostu umieść go w skrypcie wywoływanym unbuffer
w /usr/local/bin
katalogu:
#!/usr/bin/expect --
# Description: unbuffer stdout of a program
# Author: Don Libes, NIST
eval spawn -noecho $argv
set timeout -1
expect
W systemie Debian unbuffer
polecenie znajduje się w expect-dev
pakiecie i jest instalowane jako expect_unbuffer
.
expect
paczki.Gdy używasz polecenia, które tak naprawdę „nie kończy” (np.
tail -f
), To tak naprawdę nie działa lub wcale nie jest tak dobre (wcale).źródło
Oto
unbuffer
moja wersja :źródło
Jak zauważyli inni, możesz użyć
unbuffer
narzędzia z Expect.Należy jednak pamiętać, że w zależności od systemu i dostępnej wersji programu Expect może być konieczne użycie
-p
przełącznika w celu cofnięcia buforowania. Powołując się na stronę podręcznika:Może więc być potrzebne to wywołanie:
BTW, zobacz ten artykuł, aby uzyskać szczegółowe wyjaśnienie problemu buforowania danych wyjściowych: http://www.pixelbeat.org/programming/stdio_buffering/
źródło