Làm thế nào tôi có thể loại trừ một từ với grep?


Câu trả lời:


802

Bạn có thể làm điều đó bằng cách sử dụng tùy chọn -v(for --invert-match) của grep như:

grep -v "unwanted_word" file | grep XXXXXXXX

grep -v "unwanted_word" filesẽ lọc các dòng có unwanted_wordgrep XXXXXXXXsẽ chỉ liệt kê các dòng có mẫu XXXXXXXX.

BIÊN TẬP:

Từ nhận xét của bạn, có vẻ như bạn muốn liệt kê tất cả các dòng mà không có unwanted_word. Trong trường hợp đó, tất cả những gì bạn cần là:

grep -v 'unwanted_word' file

2
Điều gì xảy ra nếu tôi muốn loại trừ N dòng sau dòng có "từ không mong muốn"? -v 'unwanted_word' --after Nkhông giúp đỡ vì nó bao gồm dòng và N dòng sau.
Andrey Regentov

-vhoặc --invert-matchchọn các dòng không khớp. Trong trường hợp của bạn grep -v 'unwanted_word' filehay grep --invert-match 'unwanted_word' file.
adamski.pro

Tôi muốn bỏ qua một dòng ở trên và một dòng bên dưới với mẫu phù hợp thì làm thế nào tôi có thể đạt được nó?
Kanji Viroja

Thật tuyệt vời, tôi sử dụng điều này trong git để nhanh chóng kiểm tra trạng thái của repo của tôi, hoạt động như một cơ duyên:git status -s |grep -v "folder_I_dont_care"
benjaminz

3
Thật kỳ lạ, đó là câu trả lời hàng đầu, nhưng trong một số trường hợp, điều đó là sai! Nếu tôi muốn tìm sun, ngoại trừ khi có sunrise, grep sun|grep -v sunrisebỏ qua dòng chứa cả hai sunsunrisecùng một lúc, đó không phải là điều tôi muốn. grep -P 'sun(?!rise)'tốt hơn nhiều
greene

86

Tôi hiểu câu hỏi là "Làm thế nào để tôi ghép một từ nhưng loại trừ một từ khác", trong đó một giải pháp là hai greps trong chuỗi: grep đầu tiên tìm "word1" mong muốn, grep thứ hai không bao gồm "word2":

grep "word1" | grep -v "word2"

Trong trường hợp của tôi: Tôi cần phân biệt giữa "cốt truyện" và "#plot" mà tùy chọn "từ" của grep sẽ không làm ("#" không phải là một chữ số).

Hi vọng điêu nay co ich.


16
Bạn nên đảo ngược thứ tự để làm nổi bật trên word1.
Matthew đọc

1
Tôi đoán nó sẽ làm rõ để thêm một trình giữ chỗ cho tên tệp vào ví dụ đó
patrick

39

Nếu grephỗ trợ biểu thức chính quy Perl của bạn với -Ptùy chọn bạn có thể làm (nếu bash; nếu tcsh bạn sẽ cần phải thoát !):

grep -P '(?!.*unwanted_word)keyword' file

Bản giới thiệu:

$ cat file
foo1
foo2
foo3
foo4
bar
baz

Bây giờ chúng tôi liệt kê tất cả foongoại trừfoo3

$ grep -P '(?!.*foo3)foo' file
foo1
foo2
foo4
$ 

Cảm ơn vì điều này, rất hữu ích! Tôi muốn đề cập rằng lệnh grep mặc định
phân biệt chữ hoa chữ thường

2
Lưu ý rằng grep -v -Pcũng hoạt động mà không phủ định trong biểu thức thông thường.
cybersoft

"Nếu bash ... bạn sẽ cần phải thoát !" . Cảm ơn bạn, cảm ơn bạn, cảm ơn bạn! Đó là cái mà tôi đã muốn!
Gabriel Staples

36

Giải pháp đúng là sử dụng grep -v "word" file, với awktương đương:

awk '!/word/' file

Tuy nhiên, nếu bạn tình cờ có một tình huống phức tạp hơn mà bạn muốn, giả sử, XXXxuất hiện và YYY không xuất hiện, thì sẽ awkcó ích thay vì đường ống vài greps:

awk '/XXX/ && !/YYY/' file
#    ^^^^^    ^^^^^^
# I want it      |
#            I don't want it

Bạn thậm chí có thể nói một cái gì đó phức tạp hơn. Ví dụ: Tôi muốn những dòng này chứa XXXhoặc YYY, nhưng không ZZZ:

awk '(/XXX/ || /YYY/) && !/ZZZ/' file

Vân vân.


2
Nó dường như nhanh hơn nhiều so với grep -Pgiải pháp trên các tệp lớn.
MBR

@MBR grep -Pcó nghĩa là sử dụng regl Perl, vì vậy việc tải gói đó sẽ đắt hơn bình thường grep.
fedorqui 'SO ngừng gây hại'

10

Đảo ngược trận đấu bằng grep -v:

grep -v "unwanted word" file pattern

6

grep cung cấp tùy chọn '-v' hoặc '--invert-match' để chọn các dòng không khớp.

ví dụ

grep -v 'unwanted_pattern' file_name

Điều này sẽ xuất ra tất cả các dòng từ tệp file_name, không có 'không mong muốn'.

Nếu bạn đang tìm kiếm mẫu trong nhiều tệp trong một thư mục, bạn có thể sử dụng tùy chọn tìm kiếm đệ quy như sau

grep -r 'wanted_pattern' * | grep -v 'unwanted_pattern'

Ở đây grep sẽ cố gắng liệt kê tất cả các lần xuất hiện của 'Want_potype' trong tất cả các tệp từ trong thư mục hiện tại và chuyển nó đến grep thứ hai để lọc ra 'không mong muốn'. '|' - pipe sẽ báo shell để kết nối đầu ra tiêu chuẩn của chương trình bên trái (grep -r 'Want_potype' *) với đầu vào tiêu chuẩn của chương trình bên phải (grep -v 'không mong muốn').


4

Các -vtùy chọn sẽ cho bạn thấy tất cả các dòng không phù hợp với mô hình.

grep -v ^unwanted_word

-5

Tôi có một thư mục với một loạt các tập tin. Tôi muốn tìm tất cả các tệp KHÔNG chứa chuỗi "tăng tốc" vì vậy tôi đã sử dụng thành công lệnh sau:

grep -iL speedup *

1
Từ trang man: "-L, --files-without-match Bỏ đầu ra bình thường, thay vào đó hãy in tên của từng tệp đầu vào mà không có đầu ra nào thường được in. Quá trình quét sẽ dừng ở lần khớp đầu tiên. " (Nhấn mạnh bởi tôi) Vì vậy, hãy cẩn thận về điều này!
xuiqzy
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.