Làm thế nào để grep cho cùng một chuỗi nhưng nhiều tệp cùng một lúc?


57

Tôi có một tập hợp các tệp nhật ký mà tôi cần xem lại và tôi muốn tìm kiếm các chuỗi cụ thể trên cùng một tệp cùng một lúc Có được không? Hiện tại tôi đang sử dụng

grep -E 'fatal|error|critical|failure|warning|' /path_to_file

Làm cách nào để sử dụng cái này và tìm kiếm chuỗi của nhiều tệp cùng một lúc? Nếu đây là một cái gì đó cần phải được viết kịch bản, ai đó có thể cung cấp một kịch bản đơn giản để làm điều này?


2
grepcó thể mất nhiều hơn một đối số tập tin.
jw013

Câu trả lời:


61
grep -E 'fatal|error|critical|failure|warning|' *.log

Làm cách nào để tôi grepbỏ qua các thư mục, nhưng vẫn kiểm tra đệ quy tất cả các tệp? grep -E 'text' **/*hoạt động, nhưng đưa ra một thông báo lỗi cho mỗi thư mục con (và sau đó kiểm tra chính xác tất cả các tệp trong đó)
Jorn

4
@Jorn, thực sự bạn nên hỏi một câu hỏi mới, nhưng hãy sử dụngfind . -type f -exec grep -E 'fatal|error|critical|failure|warning' {} +
Wildcard

20

Bạn có thể sử dụng một cái gì đó như thế này:

find . -name "*.log" | xargs grep -E 'fatal|error|critical|failure|warning|'

Điều này sẽ tìm thấy mọi tập tin với .logphần mở rộng và áp dụng greplệnh.


Đó là quá dễ dàng :) Trên thực tế tất cả các tác phẩm của tôi được .log như vậy "grep -E 'chết người | lỗi | quan trọng | thất bại | cảnh báo' * .log làm việc quá Cảm ơn.!
user53029

1
Thật là một nỗ lực lớn của sự hiểu biết / thích ứng người dùng53029!
Gilles Quenot

1
Tại sao phải bận tâm xargsvà khả năng bị phá vỡ nghiêm trọng trên khoảng trắng trong tên tệp khi bạn chỉ có thể sử dụng find . -name '*.log' -exec grep -E 'fatal|error|critical|failure|warning' {} +?
tự đại diện

16

Nếu nó đơn giản hơn, bạn chỉ có thể chỉ định từng tệp một.

grep -E 'fatal|error|critical|failure|warning' file1.log file2.log 

2
Rất đơn giản, nhưng đã tìm kiếm điều này quá lâu: 0
Adam Hughes

3

Nếu bạn cần grep trên một tập hợp các tên tệp tùy ý không thể được truy xuất bằng một biểu thức thông thường:

grep -E 'fatal|error|critical|failure|warning|' `cat<<FIN
> file1
> file2
> ...
> filen
> FIN`

Lợi thế của việc dán tên tệp lần lượt là gì? Bạn có thể biên dịch danh sách tên tệp trên một tệp văn bản và sau đó dán nó.



0

Đây là một nhiệm vụ rất tốn thời gian. Và vâng, chắc chắn cần phải được viết kịch bản nếu bạn sẽ tìm kiếm nhiều chuỗi trong nhiều nhật ký khác nhau cùng một lúc. Nhưng gần đây tôi đã phải làm điều này và nó khá đau đớn. Tuy nhiên, nó đã được thực hiện và sẵn sàng và có thể được tải xuống từ liên kết sau:

Đăng nhập Tìm kiếm Script Tải xuống

Cách làm việc này khá đơn giản.

Kịch bản 1: Giám sát MỘT chuỗi chỉ trong MỘT tệp nhật ký

./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m 'can.*t.*open' '.'  1 2 single_errCheck -ndshow

Kịch bản 2: Giám sát các chuỗi NHIỀU chỉ trong MỘT tệp nhật ký

./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m 'can.*t.*open_P_ntpd.*stat' '.'  1 2 multi_errCheck -ndshow

Kịch bản 3: Giám sát chuỗi đơn / Nhiều chuỗi trong nhiều tệp nhật ký

./logsearch.sh localhost /var/tmp/logXray autonda /var/log 60m 'can.*t.*open_P_ntpd.*stat' '.'  1 2 multi_err_multi_logCheck -ndshow

Ghi chú:

_P_ có nghĩa là HOẶC - Nó thay thế đường ống "|" biểu tượng vì ít có khả năng bạn sẽ phải tìm kiếm một chuỗi có chứa "_P_". Nếu bạn không muốn nhập "_P_", bạn chỉ có thể thay thế _P_ bằng "|".

Khi sử dụng tập lệnh này, các tham số bạn sẽ thay đổi thường xuyên là:

  1. Tệp nhật ký hoặc thư mục nhật ký sẽ được theo dõi
  2. Độ tuổi của tệp nhật ký phải được theo dõi .. không được theo dõi hoặc khám phá bất kỳ tệp nhật ký nào có dấu thời gian trên 60 phút
  3. Các chuỗi / mẫu (s) bạn muốn xem
  4. Thẻ - đây là đối số thứ hai để cuối cùng bạn phải cung cấp. Nó ghi lại số liệu thống kê về (các) tệp nhật ký mà bạn đang theo dõi trong / var / tmp / logXray
  5. Tùy chọn nhật ký -ndshow - Đây là tham số bạn muốn sử dụng nếu bạn muốn xuất các mục từ nhật ký được tìm thấy khớp với (các) mẫu bạn đã chỉ định. Nếu bạn chỉ muốn xem tổng số lượng của từng mẫu được tìm thấy, chỉ cần thay thế '-ndshow' bằng '-ndfoundmul'.

Khi sử dụng '-ndfoundmul', bạn sẽ nhận được đầu ra tương tự như:

[root@dgphxtest001]# ./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m 'can.*t.*open_P_ntpd.*stat' '.'  1 2 blahblahA -ndfoundmul
OK: [/var/log/messages][1]  /var/log/messages:P=(can_t_open=0 ntpd_stat=0)_F=(117s)_R=(228,228=0) 

Giải pháp cho vấn đề của Poster gốc: Quét nhiều chuỗi trong nhiều tệp nhật ký

./logsearch.sh localhost /var/tmp/logXray autonda /var/log 60m 'fatal_P_error_P_critical_P_failure_P_warning' '.'  1 2 multierr_logCheck -ndshow

Hệ điều hành: Điều này đã được thử nghiệm trên Ubuntu và Red Hat


0
grep -EFn "fatal|error|critical|failure|warning|search-string" /path/to/the/file/log_file?.lo* --color=auto

Điều này sẽ tìm kiếm 'gây tử vong hoặc lỗi hoặc nghiêm trọng hoặc thất bại hoặc cảnh báo hoặc chuỗi tìm kiếm' trong các tệp có tên bắt đầu bằng 'log_file?' và phần mở rộng 'lo ' * trong đường dẫn / đường dẫn / đến / tập tin / và cung cấp cho chuỗi tìm kiếm một màu ngẫu nhiên và số dòng in được tìm thấy tại.


Chắc chắn đây là một câu trả lời hoạt động, nhưng người dùng đã yêu cầu tìm kiếm bằng cách sử dụng một mẫu, bạn đã trả lời bằng một chuỗi tìm kiếm cố định. Xin lỗi, nhưng việc thêm những thứ không được yêu cầu, như đánh số dòng và tô màu kết quả không có khả năng làm cho câu trả lời có lợi hơn. Nhưng sẽ có những câu hỏi khác có khả năng có thể được trả lời các grepkỹ năng của bạn để may mắn nhất trong sự nghiệp USE của bạn!
zagrimsan

@zagrimsan đã thực hiện, tôi đã thêm -E 'gây tử vong | lỗi | nghiêm trọng | thất bại | cảnh báo |' param cho nó.
Obaid

Và này, anh ấy đặc biệt yêu cầu nhiều tệp chứ không phải mẫu tìm kiếm. Xin vui lòng đọc lại câu hỏi.
Obaid

Trích dẫn từ Q: "chuỗi tìm kiếm cụ thể" và câu hỏi hiển thị mẫu tìm kiếm (chứa nhiều chuỗi để khớp) mà anh ta sử dụng. Bạn đúng rằng tiêu đề của câu hỏi hơi khác so với những gì anh ấy thực sự yêu cầu, mặc dù. BTW -E-Fkhông thể được sử dụng cùng một lúc, chúng có xung đột (lỗi đánh máy?).
zagrimsan

0

Câu trả lời của JigarGandhi cho thấy việc sử dụng ký tự đại diện dấu hoa thị. Có nhiều hơn trong số họ và bạn có thể thấy chúng ở đây hoặc bằng cách chạy man 7 glob.

Một trong số đó tôi thấy hữu ích là phạm vi phù hợp với []. Vì hệ thống tôi làm việc tạo ra các tệp nhật ký được đánh số liên tục product.log.1 product.log.2 ... product.log.200, ví dụ , rất tiện để grep với một lệnh trên 3 hoặc 4 tệp tuần tự nhưng không nhiều hơn. Vậy đây

grep 'whatever' product.log.[5-7]

sẽ grep cho tất cả các tệp kết thúc bằng sản phẩm.log. 5, 6 hoặc 7. Ký tự đại diện không cần thiết ở cuối để câu trả lời của flickerfly có thể được đơn giản hóa thành

grep -E 'fatal|error|critical|failure|warning' file[1,2].log

Cũng lưu ý rằng các ký tự đại diện này có thể được sử dụng trong các lệnh khác cũng như trong cpví dụ.


0

Bạn cũng có thể sử dụng dấu ngoặc nhọn nếu các tệp đều nằm trong cùng một thư mục.

Xem một ví dụ

grep -E 'fatal|error|critical|failure|warning|' /var/log/{messages,secure,syslog,dmesg}

Nếu bạn thêm một s vào grep, điều này sẽ khắc phục lỗi về các tệp bị thiếu

grep -sE 'fatal|error|critical|failure|warning|' /var/log/{messages,secure,syslog,dmesg}

Tôi chỉ tự mình thử nghiệm điều này để thực hiện các lệnh hoạt động trên nhiều bản phát hành trong đó một tệp so với tệp khác do sự khác biệt của hệ điều hành.

Nhật ký thư

sudo grep -is bob@example.com /var/log/{maillog,exim_mainlog,exim_rejectlog,mail.log,mail.err,syslog}

Nhật ký thư được lưu trữ bằng cách sử dụng 2> / dev / null để thay thế cảnh báo zgrep bị thiếu .gz

sudo zgrep -is bob@example.com /var/log/{maillog*,exim_mainlog*,exim_rejectlog*,mail.log*,mail.err*,syslog*} 2>/dev/null

Tham khảo: Có cách nào để tham khảo nhiều tệp trong một thư mục mà không cần gõ lại toàn bộ đường dẫn không?

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.