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.
awk -F'[><@]' '/@xyz.nl/ {print $2}'
...grep -oP '[^<]+([email protected])'
(bersama dengan opsi grep lainnya sesuai kebutuhan)Jawaban:
Jika Anda menggunakan sistem menggunakan GNU Coreutils (hampir semua Linux), Anda dapat mencoba
stdbuf
:-oL
membuatnya berbaris buffer, yang sepertinya apa yang Anda inginkan.sumber