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.