Đuôi một tệp nhật ký nhưng chỉ hiển thị các dòng cụ thể


29

Tôi đang theo dõi một tệp nhật ký với cờ -f. Sau đó, tôi chuyển đường này sang grep, để chỉ tìm các dòng có chứa "X". Điều đó làm việc hoàn toàn tốt. Bây giờ tôi muốn chuyển cái này một lần nữa vào một grep khác, nó sẽ loại bỏ tất cả các dòng có chứa "Y". Khi tôi thêm đường ống thứ hai, tệp sẽ ngừng làm mới và có vẻ như không có dữ liệu nào đến.

Đây là lệnh hoạt động: tail -f my_file.log | grep "X"

Đây là lệnh không: tail -f my_file.log | grep "X" | grep -v "Y"

Làm thế nào tôi nên cấu trúc này để lệnh hoạt động?


1
cố gắng làm một ống bằng một ống, thay đổi trình tự, làm tail -f file|grep -v "Y". nếu đầu ra ổn thì tiến hành nối thêm grep "X".
Aizuddin Zali

Câu trả lời:


38

Khi đầu ra của grepbộ đệm được sử dụng, hãy sử dụng --line-bufferedtùy chọn grepđể bật bộ đệm dòng:

tail -f /path/to/log | grep --line-buffered 'X' | grep -v 'Y'

Nếu bạn grepkhông có tùy chọn, bạn có thể sử dụng stdbufthay thế:

tail -f /path/to/log | stdbuf -oL grep 'X' | grep -v 'Y'

1
Tôi tự hỏi làm thế nào stdbufcho biết libstdbuf.sonhững cài đặt để sử dụng.
kasperd

@kasperd: Biến môi trường.
Nate Eldredge

1
@NateEldredge Tôi đã tìm kiếm các biến môi trường trong đầu ra từ diff -u <(env) <(stdbuf env)và không tìm thấy. Nhưng bây giờ tôi nhận ra rằng những gì tôi nên thử nghiệm là diff -u <(env) <(stdbuf -oL env).
kasperd

Tôi cũng là một loại vấn đề. trường hợp của tôi là, tôi cần in tất cả các dòng chứa 'aaa' và 'bbb'. Trên giải pháp đầu tiên không hoạt động. Giải pháp thứ hai đang hoạt động cho 'aaa' tồn tại và 'bbb' không tồn tại. Cả hai tồn tại không hoạt động. không cho đầu ra. Lệnh của tôi trông như thế này: tail -f test.txt | stdbuf -oL grep 'aaa' | grep 'bbb' nó không cho bất kỳ đầu ra nào. Liệu bạn có thể giúp mình không.
CN

18

Tôi thường thấy hữu ích hơn awkcho các loại kiểm tra logic này:

tail -f /path/to/log | awk '/X/ && !/Y/'
#                           ^^^    ^^^^
#                   this I want    but not this

Đã kiểm tra bằng cách có hai tab, một tab trong đó tôi tiếp tục viết seq 20 >> myfilevà một tab khác có ví dụ tail -f myfile | awk '/3/ && !/13/'.


15

Một cách tiếp cận khác là sử dụng một lệnh grepgọi duy nhất thay vì hai và vì vậy tránh vấn đề đệm. Chỉ cần sử dụng một biểu thức thông thường khớp với các dòng bao gồm 0 hoặc nhiều ký tự không phải là Y, sau đó là X và sau đó 0 hoặc nhiều hơn không phải là Y nữa cho đến cuối dòng "

tail -f /path/to/log | grep '^[^Y]*X[^Y]*$'
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.