Perpipaan dari grep ke awk tidak berfungsi

34

Saya mencoba untuk grepyang sedang berlangsung taildari file log dan mendapatkan nkata th dari garis. File contoh:

$ 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

Sekarang jika saya melakukan 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

Jika saya grepitu tail:

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

Tetapi jika saya awkitu grep:

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

Tidak peduli berapa lama saya menunggu. Saya menduga itu ada hubungannya dengan cara aliran bekerja.

Adakah yang punya petunjuk?

Belmin Fernandez
sumber

Jawaban:

56

Mungkin keluaran buffering dari grep. Anda dapat menonaktifkannya dengan grep --line-buffered.

Tetapi Anda tidak perlu menyalurkan output dari grep ke awk. awk dapat melakukan pencocokan pola regexp dengan sendirinya.

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

cas
sumber
8

Menggunakan tail -f test.txt | awk '/Beam/{print $3}'karya untukku. Serta menggunakan tail -f test.txt | grep --line-buffered Beam | awk '{print $3}'(gnu grep).

Masalahnya di sini adalah apakah awkmenerima data baris demi baris atau sebagai satu blok data yang lebih besar. Versi GNU dari grep mengirimkan output dalam blok yang lebih besar karena lebih efisien, tetapi awkperlu membaca baris demi baris untuk menghasilkan baris demi baris.

Begini: grephanya akan mengirim data ketika buffer terisi, awk menunggu buffer itu terisi, sehingga tidak mengirimkan apa pun.

Arcege
sumber
4

Lihat --line-bufferedopsi grep.

choroba
sumber