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.