Apa yang dilakukan buffering grep line?

25

Inilah perintah saya yang saya gunakan dalam skrip untuk grepdata waktu-nyata. Tampaknya tidak menarik data real-time dengan benar karena hanya melewatkan beberapa baris.

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

Apa yang akan dilakukan perintah berikut? Apa itu "line buffering"?

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

Jawaban:

44

Saat menggunakan non-interaktif, sebagian besar perintah standar, termasuk grep, buffer output, artinya tidak segera menulis data stdout. Ia mengumpulkan sejumlah besar data (tergantung pada OS, di Linux, sering 4096 byte) sebelum menulis.

Dalam perintah Anda, grep's output yang disalurkan ke stdindari sedperintah, sehingga grepbuffer output-nya.

Jadi, --line-bufferedopsi yang menyebabkan grepmenggunakan buffer garis, artinya menulis keluaran setiap kali melihat baris baru, alih-alih menunggu untuk mencapai 4.096 byte secara default. Tetapi dalam hal ini, Anda tidak perlu grepsama sekali, cukup gunakan tail+ sed:

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

Dengan perintah yang tidak memiliki opsi untuk memodifikasi buffer, Anda dapat menggunakan GNU coreutils stdbuf

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

untuk mengaktifkan buffering garis atau gunakan -o0untuk menonaktifkan buffer.

Catatan

cuonglm
sumber