Grep nhiều mẫu phù hợp tiêu cực


14

Vì vậy, tôi có một loạt các bản ghi Apache bằng cách sử dụng định dạng nhật ký tiêu chuẩn. Tôi muốn nhận tất cả các dòng nhật ký không đến từ trình thu thập dữ liệu web.

Vì vậy, giả sử tôi có một tệp robot_potypes với các mục như

Googlebot
msnbot-media
YandexBot
bingbot

Nếu tôi chạy lệnh, grep -f robot_patterns *.logtôi sẽ nhận được tất cả các mục bằng bot khớp với các mẫu trên. Danh sách thực tế của tôi có ~ 30 mục bot và đại lý mà tôi muốn bỏ qua.

Nhưng tôi muốn tìm tất cả các mục KHÔNG phải từ bot . Vì vậy, tôi cố gắng grep -v -f robot_patterns *.logvà không có kết quả được trả về bởi grep. Đây không phải là những gì tôi mong đợi hoặc mong muốn, và tôi không tìm thấy một cách rõ ràng để có được những gì tôi muốn. Khi sử dụng -vtùy chọn kết hợp với nhiều mẫu trong một tệp, grep sẽ chỉ trả về một dòng khớp nếu nó khớp với MỌI mẫu.


Khi tôi thử điều này trên hệ thống của mình, grep -v -f có hành vi mong muốn, chỉ trả về các dòng không khớp với bất kỳ mẫu nào. Điều này là với (GNU grep) 2.14.56-1e3d. Bạn đang sử dụng grep gì?
wingbedubmariner 11/12/13

Tôi đang chạy GNU grep 2.6.3.
Zoredache

4
Tôi đã thực hiện thêm một số thử nghiệm và thấy rằng nếu có một dòng trống trong tệp mẫu thì nó sẽ khớp với mọi dòng, khiến không có dòng nào được trả về với -v. Đây không phải là vấn đề với -F tuy nhiên và -F có thể tăng tốc grep cho nhiệm vụ của bạn - có thể đáng để thử cho bạn.
wingbedubmariner

Một dòng trống rỗng! Argh ... Đó dường như là vấn đề. Nếu bạn muốn, bạn nên thêm nó như là câu trả lời.
Zoredache

Câu trả lời:


8

Nếu có một dòng trống trong tệp mẫu, nó sẽ khớp với mọi dòng, khiến không có dòng nào được trả về -v. Điều này là do các dòng được hiểu là các biểu thức chính quy và một biểu thức chính quy trống sẽ luôn khớp.

-FTuy nhiên, đây không phải là vấn đề vì grepbỏ qua các dòng trống với -F.
-Fnguyên nhân grepdiễn giải các dòng dưới dạng các chuỗi đơn giản để tìm kiếm và có thể tăng tốc grepnếu các biểu thức thông thường không cần thiết.


1
GNU fgrepbỏ qua chuỗi trống đó là một lỗi đã được sửa trong 2.19 ( cam kết 2d3832e1ff772dc1a374bfad5dcc1338350cc48b , vì vậy bạn không nên dựa vào nó.
Stéphane Chazelas

13

Bạn co thể thử:

grep -vE 'Googlebot|msnbot-media|YandexBot|bingbot' yourlogfile

2
Chào mừng bạn đến với Unix & Linux. OP có một danh sách khoảng 30 chuỗi mà anh ta muốn bỏ qua và bốn chuỗi mà anh ta trình bày làm ví dụ có độ dài trung bình mười ký tự mỗi chuỗi, do đó lệnh của bạn có thể dài hơn 300 ký tự. Điều này có thể khó duy trì (và thậm chí để đọc). Bạn có thể sửa đổi câu trả lời của mình để được điều khiển bởi danh sách các chuỗi của OP không? Bạn có thể thấy câu trả lời đã được tìm thấy? - OP đã học cách làm cho cách tiếp cận ban đầu của mình hoạt động.
G-Man nói 'Phục hồi Monica'

2
Tại sao đánh giá tiêu cực phản ứng của tôi? : /
Orsius

3
Câu trả lời chính xác. Có regex HOẶC và tùy chọn -vE rất hữu ích.
Kirt Carson

3
Đây là câu trả lời cho câu hỏi mà hầu hết mọi người có lẽ đang cố gắng giải quyết.
Perfi
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.