Tôi muốn tail -f
nhật ký của tôi. Tuy nhiên, tôi muốn lọc ra mọi thứ có các từ:
"ELB", "Pingdom", "Sức khỏe"
Tôi muốn tail -f
nhật ký của tôi. Tuy nhiên, tôi muốn lọc ra mọi thứ có các từ:
"ELB", "Pingdom", "Sức khỏe"
Câu trả lời:
Tôi không biết về việc sử dụng awk thay vì grep, nhưng điều này hiệu quả với tôi:
tail -f file.log | grep -Ev '(ELB|Pingdom|Health)'
EDIT: Như dmourati và Caleb đã chỉ ra, bạn cũng có thể sử dụng egrep
thay vì grep -E
để thuận tiện. Trên một số hệ thống, đây sẽ là một liên kết đến cùng một nhị phân, trong các hệ thống khác, một bản sao của nó được cung cấp bởi gói grep. Dù bằng cách nào, nó sống như một sự thay thế cho công -E
tắc. Tuy nhiên, theo trang man grep GNU:
[V]] hai chương trình biến thể
egrep
vàfgrep
có sẵn.egrep
cũng giống nhưgrep -E
.fgrep
cũng giống nhưgrep -F
. Yêu cầu trực tiếp là một trong haiegrep
hoặcfgrep
không được chấp nhận, nhưng được cung cấp để cho phép các ứng dụng lịch sử dựa vào chúng chạy không thay đổi.
Vì chúng là các lệnh đồng nghĩa, nên nó được ưu tiên trừ khi bạn không có egrep nào cả. Tuy nhiên, để tương thích về phía trước, nên sử dụng grep -E
cú pháp vì phương thức khác không được chấp nhận chính thức.
grep -E
thay vì egrep
đảm bảo một câu trả lời trùng lặp?
sed
, awk
, perl
, multitail
hoặc ninja_foo
.
Hãy thử chuyển nó thành egrep với một danh sách các từ bạn muốn lọc ra theo đường ống:
tail -f log_file | egrep -v 'ELB|Pingdom|Health'
Lưu ý rằng sử dụng dấu ngoặc đơn xung quanh danh sách các kết quả khớp là tùy chọn. Vì |
được coi là toán tử OR logic bởi grep cho dù nó xuất hiện như một phần của nhóm phụ hay không. '(ELB|Pingdom|Health)'
sẽ hoạt động chính xác như nhau. Đối với một số người, cú pháp có thể rõ ràng hơn; Tôi thấy việc nhập dễ dàng hơn mà không cần vì tôi có thể chuyển từ một trận đấu đơn sang danh sách các trận đấu có thể mà không cần quay lại để thêm dấu ngoặc đơn.
Đối với tín dụng bổ sung, điều đáng nói là multitail
ninja foo khi nói đến việc lọc đầu ra. Ví dụ: bạn có thể lọc các từ của mình như thế này:
multitail -e ELB -e Pingdom -e Health -f log_file
Bạn cũng có thể sử dụng nó để tô màu hoặc làm nổi bật đầu ra thay vì chỉ lọc nó.
EDit : Xem câu trả lời của DTests và các bình luận để được giải thích đầy đủ về cách egrep chỉ là một cách thay thế không dùng nữa để loại bỏ grep -E
.
Tại sao bạn muốn đăng nhập thông tin này?
Nếu bạn muốn có hành vi theo kịch bản tùy thuộc vào nội dung của tệp nhật ký, bạn có thể muốn thực hiện việc lọc của mình bằng Expect. ( http://en.wikipedia.org/wiki/Expect ) Expect là một phần mở rộng Tcl nhưng cũng có một phiên bản Python của Expect.
Expect cung cấp cho bạn công tắc chuyển đổi linh hoạt mạnh mẽ này cho phép bạn chỉ định các hành vi khác nhau tùy theo tình trạng hoặc các mẫu có trong luồng đầu vào của bạn. Ví dụ:
expect {
"password:" {
send "password\r"
}
"yes/no)?" {
send "yes\r"
set timeout -1
}
timeout {
exit
}
-re . {
exp_continue
}
eof {
exit
}
}
Vì vậy, bạn chỉ định các mẫu trong câu lệnh mong đợi và bạn chỉ định các hành vi khác nhau và bạn có thể bao bọc toàn bộ trong một vòng lặp và bạn có thể dễ dàng viết các bộ lọc rất mạnh cũng có thể ghi các phần đầu vào của bạn vào các tệp khác nhau hoặc thả hoàn toàn, hoặc thực hiện các hành động và chạy các tập lệnh khác tùy thuộc vào nội dung trong đầu vào của bạn.
Vì vậy, lý do tại sao bạn cố gắng lọc các tệp nhật ký của mình, để thực hiện hành động đối với đầu vào nhật ký hoặc chỉ vì lý do lưu trữ?