Grep kullanarak negatif eşleme (foo içermeyen eşleşme çizgileri)


990

Bu komut için sözdizimi çalışmaya çalışıyorum:

grep ! error_log | find /home/foo/public_html/ -mmin -60

VEYA:

grep '[^error_log]' | find /home/baumerf/public_html/ -mmin -60

Ben adlandırılanlar dışında değiştirilmiş tüm dosyaları görmek gerekir error_log.

Burada okudum , ama sadece bir tane not-regex deseni buldum .


13
[^ error_log] hiçbir zaman hiçbir şekilde çalışmaz, [] char sınıflarıdır, regexp'ler genel olarak negatif kalıplarda iyi değildir (motor negatif arama uçları uygulamadığı sürece).
Jaap

Yanıtlar:


1755

grep -v senin arkadaşın:

grep --help | grep invert  

-v, --invert-match eşleşen olmayan satırları seç

Ayrıca ilgili -L(tamamlayıcı -l) göz atın .

-L, --files-match olmadan yalnızca eşleşme içermeyen FILE adlarını yazdır


124
Birden fazla (negatif) eşleşme -eseçeneğinin kullanılabileceğinden bahsetmeye değer :grep -v -e 'negphrase1' -e 'negphrase2'
Babken Vardanyan

31
@ Babken-Vardanyan adlı kullanıcının yorumuna benzer Ayrıca - birden fazla maça katılmak için boruları kullanabilirsiniz örneğingrep -v 'negphrase1|negphrase2|negphrase3'
Nicholas Adams

13
Son yorum, her ikisinden de eşleşmeyen şeyleri arayacağı gibi DEĞİLDİR. yani Biriyle eşleşir ancak diğeriyle eşleşmezse hala yazdırılır. Benzer olmayan dizelerle her iki şekilde de deneyin
Evan Langlois

7
@EvanLanglois - grep'i -E, çalışmaları kullanarak deseni genişletilmiş düzenli bir ifade olarak yorumlamaya zorlamak , yani grep -vE 'negphrase1|negphrase2|negphrase3'
Zlemini

1
@ OlleHärstedt, sanırım önceki yorumumda senaryonuzu yanlış anladım, aradığınız şey olabilir grep "" /dev/null * | grep foo | grep -v bar | cut -d: -f1 | sort -u( neden ilk grep
?,

139

awkDaha karmaşık kontrolleri daha net bir şekilde gerçekleştirmenize izin verdiği için bu amaçlar için de kullanabilirsiniz :

İçermeyen satırlar foo:

awk '!/foo/'

Ne ne foode içeren satırlar bar:

awk '!/foo/ && !/bar/'

Ne içeren hatlar foo, ne de barbirini içeren foo2ya da bar2:

awk '!/foo/ && !/bar/ && (/foo2/ || /bar2/)'

Ve bunun gibi.


2
Aslında oldukça havalı. Normal ifadeyi mantıksal işleçlerle gruplandırmak için tam awk dilini öğrenmek zorunda bile değilsiniz. Bu cevap için teşekkürler!
Peter T.

1
Tam olarak aradığım şey, çok teşekkürler.
mmrs151

13

Sizin durumunuzda, muhtemelen grep kullanmak istemezsiniz, ancak find komutuna bunun yerine negatif bir cümle eklersiniz, ör.

find /home/baumerf/public_html/ -mmin -60 -not -name error_log

Adına joker karakterler eklemek istiyorsanız, örneğin .log sonekli dosyaları hariç tutmak için bunlardan kaçmanız gerekir:

find /home/baumerf/public_html/ -mmin -60 -not -name \*.log
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.