Gdy używasz nieinteraktywnie, większość standardowych poleceń obejmuje grep
bufor danych wyjściowych, co oznacza, że nie zapisuje od razu danych stdout
. Gromadzi dużą ilość danych (w zależności od systemu operacyjnego, w Linuksie, często 4096 bajtów) przed zapisem.
W swoim poleceniu grep
„s wyjściowe są przekierowane do stdin
z sed
polecenia, więc grep
bufor jego wyjście.
Tak więc --line-buffered
opcja powodująca grep
użycie bufora linii, co oznacza zapisywanie danych wyjściowych za każdym razem, gdy zobaczył nową linię, zamiast domyślnie czekać na 4096 bajtów. Ale w tym przypadku wcale nie potrzebujesz grep
, wystarczy użyć tail
+ sed
:
tail -f <file> | sed '/string/s/stuff//g' >> output.txt
Za pomocą polecenia, które nie ma opcji modyfikacji bufora, możesz użyć GNU coreutils stdbuf
tail -f <file> | stdbuf -oL fgrep "string" | sed 's/stuff//g' >> output.txt
aby włączyć buforowanie linii lub użyć -o0
do wyłączenia bufora.
Uwaga