Grep ile bir kelimeyi nasıl hariç tutabilirim?


Yanıtlar:


802

Bunu grep -v(for --invert-match) seçeneğini kullanarak şu şekilde yapabilirsiniz :

grep -v "unwanted_word" file | grep XXXXXXXX

grep -v "unwanted_word" fileolan satırlara filtre uygular unwanted_wordve grep XXXXXXXXyalnızca desenli satırları listeler XXXXXXXX.

DÜZENLE:

Yorumunuzdan, tüm satırları unwanted_word. Bu durumda ihtiyacınız olan tek şey:

grep -v 'unwanted_word' file

2
N satırını satırdan sonra "istenmeyen kelime" ile hariç tutmak istersem ne olur? -v 'unwanted_word' --after Nyardımcı olmaz çünkü satır ve N satırları DAHİLDİR.
Andrey Regentov

-vveya --invert-matcheşleşmeyen satırları seçin. Sizin durumunuzda grep -v 'unwanted_word' fileveya grep --invert-match 'unwanted_word' file.
adamski.pro

Yukarıdaki bir satırı ve aşağıdaki bir satırı eşleşen desenle yok saymak istiyorum, o zaman Nasıl başarabilirim?
Kanji Viroja

Müthiş, hızlıca benim repo durumunu incelemek için git, bunu bir cazibe gibi çalışır:git status -s |grep -v "folder_I_dont_care"
benjaminz

3
Tuhaf, en iyi cevap, ama bazı durumlarda yanlış! Ben bulmak istiyorsanız sunöyle durumlar hariç, sunrise, grep sun|grep -v sunriseher ikisini de içerir çizgi atlar sunve sunriseben istemiyorum ne olduğunu, bir kerede. grep -P 'sun(?!rise)'daha iyi.
greene

86

Soruyu "Bir kelimeyi nasıl eşleştirebilirim ama başka bir kelimeyi hariç tutabilirim" şeklinde anladım, bunun için bir çözüm seri iki grepstir: İlk grep aranan "word1", ikinci grep "word2" hariç:

grep "word1" | grep -v "word2"

Benim durumumda: "plot" ile "#plot" arasında ayrım yapmam gerekiyor ki bu grep'in "word" seçeneği işe yaramayacak ("#" alfasayısal değil).

Bu yardımcı olur umarım.


16
Vurgulamak için sırayı tersine çevirmelisiniz word1.
Matthew,

1
Sanırım bu örneğe dosya adı için bir yer tutucu eklemeyi açıklığa kavuşturabilir
Patrick

39

Senin Eğer grepdestekleri ile normal ifadeyi Perl -Pseçenek size (eğer bash; kaçmak gerekir tcsh eğer yapabilirsiniz !):

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

Demo:

$ cat file
foo1
foo2
foo3
foo4
bar
baz

Şimdi foohariç her şeyi listeleyelimfoo3

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

Bunun için teşekkürler, çok faydalı! Grep komutunun varsayılan olarak büyük / küçük harfe duyarlı olduğunu belirtmek isterim
DocWiki

2
Bunun grep -v -Pnormal ifadede olumsuzlama olmadan da çalıştığını unutmayın .
cybersoft

"eğer bash ... kaçmak zorundasın !" . Teşekkürler teşekkürler teşekkürler! İstediğim bu!
Gabriel Staples

36

Doğru çözüm kullanımına olan grep -v "word" fileonun ile awkeşdeğer:

awk '!/word/' file

Sen, sen diyelim ki, istediğiniz daha karmaşık bir durum var için olur, ancak, XXXgörünmesini ve YYY değil görünmesini, daha sonra awkyerine birkaç borulama kullanışlı geliyor greps:

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

Hatta daha karmaşık bir şey bile söyleyebilirsiniz. Örneğin: Ben bu satırları ya içeren istiyorum XXXya YYYama ZZZ:

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

vb.


2
grep -PBüyük dosyalardaki çözümden çok daha hızlı görünüyor .
MBR

@MBR grep -PPerl regexp kullanmak anlamına gelir, bu yüzden bu paketi yüklemek normalden çok daha pahalı olacaktır grep.
fedorqui 'SO'ya zarar vermeyi durdur'

10

Eşleşmeyi grep -v kullanarak ters çevir:

grep -v "unwanted word" file pattern

6

grep, eşleşmeyen satırları seçmek için '-v' veya '--invert-match' seçeneği sunar.

Örneğin

grep -v 'unwanted_pattern' file_name

Bu, dosya_adı dosyasındaki 'istenmeyen_ desen' içermeyen tüm satırları çıktılar.

Deseni bir klasör içindeki birden fazla dosyada arıyorsanız, özyinelemeli arama seçeneğini aşağıdaki gibi kullanabilirsiniz

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

Burada grep, şu anki dizindeki tüm dosyalarda 'wanted_pattern' in tüm örneklerini listelemeye ve 'istenmeyen_pattern'i' filtrelemek için ikinci grep'e aktarmaya çalışacaktır. '|' - boru kabuğa sol programın standart çıktısını (grep -r 'wanted_pattern' *) sağ programın standart girdisine (grep -v 'istenmeyen_pattern') bağlamasını söyler.


4

-vSeçenek, şablon ile eşleşmeyen tüm satırları gösterecektir.

grep -v ^unwanted_word

-5

Bir sürü dosya içeren bir dizinim var. Ben aşağıdaki komutu başarıyla kullandım "speedup" dizesini içermiyor tüm dosyaları bulmak istiyorum:

grep -iL speedup *

1
Man sayfasından: "-L, --folsüz-eşleşmesiz Normal çıktıyı bastırın; bunun yerine normalde hiçbir çıktı yazdırılmayacak olan her girdi dosyasının adını yazdırın. Tarama ilk eşleşmede duracaktır. " (Vurgu Bu yüzden buna dikkat et!
xuiqzy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.