Trong đuôi -f, làm cách nào để lọc ra những thứ có từ khóa nhất định?


Câu trả lời:


58

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ư dmouratiCaleb đã chỉ ra, bạn cũng có thể sử dụng egrepthay 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 -Etắc. Tuy nhiên, theo trang man grep GNU:

[V]] hai chương trình biến thể egrepfgrepcó sẵn. egrepcũng giống như grep -E. fgrepcũng giống như grep -F. Yêu cầu trực tiếp là một trong hai egrephoặc fgrepkhô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 -Ecú pháp vì phương thức khác không được chấp nhận chính thức.


Có sử dụng grep -Ethay vì egrepđảm bảo một câu trả lời trùng lặp?
Caleb

@Caleb Tôi không thấy tại sao không. Có nhiều hơn một cách để nuôi một con mèo và trang web này cho phép khả năng liệt kê tất cả
DTest

1
Có, nhưng chúng chỉ đơn thuần là liên kết với nhau, không phải là hai chương trình khác nhau với một số chức năng chồng chéo. Vì vậy, đó sẽ không phải là một 'phụ lục' (đọc: bình luận), không phải là một câu trả lời đầy đủ? Tôi đã bị hạ bệ vì vi phạm ít hơn ...
Marcin

@DTest: Theo quyền, dmourati thực sự đã đánh bại tôi trong vài giây và mặc dù anh ta không giải thích lý do anh ta xứng đáng nhận được một số tín dụng ở đây. Bạn đã đến bữa tiệc rất muộn vì cả hai chúng tôi đều có ít nhất hai lần nâng cấp trước khi bạn tham gia. Thay đổi cú pháp từ nhị phân liên kết thành đối số thường là điều bạn sẽ sử dụng nhận xét chứ không phải câu trả lời riêng. Nếu bạn muốn làn da con mèo khác nhau sử dụng sed, awk, perl, multitailhoặc ninja_foo.
Caleb

1
@DTest: Tôi đã tự do thực hiện một chỉnh sửa thực tế quan trọng cho câu trả lời của bạn để thêm một số nguồn ban đầu. Có vẻ như -E được khuyến nghị sử dụng trong tương lai, vì vậy tôi đã đánh dấu điều đó, nhưng đã xóa ghi chú của bạn về các bản phát hành không có egrep. Các bản phân phối được đề cập có egrep, nó chỉ là một nhị phân riêng thay vì một liên kết tượng trưng.
Caleb

21

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à multitailninja 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.


2
biểu thức không nên kết thúc bằng ('), không phải với (")?
bbaja42

Vâng cảm ơn đó là một lỗi đánh máy. Để giới thiệu trong tương lai vì các trang web trao đổi ngăn xếp hoạt động như wiki, đó là loại điều bạn có thể sửa chữa.
Caleb

Tôi nghĩ rằng chỉnh sửa phải hơn 6 ký tự?
Sirex

Nếu bạn không có đại diện cao, vâng, có tối thiểu 6 ký tự, nhưng trong trường hợp này, 1 ký tự là cực kỳ quan trọng. Bạn có thể buộc thay đổi thông qua việc thêm một nhận xét HTML vào phần thân. Các ký tự sẽ được tính vào giới hạn và bạn có thể lưu ý lý do tại sao bạn thực hiện thay đổi.
Caleb

@Caleb cảm ơn rất nhiều vì lời đề nghị đa nhiệm thật tuyệt vời !! Không thể tin rằng tôi đã đi rất lâu trong đời mà không có nó.
sidinderguy


3

Tại sao bạn muốn đăng nhập thông tin này?

  • Có đúng để lưu trữ?
  • Bạn có muốn thực hiện có điều kiện các tập lệnh khác nhau tùy thuộc vào các từ khóa hoặc mẫu khác nhau trong các tệp nhật ký không?

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ữ?


Thêm một cái để tham khảo về Expect, thứ mà tôi đã sử dụng cách đây khá lâu và đã hoàn toàn quên mất.
MPi
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.