Tôi muốn nhận chỉ các địa chỉ e-mail kết thúc bằng "@ xyz.nl" từ logfile thư của tôi. Để đạt được điều này tôi làm:
# tail -f /var/log/mail.log | grep --i --line-buffered "@xyz.nl" | cut -d '@' -f 1 | cut -d '<' -f 2
Bộ đệm --line với grep là cần thiết bởi vì nó sẽ đệm đầu ra của nó vì đường ống không được coi là một thiết bị đầu cuối. Grep sẽ xuất các dòng như thế này:
Aug 29 11:56:01 localhost postfix/smtp[4124]: 05491500123: to=<someone@xyz.nl>, 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)
Cắt đầu tiên sau đó thực hiện:
Aug 29 11:56:01 localhost postfix/smtp[4124]: 05491500123: to=<someone
Việc cắt thứ hai sẽ tạo ra:
someone
Tuy nhiên, dường như cắt cũng là đệm. Nếu tôi bắt đầu lệnh bằng cat thay vì đuôi -f tôi sẽ nhận được tất cả các kết quả có liên quan (ở định dạng ưa thích) từ tệp nhật ký. Nhưng tôi cần kết quả từ tệp nhật ký trong thời gian thực.
Tôi đã thử sử dụng unbuffer cho việc này:
# tail -f /var/log/mail.log | grep --i --line-buffered "@xyz.nl" | unbuffer cut -d '@' -f 1 | cut -d '<' -f 2
Cũng đã thử:
# unbuffer tail -f /var/log/mail.log | grep --i --line-buffered "@xyz.nl" | unbuffer cut -d '@' -f 1 | cut -d '<' -f 2
... sẽ loại bỏ bộ đệm 4K từ lần cắt đầu tiên . Tuy nhiên, điều này không hoạt động. Tôi biết nó là bộ đệm vì nếu tôi grep cho tên miền cục bộ của chúng tôi, nó sẽ nhận được nhiều lượt truy cập hơn, bộ đệm được lấp đầy sớm hơn và đầu ra được tạo ra sớm hơn (trong các đợt 4K).
Vì vậy, câu hỏi của tôi là: làm thế nào để tôi unbuffer cắt ?
Liên quan: Tôi biết sed và (g) awk có thể gửi địa chỉ e-mail cho tôi. Tôi đã cố gắng nhưng chưa có kết quả. Câu trả lời sử dụng sed hoặc (g) awk đều được chào đón và có thể giải quyết vấn đề trực tiếp của tôi nhưng tôi vẫn quan tâm đến câu trả lời danh nghĩa của câu hỏi làm thế nào để hủy bỏ lệnh cắt. Lệnh cắt không nói về (un) bộ đệm.
grep -oP '[^<]+(?=@xyz.nl)'
(cùng với các tùy chọn grep khác của bạn khi cần)
awk -F'[><@]' '/@xyz.nl/ {print $2}'
...