2014-10-10 13 views
5

Tôi có một tệp nhật ký lớn mà tôi đang cố gắng quét nó cho một từ cụ thể. Nói chung, tôi sẽ có vài từ mà tôi cần phải grep trên tập tin đăng nhập lớn của tôi và in ra dòng có chứa những từ đó.Cách grep cho các dòng có chứa các từ cụ thể trong tệp nhật ký?

Tôi biết cách thực hiện grep đơn giản trên tệp. Giả sử nếu tên tệp của tôi là abc.log và tôi cần phải tìm một dòng có chứa từ "hello" thì tôi luôn làm như thế này và nó in ra dòng cho tôi.

grep -i "hello" abc.log 

Nhưng tôi không biết cách thực hiện grep để kết hợp các từ. Có nghĩa là tôi sẽ có danh sách các từ và tôi sẽ quét tệp abc.log của tôi cho tất cả các từ đó và tôi sẽ in ra các dòng có chứa các từ riêng lẻ.

#!/bin/bash 

data="hello,world,tester" 

# find all the lines which contains word hello or world or tester 

Vì vậy, trong shell script ở trên của tôi, tôi sẽ chia biến dữ liệu của tôi và tìm kiếm chào từ trong abc.log vì vậy bất kỳ dòng chứa chào từ, tôi sẽ in ra và tương tự với thế giới và thử nghiệm là tốt.

Tôi đang cố gắng thực hiện điều này khá chung chung để tôi chỉ cần thêm danh sách các từ trong biến dữ liệu mà không cần chạm vào lôgic thực tế của việc nhập nhật ký.

Trả lời

6

Nếu bạn lưu trữ các mẫu của bạn trong một tập tin, một dòng cho mỗi, bạn có thể sử dụng grep -f file-with-patterns file-to-search.log

Từ trang người đàn ông:

-f FILE, --file=FILE 
      Obtain patterns from FILE, one per line. The empty file 
      contains zero patterns, and therefore matches nothing. (-f is 
      specified by POSIX.) 
+0

nhờ o11c. Trong trường hợp của tôi mẫu có thể phát triển rất nhiều để phương pháp tiếp cận tập tin là tốt, nhưng tôi muốn thêm một điều nữa trong này - không in ra dòng nếu nó có chứa một từ cụ thể. Làm thế nào tôi sẽ làm điều này với cách tiếp cận hiện tại của bạn? – john

+0

@ user2809564 ống đầu tiên 'grep' thông qua' grep -v wordtoexclude' (hoặc '-e' hoặc' -f', vv) – o11c

+0

Cảm ơn. Có thể tôi cũng có thể có nhiều mẫu để loại trừ như vậy có cách nào để tạo một tệp có mẫu và mẫu để loại trừ và sau đó sử dụng tệp này để làm grep không? – john

6

Tôi sẽ sử dụng một biểu thức chính quy, như thế này:

grep -E 'hello|world|tester' abc.log 
+0

Cảm ơn rất nhiều bruchowski. Nó hoạt động tốt. Trong trường hợp của tôi, tôi có thể có nhiều hơn ba mẫu, vì vậy tôi đã nghĩ đến việc lưu trữ nó trong một biến giống như tôi đã thể hiện trong câu hỏi của mình và sau đó chia biến đó và bắt đầu grepping nó hoặc lưu nó trong một tệp. Bạn có nghĩ rằng bất kỳ cách nào tốt hơn để làm điều này chung trong một kịch bản shell? – john

+0

@ user2809564 vì có giới hạn về độ dài của đối số dòng lệnh, cách tiếp cận này sẽ * cuối cùng * không thành công ở nơi tệp sẽ không. Tôi không chắc liệu tập dữ liệu của bạn có * lớn * mặc dù không. – o11c

+0

@ user2809564 hoặc là một cách tiếp cận tốt. Nếu bạn không có kế hoạch có quá nhiều chuỗi để tìm kiếm thì tôi có thể đi theo cách tiếp cận nội tuyến này và chỉ tham gia một loạt các thuật ngữ trên '|', nếu không câu trả lời @ o11c sẽ hoạt động tốt cho bạn – bruchowski

0

Ngoài số bruchowski's answer, bạn cũng có thể sử dụng:

grep -i -e "hello" -e "world" -e "tester" abc.log 

HOẶC

grep 'hello\|world\|tester' abc.log 

HOẶC

egrep 'hello|world|tester' abc.log 
Các vấn đề liên quan