Bagaimana cara unbuffer cut?

8

Saya ingin mendapatkan alamat email yang diakhiri dengan "@ xyz.nl" dari file log email saya. Untuk mencapai ini saya lakukan:

# tail -f /var/log/mail.log | grep --i --line-buffered "@xyz.nl" | cut -d '@' -f 1 | cut -d '<' -f 2

--Line-buffered dengan grep diperlukan karena ia akan buffer outputnya karena pipa tidak dianggap terminal. Grep akan menampilkan baris seperti ini:

Aug 29 11:56:01 localhost postfix/smtp[4124]: 05491500123: to=<[email protected]>, relay=123.456.123.456[123.456.123.456]:25, delay=2, delays=0.4/0/0.4/1.2, dsn=2.0.0, status=sent (250 2.0.0 u7T9twxN074009 Message accepted for delivery)

Potongan pertama kemudian menghasilkan:

Aug 29 11:56:01 localhost postfix/smtp[4124]: 05491500123: to=<someone

Potongan kedua harus menghasilkan:

someone

Namun sepertinya cut juga buffering. Jika saya memulai perintah dengan cat bukannya tail -f saya mendapatkan semua hasil yang relevan (dalam format yang disukai) dari file log. Tapi saya butuh hasil dari file log secara real time.

Saya mencoba menggunakan unbuffer untuk ini:

# tail -f /var/log/mail.log | grep --i --line-buffered "@xyz.nl" | unbuffer cut -d '@' -f 1 | cut -d '<' -f 2

Juga mencoba:

# unbuffer tail -f /var/log/mail.log | grep --i --line-buffered "@xyz.nl" | unbuffer cut -d '@' -f 1 | cut -d '<' -f 2

... yang akan menghapus buffer 4K dari potongan pertama . Namun, ini tidak berhasil. Saya tahu itu buffering karena jika saya grep untuk domain lokal kami mendapat lebih banyak hits, buffer diisi lebih cepat dan output dihasilkan lebih awal (dalam batch 4K).

Jadi pertanyaan saya adalah: bagaimana cara saya unbuffer cut ?

Terkait: Saya tahu sed dan (g) awk dapat mengirimkan alamat email kepada saya. Saya sudah berusaha tetapi belum membuahkan hasil. Jawaban menggunakan sed atau (g) ​​awk dipersilahkan dan dapat memecahkan masalah langsung saya, tetapi saya tetap tertarik pada jawaban nominal dari pertanyaan bagaimana cara unbuffer perintah cut. Perintah cut tidak berbicara tentang (un) buffering.

Forkbeard
sumber
awk -F'[><@]' '/@xyz.nl/ {print $2}'...
jasonwryan
1
coba grep -oP '[^<]+([email protected])'(bersama dengan opsi grep lainnya sesuai kebutuhan)
Sundeep
Opsi awk dan grep di atas berfungsi seperti pesona!
Forkbeard

Jawaban:

16

Jika Anda menggunakan sistem menggunakan GNU Coreutils (hampir semua Linux), Anda dapat mencoba stdbuf:

… | stdbuf -oL cut -d '@' -f 1 | …

-oL membuatnya berbaris buffer, yang sepertinya apa yang Anda inginkan.

derobert
sumber
Ini persis apa yang saya cari, terima kasih!
Forkbeard
Tidak mengubah apa pun untuk saya karena alasan tertentu. :(
panzi
1
@panzi Jangan ragu untuk menanyakan pertanyaan Anda sendiri, dengan menghubungkan ke yang ini. Harap sertakan detail lengkap (perintah persis yang Anda jalankan jika memungkinkan, OS, distro, dan versi, dll.) Semoga seseorang dapat mengetahui mengapa itu tidak berhasil untuk Anda.
derobert