Do czego służy buforowanie linii grep?

25

Oto moje polecenie, którego używam w skrypcie do grepdanych w czasie rzeczywistym. Wydaje się, że nie pobiera poprawnie danych w czasie rzeczywistym, ponieważ po prostu brakuje niektórych linii.

tail -f <file> | fgrep "string" | sed 's/stuff//g' >> output.txt

Co zrobiłaby następująca komenda? Co to jest „buforowanie linii”?

tail -f <file> | fgrep --line-buffered "string" | sed 's/stuff//g' >> output.txt
Roboman1723
źródło

Odpowiedzi:

44

Gdy używasz nieinteraktywnie, większość standardowych poleceń obejmuje grepbufor 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 stdinz sedpolecenia, więc grepbufor jego wyjście.

Tak więc --line-bufferedopcja powodująca grepuż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ć -o0do wyłączenia bufora.

Uwaga

Cuonglm
źródło