grep birden çok dizeyi hariç tut


117

Tail kullanarak bir günlük dosyası görmeye çalışıyorum -fve aşağıdaki dizeleri içeren tüm satırları hariç tutmak istiyorum:

"Nopaging the limit is"`  and `"keyword to remove is"

Bunun gibi bir dizeyi hariç tutabiliyorum:

tail -f admin.log|grep -v "Nopaging the limit is"

Ancak string1veya bunlardan birini içeren satırları nasıl hariç tutabilirim string2.

Yanıtlar:


107

Grep ile birden çok satırı filtrelemenin iki örneği:

Bunu yaz filename.txt:

abc
def
ghi
jkl

grep komutu, bir dizedeki belirteçler arasında bir boru ile -E seçeneğini kullanarak:

grep -Ev 'def|jkl' filename.txt

baskılar:

abc
ghi

Parantez içinde işaretler arasında dikey çizgi ile -v seçeneğini kullanarak komut:

egrep -v '(def|jkl)' filename.txt

baskılar:

abc
ghi

15
grep -v -e def -e jkl
IMHO'nun

4
Ya da daha iyisi: grep -Fv -e def -e jklhangisi daha hızlı!
Frizlab

11
-F bayrağıyla, dikey çizgiler yerine sınırlayıcılar olarak yeni satırları kullanabilirsiniz. Bu, komut çıktısının filtre olarak daha kolay kullanılmasına izin verir, örneğin:grep -vF $(pgrep myprocess)
Phlarx

45
grep -Fv -e 'Nopaging the limit is' -e 'keyword to remove is'

-F değişmez dizelere göre eşleşir (normal ifade yerine)

-v maçı tersine çevirir

-e birden çok arama modeline izin verir (tümü gerçek ve ters çevrilmiş)


1
Doğru cevap budur: Hem birden çok grep -vörneği hem de bir normal ifadenin yapay gereksinimini ortadan kaldıran tek çözüm (birden çok dizenin ayrı bağımsız değişkenlerde net bir şekilde belirtilmesine izin verir). Herhangi bir şey içerebilecek dizeler için bir komut dosyasında bu
regex'i

Aslında bunların hiçbiri doğru cevaplar değildir, çünkü hariç tutmak için hiçbir anahtar kelime geçerken, hiçbir şey yerine her şeyi hariç tutacaktır.
Győri Sandwich

37

Diğer bir seçenek, bir dışlama listesi oluşturmaktır, bu, özellikle dışarıda bırakılacak şeyler uzun bir listeniz olduğunda faydalıdır.

vi /root/scripts/exclude_list.txt

Şimdi hariç tutmak istediklerinizi ekleyin

Nopaging the limit is
keyword to remove is

Şimdi dosya günlük dosyanızdan satırları kaldırmak ve hariç tutulmayan bilgileri görüntülemek için grep kullanın.

grep -v -f /root/scripts/exclude_list.txt /var/log/admin.log

1
Kullanabileceğin fark etmedi -vile -f(ya da ikinci hatta var olduğunu).
Sridhar Sarnobat

çok çok kullanışlı!
samaspin

Dışlama listesi için geçici dosya oluşturmanız gerekmediğini unutmayın. Bash'de işlem ikamesini kullanabilirsiniz. Hariç tutma listesi biraz dinamikse ve her kullanımdan önce onu yalnızca bir kez kullanmak için oluşturmanız gerekiyorsa bu kullanışlıdır:grep -v -f <(gen_exclusions.sh) /var/log/admin.log
Miroslav


15
tail -f admin.log|grep -v -E '(Nopaging the limit is|keyword to remove is)'

11

Normal grep'i şu şekilde kullanabilirsiniz:

tail -f admin.log | grep -v "Nopaging the limit is\|keyword to remove is"


1
Bu cevap benim için MacOSX'te çalıştı. Borudan kaçmak anahtardır
Rebecca Dessonville

5

Grepler zincirlenebilir. Örneğin:

tail -f admin.log | grep -v "Nopaging the limit is" | grep -v "keyword to remove is"

1
Buradaki püf noktası, filtreleyen süreç yerine sırayla N işlemi çalıştırmanız gerektiğidir, burada her biri bir şeyi filtrelemektedir. İşleri önemli ölçüde yavaşlatabilir.
Artem Oboturov
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.