grep loại trừ nhiều chuỗi


115

Tôi đang cố gắng xem tệp nhật ký bằng tail -fvà muốn loại trừ tất cả các dòng chứa các chuỗi sau:

"Nopaging the limit is"`  and `"keyword to remove is"

Tôi có thể loại trừ một chuỗi như thế này:

tail -f admin.log|grep -v "Nopaging the limit is"

Nhưng làm cách nào để loại trừ các dòng chứa một trong hai string1hoặc string2.

Câu trả lời:


106

Hai ví dụ về việc lọc ra nhiều dòng với grep:

Đặt cái này vào filename.txt:

abc
def
ghi
jkl

lệnh grep sử dụng tùy chọn -E với một đường dẫn giữa các mã thông báo trong một chuỗi:

grep -Ev 'def|jkl' filename.txt

bản in:

abc
ghi

Lệnh sử dụng tùy chọn -v với đường dẫn giữa các mã thông báo được bao quanh bởi các parens:

egrep -v '(def|jkl)' filename.txt

bản in:

abc
ghi

15
Tôi ngạc nhiên không ai nói về những grep -v -e def -e jklphương pháp mà IMHO là rõ ràng hơn ...
Frizlab

4
Hoặc thậm chí tốt hơn: grep -Fv -e def -e jklthậm chí còn nhanh hơn!
Frizlab

11
Với cờ -F, bạn có thể sử dụng các dòng mới làm dấu phân cách thay vì các đường ống. Điều này cho phép sử dụng đầu ra lệnh làm bộ lọc dễ dàng hơn, ví dụ:grep -vF $(pgrep myprocess)
Phlarx

45
grep -Fv -e 'Nopaging the limit is' -e 'keyword to remove is'

-F khớp theo chuỗi ký tự (thay vì regex)

-v đảo ngược trận đấu

-e cho phép nhiều mẫu tìm kiếm (tất cả theo nghĩa đen và đảo ngược)


1
Đây là câu trả lời đúng: Câu trả lời duy nhất tránh được cả nhiều grep -vtrường hợp và yêu cầu giả tạo của một regex (cho phép nhiều chuỗi được chỉ định rõ ràng trong các đối số riêng biệt). Chỉ cần tưởng tượng xây dựng regex mà lập trình trong một kịch bản cho các chuỗi có thể chứa bất cứ điều gì ...
user2394284

Trên thực tế, không có câu trả lời nào trong số này là câu trả lời đúng vì khi không có từ khóa nào để loại trừ, nó sẽ loại trừ mọi thứ thay vì không có gì.
Győri Sándor

37

Một tùy chọn khác là tạo danh sách loại trừ, điều này đặc biệt hữu ích khi bạn có một danh sách dài những thứ cần loại trừ.

vi /root/scripts/exclude_list.txt

Bây giờ hãy thêm những gì bạn muốn loại trừ

Nopaging the limit is
keyword to remove is

Bây giờ sử dụng grep để xóa các dòng khỏi tệp nhật ký tệp của bạn và xem thông tin không bị loại trừ.

grep -v -f /root/scripts/exclude_list.txt /var/log/admin.log

1
Tôi không nhận ra bạn có thể sử dụng -vvới -f(hoặc cái sau thậm chí còn tồn tại).
Sridhar Sarnobat,

rất rất hữu ích!
samaspin

Lưu ý rằng bạn không phải tạo tệp tạm thời cho danh sách loại trừ. Trong bash, bạn có thể sử dụng thay thế quy trình. Đây là thuận tiện nếu danh sách loại trừ là kinda động và bạn sẽ phải tạo ra nó trước mỗi lần sử dụng chỉ được sử dụng một lần:grep -v -f <(gen_exclusions.sh) /var/log/admin.log
Miroslav


15
tail -f admin.log|grep -v -E '(Nopaging the limit is|keyword to remove is)'

11

Bạn có thể sử dụng grep thông thường như thế này:

tail -f admin.log | grep -v "Nopaging the limit is\|keyword to remove is"


1
Câu trả lời này phù hợp với tôi trên MacOSX. Thoát khỏi đường ống là chìa khóa
Rebecca Dessonville

5

Các quả lựu đạn có thể được xâu chuỗi. Ví dụ:

tail -f admin.log | grep -v "Nopaging the limit is" | grep -v "keyword to remove is"

1
Điều bắt buộc ở đây là thay vì quy trình sẽ lọc ra, bạn phải chạy N quy trình tuần tự, trong đó mỗi quy trình lọc ra một thứ gì đó. Nó có thể làm chậm mọi thứ đáng kể.
Artem Oboturov,
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.