Próbuję filtrować dane wyjściowe jednego pliku dziennika na oddzielne pliki dziennika oparte na filtrze grep.
tail -f test.log | tee & gt; (grep „Błąd” & gt; error.log) & gt; (grep „Ostrzeżenie” ”& gt; warning.log)
W ten sposób wszystkie wpisy „Błąd” znajdują się w jednym pliku, a wszystkie wpisy „Ostrzeżenie” znajdują się w osobnym pliku.
Wiem, że to działa w koncepcji, ponieważ jeśli używam kot zamiast ogon , Otrzymuję poprawne wyjście pliku, ale nie mogę śledzić zmian w czasie rzeczywistym (czego potrzebuję, ponieważ oglądam dzienniki wyjściowe z aktywnych testów)
Ponadto, jeśli usunę „& gt;” plik re-directors z grep polecenia wyprowadza poszczególne wyjścia grep do konsoli poprawnie; jednak chcę także nagrać plik.
Odpowiedź:
Podczas zapisywania do pliku wyjście grep był buforowany. Za pomocą egrep z --line-buffer opcja naprawiła zachowanie.
Nowe polecenie wygląda tak:
tail -f test.log | tee & gt; (egrep - line-buffered "ERROR" & gt; error.log) & gt;
Odpowiedzi:
Może być łatwiej, jeśli użyjesz do tego więcej niż jednej linii. Możesz napisać skrypt basha:
źródło
@Ryan, dzięki za wysłanie odpowiedzi na twoje pytanie.
innym (uniwersalnym) sposobem ustawiania buforowania na linii jest użycie
stdbuf
dowództwo:oto fragment z
man stdbuf
:źródło