그렙 라인 버퍼링은 무엇을합니까?


25

다음은 스크립트에서 grep실시간 데이터 를 사용하는 명령입니다 . 그것은 단지 일부 라인을 놓치므로 실시간 데이터를 올바르게 가져 오는 것 같지 않습니다.

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

다음 명령은 무엇을합니까? "라인 버퍼링"이란 무엇입니까?

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

답변:


44

비 대화식으로 사용하는 경우 대부분의 표준 명령 grep은 출력을 버퍼링합니다. 즉, 데이터를 즉시 쓰지 않습니다 stdout. 쓰기 전에 많은 양의 데이터를 수집합니다 (OS의 경우 Linux, 종종 4096 바이트).

명령에서 grep의 출력은 파이프됩니다 stdinsed때문에, 명령 grep출력 버퍼.

따라서 라인 버퍼를 사용하는 --line-buffered옵션 grep은 기본적으로 4096 바이트에 도달하기를 기다리는 대신 줄 바꿈을 볼 때마다 출력을 쓰는 것을 의미합니다. 그러나이 경우, 당신은 필요하지 않습니다 grep전혀, 단지 사용 tail+ sed:

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

버퍼를 수정하는 옵션이없는 명령으로 GNU coreutils stdbuf를 사용할 수 있습니다

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

라인 버퍼링을 켜거나 -o0버퍼를 비활성화 하는 데 사용합니다.

노트

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.