Yanıtlar:
Bunu grep -v
(for --invert-match
) seçeneğini kullanarak şu şekilde yapabilirsiniz :
grep -v "unwanted_word" file | grep XXXXXXXX
grep -v "unwanted_word" file
olan satırlara filtre uygular unwanted_word
ve grep XXXXXXXX
yalnı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
-v 'unwanted_word' --after N
yardımcı olmaz çünkü satır ve N satırları DAHİLDİR.
-v
veya --invert-match
eşleşmeyen satırları seçin. Sizin durumunuzda grep -v 'unwanted_word' file
veya grep --invert-match 'unwanted_word' file
.
git status -s |grep -v "folder_I_dont_care"
sun
öyle durumlar hariç, sunrise
, grep sun|grep -v sunrise
her ikisini de içerir çizgi atlar sun
ve sunrise
ben istemiyorum ne olduğunu, bir kerede. grep -P 'sun(?!rise)'
daha iyi.
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.
word1
.
Senin Eğer grep
destekleri ile normal ifadeyi Perl -P
seç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 foo
hariç her şeyi listeleyelimfoo3
$ grep -P '(?!.*foo3)foo' file
foo1
foo2
foo4
$
grep -v -P
normal ifadede olumsuzlama olmadan da çalıştığını unutmayın .
!
" . Teşekkürler teşekkürler teşekkürler! İstediğim bu!
Doğru çözüm kullanımına olan grep -v "word" file
onun ile awk
eşdeğer:
awk '!/word/' file
Sen, sen diyelim ki, istediğiniz daha karmaşık bir durum var için olur, ancak, XXX
görünmesini ve YYY
değil görünmesini, daha sonra awk
yerine birkaç borulama kullanışlı geliyor grep
s:
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 XXX
ya YYY
ama ZZZ
:
awk '(/XXX/ || /YYY/) && !/ZZZ/' file
vb.
grep -P
Büyük dosyalardaki çözümden çok daha hızlı görünüyor .
grep -P
Perl regexp kullanmak anlamına gelir, bu yüzden bu paketi yüklemek normalden çok daha pahalı olacaktır grep
.
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.
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 *
grep -Rv "word_to_be_ignored" . | grep "word_to_be_searched"