Loại trừ nhiều mẫu với một lệnh grep


9

Tôi đã tự hỏi nếu có một cách tốt nhất để chạy lệnh sau

cat cisco.log-20151103.log | grep -v "90.192.142.138" | grep -v "PIX" | grep -v "Intrusion"

Tôi đã thử

cat cisco.log-20151103.log | grep -v "90.192.142.138|PIX|Intrusion"

nhưng nó không hoạt động.

Câu trả lời:


7

hai lựa chọn khác

grep -v -e 90.192.142.138 -e PIX -e Intrusion cisco.log-20151103.log

và giả sử các chuỗi cố định

grep -vF '90.192.142.138
PIX
Intrusion
' cisco.log-20151103.log

10

grep không nhất thiết cần đầu vào từ một đường ống, vì vậy bạn có thể làm

grep -vE '90\.192\.142\.138|PIX|Intrusion' cisco.log-20151103.log

Capital E chuyển sang chế độ biểu thức chính quy và các dấu chấm cần được thoát trong trường hợp này.


7
Điều đó nên được -Ebật ở chế độ biểu thức chính quy mở rộng , cho phép xen kẽ |các mẫu. grepkhông có -E có biểu thức chính quy và dấu chấm có ý nghĩa. Các dấu chấm đáng lẽ đã được thoát trong câu hỏi, nhưng không chắc là dãy số sẽ khớp với bất cứ thứ gì khác. grep -ftắt biểu thức thông thường.
RobertL

Các dấu chấm nên được thoát trong mọi trường hợp; ví dụ đưa ra (trong OP và câu trả lời) sẽ khớp 190.192.142.138; thật lý tưởng, phần địa chỉ IP nên được neo nếu có thể, hoặc bao gồm bất kỳ dấu phân cách nào trước địa chỉ IP trong nhật ký, giả sử dấu phẩy "," để làm cho mọi thứ rõ ràng:grep -vE ',90\.192\.142\.138,|PIX|Intrusion' cisco.log-20151103.log
Đánh dấu

2

grep -vE "90.192.142.138|PIX|Intrusion" cisco.log-20151103.log


Vì các .trận đấu bất kỳ nhân vật nào cũng phù hợp với ví dụ 90C192X142R138và đó không phải là những gì OP yêu cầu. Bạn nên thoát các ký tự đặc biệt (regex).
Anthon

0
$ grep -v -f exclude.list
$ cat exclude.list
90.192.142.138
PIX
Intrusion

Điều này hoạt động tốt, tôi không chắc tại sao ai đó đánh giá thấp nó.
Joshua Goldberg
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.