Làm cách nào để áp dụng bộ lọc cho đầu ra thời gian thực của `tail -f`?


60
tail -f path

Ở trên sẽ xuất sửa đổi cho tệp ngay lập tức, nhưng tôi muốn áp dụng bộ lọc cho đầu ra, chỉ hiển thị khi có từ khóa xxxtrong đó.

Làm thế nào để tiếp cận điều này?


1
Đánh dấu câu trả lời là được chấp nhận giúp những người khác đọc câu hỏi của bạn và câu trả lời của họ để biết câu trả lời nào có thể giúp họ trả lời hơn nếu họ có câu hỏi hoặc vấn đề tương tự. Bạn có thể xem lại các câu hỏi trước đó bằng cách nhấp vào tên người dùng của bạn.
Dennis Williamson

Câu trả lời:


84

Với Unix bạn có thể chuyển đầu ra của một chương trình sang một chương trình khác.

Vì vậy, để lọc đuôi, bạn có thể sử dụng grep:

tail -f path | grep your-search-filter

Nhưng giả sử bạn có 100 dòng ở cuối (cuối tệp) và những dòng này là những dòng bạn muốn lọc. Giải pháp của bạn
TraderJoeChicago

1
Nếu bạn chỉ muốn tìm kiếm 100 dòng cuối cùng của tệp, hãy thử đuôi -100 đường dẫn | grep xxx
AddersUK

15

Câu trả lời ngắn: tail -f somefile | grep somepattern

Tuy nhiên, điều này có xu hướng giảm ngắn. Giả sử bạn đang theo dõi một tệp được xoay thường xuyên (nếu đó là nhật ký gỡ lỗi, nó có thể được xoay nhiều lần). Trong trường hợp đó tail -Flà bạn của bạn. Tôi sẽ cho phép bạn tìm kiếm sự khác biệt.

Nhưng tail -ftail -Fin ra một loạt các dòng đầu tiên, thường không mong muốn trong trường hợp sử dụng này, vì vậy trong trường hợp này thêm-n0

tail -F -n0 somefile | grep somepattern

Điều đó sẽ ổn, cho đến khi bạn muốn thực hiện một số bộ lọc khác, và sau đó bạn cần cẩn thận với bộ đệm. stdout được đệm theo mặc định khi ghi vào thiết bị đầu cuối nhưng khi được đệm hoàn toàn khi ghi vào đường ống. Vì vậy, những điều sau đây sẽ phát ra các dòng ngay khi chúng được tìm thấy, bởi vì tailđược đệm một cách rõ ràng (hoặc nó tuôn ra đầu ra của nó ở cuối mỗi dòng), và grepcũng được đệm bởi vì đầu ra của nó sẽ đi đến thiết bị đầu cuối của bạn:

tail -F -n0 somefile | grep somepattern

Nhưng sau đó, bạn quyết định sử dụng một cái gì đó như awkhoặc cutđể tiếp tục xử lý đầu ra.

tail -F -n0 somefile | grep somepattern | awk '{print $3}'

Và bây giờ bạn tự hỏi đầu ra của bạn đã đi đâu ... tùy thuộc vào khối lượng nhật ký, bạn có thể thấy rằng bạn nhận được đầu ra, nhưng nó sẽ là một trang tại thời điểm đó vì hiện tại thiết bị đầu cuối grepđang hoạt động theo kiểu đệm hoàn toàn, và do đó awknhận được đầu vào 4kB tại một thời điểm (theo mặc định).

Trong trường hợp này, bạn có thể yêu grepcầu luôn tạo dòng stdout được đệm bằng cách sử dụng --line-bufferedtùy chọn.

tail -F -n0 somefile | grep --line-buffered somepattern | ...

Tuy nhiên, hầu hết các lệnh không có tương tự --line-buffered. Trong trường hợp có nhiều công cụ tập lệnh hơn, bạn có thể sử dụng một hàm để tuôn ra đầu ra (ví dụ: trong đó awk, hàm này fflush()có cùng tên với đối tác C của nó, các công cụ như Perl và Python có một cái gì đó tương tự).

Với sở thích của cutbạn, bạn có thể gặp may mắn; ... nhưng bạn có thể thử tìm kiếm unbuffer, tôi nghĩ đó là thứ được cung cấp bởi expecttoolchain (Tôi chưa bao giờ sử dụng nó).

Tôi hy vọng bạn đã tìm thấy điều này hữu ích.

Chúc mừng, Cameron


Tôi thực sự đánh giá cao lời giải thích tại sao điều này hoạt động ở chế độ đệm dòng. Đó là một cái nhìn sâu sắc tuyệt vời, cảm ơn bạn.
Xanh

2

và bạn có thể sử dụng nhiều đường ống và greps, và loại trừ những thứ có grep -v, nhận được trường hợp không nhạy cảm với grep -i, v.v.

tức là: đuôi -100f / var / log / message | grep -V ACPI | grep -i ata

bắt đầu theo đuôi 100 dòng từ cuối và tiếp tục theo đuôi, trước tiên loại trừ bất kỳ dòng nào bằng ACPI, sau đó hiển thị các dòng có ata, ATA hoặc bất kỳ kết hợp nào của các dòng đó.

Một tiện ích khác là các tùy chọn ABC, cho các dòng Sau, Trước và Ngữ cảnh (các dòng trước và sau).

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.