grep eşleşmeyen dosya görünümünü nasıl bastırılır?


12

Kullanarak belirli bir kelime içeren dosyaları bulmaya çalışıyorum grep. Dizinde çok sayıda dosya var (> 500)

Çalıştırdığım Komut

$ grep 'delete' *

Çıktı

validate_data_stage1:0
validate_data_stage2:0
validate_data_stage3:0
validate_data_stage4:0
validate_data_stage5:0
validate_input_stage1:0
validate_input_stage2:0
validate_input_stage3:0
validate_input_stage4:0
.... and hundred of such lines

Bunlar, verilen eşleşmeyi içermeyen dosyalardır. Bu çizgileri göstermeden stdout'a kadar bastırmak istiyorum. Geçişi biliyorum -q, ama bu istemediğim tüm çıktıyı bastıracaktı.

Bunu nasıl yaparım?


2
Normalde, grepeşleşmeyen dosyaların dosya adlarını yazdırmamalıdır. Aslında, grepiçeriğin 0eşleştiği bir satırı ele alıyor gibi görünüyor . Tam olarak kullandığınız arama modelini gönderebilir misiniz?
Adrian Heine

Kullandığım grep cmd tamdı grep 'delete' * -R, ama -Rherhangi bir soruna neden olduğunu sanmıyorum . Ve evet, normalde eşleşmeyenleri yazdırmıyor, ancak burada durumun ne olduğundan emin değil ...
mtk

@step @everyone .. Tuhaf ... Yukarıdaki düzenlenen gönderiyi gördükten sonra. Denedim grep -- 'delete' *(ekledi --) ve beklendiği gibi çalıştı. Çıkarılması --yukarıdaki ekrana götürür.
mtk

1
@Stephane Gerçekten haklısın. Dir aradım ... ve adında bir dosya vardı -ci. Sorunu çözdüğünüz için teşekkür ederiz. Bu senaryoyu yanıt olarak gönderebilirsiniz.
mtk

Yanıtlar:


9

Bu, sergilenen davranış grep -c.

Muhtemelen adı ile başlayan -ve bir ckarakter içeren bir dosyanız var ve POSIXLY_CORRECTortam değişkenini ayarlamadan GNU grep kullanıyorsunuz .

kullanın:

grep -- delete *

ya da daha iyisi:

grep delete ./*

--seçeneklerin sonunu, dosya adının bir seçenek olarak değerlendirilmemesi için işaretler (POSIX grep ile, seçenek olmayan deleteargüman seçeneklerin sonunu işaretlediğinden beri olmaz), ancak sorunu çözmez. adlı bir dosya -. grep delete ./*Daha sağlamdır ama ekstra çıkışı çekincesi vardır ./(yani satır karakterler içeren dosya adlarını belirlemesine yardımcı beri bu bonus düşünülebilir olsa da) eşleştirme dosyaları için.


13

Ekle

| grep -v ':0$'

Çok zarif değil ama bence iş yapacak.

-lKomutunuza eklediğinizde yalnızca eşleşmeler elde edersiniz, ancak her dosya için eşleşmelerin yazdırılma sayısı da bastırılır.


1
-lçalıştı. geçici çözüm de iyidir. Teşekkürler
mtk

4
grep satırı, grep -v ':0$'yalnızca bir satırın sonundakiyle eşleşmelidir (ancak, grep -lsatır sayılarına ihtiyacınız olmadığı sürece yaklaşım çok daha iyidir)
mreithub

9

Kullanma grep -lYalnızca en az bir maç içeren dosyaları alacak sizi.

Bir dosyada kaç tane eşleşme olduğu hakkında bilgiye mi ihtiyacınız var? Çünkü -cbir dosyadaki eşleşme sayısını saymak için kullanılanı atlayabilirsiniz .

edit: Ve warlock gibi -Iikili dosyalarda maçlar bastırmak için kullanarak da iyi bir fikir olabilir.


0

Sıfır olmayan sayıları grep nasıl:

grep -rIcH 'string' . | grep -v ':0$'

  • -r Recurse alt dizinleri.
  • -Iİkili dosyaları yoksay (teşekkürler @tongpu , büyücü) .
  • -cMaç sayısını göster. Can sıkıcı bir şekilde, 0-sayım dosyaları içerir.
  • -H Yalnızca bir dosya olsa bile dosya adını göster.
  • 'string' ipin buraya gelir.
  • . Geçerli dizinden başlayın.
  • | -v ':0$'0 sayımlı dosyaları kaldırın. (teşekkürler @LaurentiuRoescu )

(OP'nin istemeden -c sayımı olduğunu, ancak google (grep nonzero count) buraya geldiğini anlıyorum.)


0

Laurentiu'nun cevabına benzer şekilde, -lgrep için dosya girişleri listesini de kullanabilirsiniz :
grep -r "pattern" -c $(grep -rl "pattern")
grep'in renklendirilmesine izin verir, ancak aynı şeyi arka planda yapar


herhangi bir boşluk veya joker karakter içeren dosya adları ve dizinlerin yanlışlıkla bölüneceğini ve sonuç olarak eşleneceğini unutmayın.
Jeff Schaller
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.