Làm thế nào để unbuffer cắt?


8

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.


awk -F'[><@]' '/@xyz.nl/ {print $2}'...
jasonwryan

1
thử grep -oP '[^<]+(?=@xyz.nl)'(cùng với các tùy chọn grep khác của bạn khi cần)
Sundeep

Cả hai tùy chọn awk và grep ở trên đều hoạt động như một nét duyên dáng!
Forkbeard

Câu trả lời:


16

Nếu bạn đang sử dụng hệ thống GNU Coreutils (gần như mọi Linux), bạn có thể thử stdbuf:

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

-oL làm cho nó được đệm, có vẻ như những gì bạn muốn.


Đây chính xác là những gì tôi đang tìm kiếm, cảm ơn!
Forkbeard

Không thay đổi bất cứ điều gì cho tôi vì một số lý do. :(
panzi

1
@panzi Hãy đặt câu hỏi của riêng bạn, liên kết với câu hỏi này. Vui lòng bao gồm đầy đủ chi tiết (lệnh chính xác bạn đang chạy nếu có thể, HĐH, bản phân phối và phiên bản, v.v.) Hy vọng ai đó sẽ có thể tìm ra lý do tại sao nó không hoạt động cho bạn.
derobert
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.