Grep line buffering ne yapar?


25

İşte komut dosyası grepgerçek zamanlı veri için kullanıyorum benim emrim . Bazı satırları özlediğinden gerçek zamanlı verileri doğru şekilde çekmiyor gibi görünüyor.

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

Aşağıdaki komut ne yapar? "Satır arabelleği" nedir?

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

Yanıtlar:


44

Etkileşimli olmayanları kullanırken, çoğu standart komut, grepderhal veri yazmadığı anlamına gelen çıktının arabelleğe alınmasını içerir stdout. Yazmadan önce büyük miktarda veri toplar (işletim sistemine bağlı, Linux'ta, genellikle 4096 bayt).

Emriniz olarak, grep'ın çıkış taşınıyor stdinarasında sed, yani komuta grepçıkışını tampon.

Bu nedenle, --line-bufferedseçenek greparabellek kullanmaya neden olan seçenek , varsayılan olarak 4096 bayta ulaşmayı beklemek yerine, her yeni satırda çıktı çıktığında yazma anlamına gelir. Ancak bu durumda, hiç ihtiyacınız yok grep, sadece tail+ kullanın sed:

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

Tampon değiştirme seçeneği olmayan komut ile GNU coreutils stdbuf kullanabilirsiniz

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

-o0Tamponu açmak veya tamponu devre dışı bırakmak için kullanmak

Not

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.