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 xxx
trong đó.
Làm thế nào để tiếp cận điều này?
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 xxx
trong đó.
Làm thế nào để tiếp cận điều này?
Câu trả lời:
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
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 -F
là 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 -f
và tail -F
in 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à grep
cũ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ư awk
hoặ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 đó awk
nhậ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 grep
cầu luôn tạo dòng stdout được đệm bằng cách sử dụng --line-buffered
tù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 cut
bạ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 expect
toolchain (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
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).