egrep

2009-09-01 14 views
5

kullanarak bir dize içeren dosyaları bulmak için Linux altında belirli bir dize içeren dosyaları bulmak istiyorum. Bir şey denedim ama başarılı olamadım:egrep

Bul. -name * .txt | egrep mystring

cevap

12

'u kullanmanız gerekmektedir. Burada dosya adlarını (find command'un çıkışı) örn. Aslında dosyaların içeriğine egrep'i çalıştırmak istersiniz.

find . -name "*.txt" -exec egrep mystring {} \; 

veya

find . -name "*.txt" -print0 | xargs -0 egrep mystring 

Kontrol find command help tek argümanlar ne kontrol etmek daha da iyi: Burada

bir alternatiflerin çift.
İlk yaklaşım her dosya için yeni bir süreç oluştururken, ikincisi egrep'e argüman olarak birden fazla dosya iletecektir; Potansiyel olarak bozuk dosya isimleriyle ilgilenmek için -print0 ve -0 bayraklarına ihtiyaç duyulur (örneğin bir dosya adı bir alan içeriyor olsa bile dosya adlarının doğru şekilde ayrılmasına izin verilir). egrep olarak çalışmayacaktır

+0

İlk komutunuzun sonunda '\ +' veya '\;' eksik. – spatz

+0

Dosya adı mistring içinde bulamaz mı? Sanırım başka bir yol arıyor. – Kevin

+0

@spatz: Yorum için teşekkürler, ben örneği düzelttim. –

2

deneyin:

find . -name '*.txt' | xargs egrep mystring 

sürümü ile iki sorun vardır: Birincisi

, *.txt ilk kabuk tarafından genişletilmiş olacak, geçerli dizinde size dosyaların bir listesini vererek Örneğin, aşağıdaki gibi bir .txt sonu:

sizin find komutunuz find . -name test.txt'a dönüşecektir. Sadece göstermek için aşağıdakileri deneyin:

[[email protected]:~]$ echo find . -name *.txt 
find . -name test.txt 
[[email protected]:~]$ 

İkincisi, egrep STDIN gelen dosya adlarını almaz. Onları argümanlara dönüştürmek için xargs

+0

şunlarla deseni çevreleyen öneririm - Kabuğun üzerinde desen eşlemesi yapmasını engellemek için tırnak içine alın. –

+0

Hepinize bu kadar kapsamlı cevaplar sağladığınız için teşekkür ederim. – Tolga

1
find . -name *.txt | egrep mystring 

*.txt dosyalara sadece yol vardır find . -name *.txt tarafından üretilen çıktı dahilinde mystring ararken olacak.

find . -name *.txt | xargs egrep mystring 
1

Sen

find . -iname *.txt -exec egrep mystring \{\} \; 
1

kullanabilirsiniz Burada ERROR ile başlayan bir çizgi var, bir bütün *.log dosyaların dosya yollarını dönecektir bir örnek:

Bunun yerine, xargs kullanabilirsiniz :

find . -name "*.log" -exec egrep -l '^ERROR' {} \; 
1

Yalnızca dosya istiyorsanız

+0

Bu işe yaramıyor. -R seçeneği, yalnızca argüman listesinde yer alıyorsa dizinlere yeniden girer. Bu durumda, bu dizinlerdeki tüm dosyalar sadece .log. Bu yöntemle herhangi bir başarı elde ederseniz, geçerli dizinde .log ile biten dosyalar vardır, çünkü kabuk * .log dosyasını ayrıştırır. –

+0

Belki "egrep -R" deseniyle "--include = *. Log."? – moala

1

egrep -R "pattern" *.log 
kullanabilirsiniz egrep gelen özyinelemeli seçeneği:

find . -type f -name '*.txt' -exec egrep -l pattern {} \; 

İsterseniz dosya ve maçları:

find . -type f -name '*.txt' -exec egrep pattern {} /dev/null \; 
İlgili konular