Grep'den awk'ye boru bağlantısı çalışmıyor


34

grepDevam eden taildosya günlüğüne çalışıyorum ve nth kelimesini bir satırdan alıyorum . Örnek dosya:

$ cat > test.txt <<EOL
Beam goes blah
John goes hey
Beam goes what?
John goes forget it
Beam goes okay
Beam goes bye
EOL
^C

Şimdi eğer bir şey yaparsam tail:

$ tail -f test.txt
Beam goes blah
John goes hey
Beam goes what?
John goes forget it
Beam goes okay
Beam goes bye
^C

Ben ise grepo tail:

$ tail -f test.txt | grep Beam
Beam goes blah
Beam goes what?
Beam goes okay
Beam goes bye
^C

Ama eğer ben awko grep:

$ tail -f test.txt | grep Beam | awk '{print $3}'

Ne kadar beklersem sorun değil. Derenin çalışma şekliyle ilgili olduğundan şüpheliyim.

Bir fikri olan var mı?

Yanıtlar:


55

Muhtemelen grep'ten çıkış tamponlamadır. ile devre dışı bırakabilirsiniz grep --line-buffered.

Fakat çıktıyı grep'ten awk'ye yönlendirmeniz gerekmez. awk, kendi kendine eşleşen regexp desenini yapabilir.

tail -f test.txt | awk '/Beam/ {print $3}'


8

tail -f test.txt | awk '/Beam/{print $3}'Benim için eserleri kullanmak . Kullanmanın yanı sıra tail -f test.txt | grep --line-buffered Beam | awk '{print $3}'(gnu grep).

Buradaki sorun awk, veri satır satır veya daha büyük bir veri bloğu olarak alınmışsadır. Grep'in GNU sürümü daha verimli olduğu için daha büyük bloklar halinde çıktı gönderir, ancak awksatır satır çıktı almak için satır satır okumak gerekir.

Bu şekilde koyun: grepyalnızca tampon dolduğunda veri gönderir, awk bu tamponun doldurulmasını bekler, bu yüzden hiçbir şey göndermez.


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.