Câu trả lời:
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" file
sẽ lọc các dòng có unwanted_word
và grep XXXXXXXX
sẽ 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
-v 'unwanted_word' --after N
không giúp đỡ vì nó bao gồm dòng và N dòng sau.
-v
hoặc --invert-match
chọn các dòng không khớp. Trong trường hợp của bạn grep -v 'unwanted_word' file
hay grep --invert-match 'unwanted_word' file
.
git status -s |grep -v "folder_I_dont_care"
sun
, ngoại trừ khi có sunrise
, grep sun|grep -v sunrise
bỏ qua dòng chứa cả hai sun
và sunrise
cù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
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.
word1
.
Nếu grep
hỗ trợ biểu thức chính quy Perl của bạn với -P
tù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ả foo
ngoại trừfoo3
$ grep -P '(?!.*foo3)foo' file
foo1
foo2
foo4
$
grep -v -P
cũng hoạt động mà không phủ định trong biểu thức thông thường.
!
" . Cảm ơn bạn, cảm ơn bạn, cảm ơn bạn! Đó là cái mà tôi đã muốn!
Giải pháp đúng là sử dụng grep -v "word" file
, với awk
tươ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ử, XXX
xuất hiện và YYY
không xuất hiện, thì sẽ awk
có ích thay vì đường ống vài grep
s:
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 XXX
hoặc YYY
, nhưng không ZZZ
:
awk '(/XXX/ || /YYY/) && !/ZZZ/' file
Vân vân.
grep -P
giải pháp trên các tệp lớn.
grep -P
có 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
.
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').
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 *
grep -Rv "word_to_be_ignored" . | grep "word_to_be_searched"