Grep Komutu Linux'ta Nasıl Kullanılır

Linux grepkomutu, birden çok dosyadan eşleşen satırları görüntüleyen bir dize ve kalıp eşleştirme yardımcı programıdır. Ayrıca diğer komutlardan borulu çıktı ile de çalışır. Nasıl olduğunu size gösteriyoruz.

Grep'in Arkasındaki Hikaye

grepKomut üç nedenden dolayı Linux ve Unix çevrelerinde ünlüdür. Birincisi, son derece yararlıdır. İkincisi, seçeneklerin zenginliği ezici olabilir. Üçüncüsü, belirli bir ihtiyacı karşılamak için bir gecede yazılmıştır. İlk ikisi patlıyor; üçüncüsü biraz kapalıdır.

Ken Thompson, eddüzenleyiciden (ee-dee olarak telaffuz edilir) normal ifade arama yeteneklerini çıkardı ve metin dosyalarında arama yapmak için - kendi kullanımı için - küçük bir program yarattı. Bell Labs'daki bölüm başkanı Doug Mcilroy, Thompson'a yaklaştı ve meslektaşlarından biri olan Lee McMahon'un karşılaştığı sorunu anlattı.

McMahon, metin analizi yoluyla Federalist makalelerin yazarlarını belirlemeye çalışıyordu. Metin dosyalarındaki ifadeleri ve dizeleri arayabilecek bir araca ihtiyacı vardı. Thompson, o akşam yaklaşık bir saatini, aletini başkaları tarafından kullanılabilecek ve olarak yeniden adlandırılabilecek genel bir yardımcı program haline getirdi grep. Adı, "genel normal ifade araması" olarak çevrilen edkomut dizesinden aldı g/re/p.

Thompson'ın doğumu hakkında Brian Kernighan ile konuşmasını izleyebilirsiniz grep.

Grep ile Basit Aramalar

Bir dosya içinde bir dizeyi aramak için, arama terimini ve dosya adını komut satırından girin:

Eşleşen çizgiler görüntülenir. Bu durumda tek satırdır. Eşleşen metin vurgulanır. Bunun nedeni, çoğu dağıtımda greptakma adın:

takma ad grep = "grep --colour = auto"

Eşleşen birden çok satırın olduğu sonuçlara bakalım. Bir uygulama günlük dosyasında "Ortalama" kelimesini arayacağız. Günlük dosyasında sözcüğün küçük harf olup olmadığını hatırlayamadığımız için, (büyük / küçük harf kullanımını -i göz ardı et) seçeneğini kullanacağız :

grep -i Ortalama geek-1.log

Eşleşen her satır, her birinde vurgulanan eşleşen metinle görüntülenir.

Eşleşmeyen satırları -v (invert match) seçeneğini kullanarak görüntüleyebiliriz.

grep -v Mem geek-1.log

Vurgulama yoktur çünkü bunlar eşleşmeyen çizgilerdir.

grepTamamen sessiz kalmamıza neden olabiliriz . Sonuç, bir dönüş değeri olarak kabuğa iletilir grep. Sıfır araçlarla dize bir sonucu oldu bulunan ve bir aracı bir sonucu o değildi bulundu. Dönüş kodunu $?özel parametreleri kullanarak kontrol edebiliriz  :

grep -q ortalama geek-1.log
echo $?
grep -q howtogeek geek-1.log
echo $?

Grep ile Yinelemeli Aramalar

İç içe geçmiş dizinlerde ve alt dizinlerde arama yapmak için -r (özyinelemeli) seçeneğini kullanın. Komut satırında bir dosya adı belirtmediğinizi, bir yol sağlamanız gerektiğini unutmayın. Burada mevcut "" dizininde arıyoruz. ve tüm alt dizinler:

grep -r -i memfree.

Çıktı, eşleşen her satırın dizinini ve dosya adını içerir.

(Recursive dereference) seçeneğini grep  kullanarak sembolik bağları takip edebiliriz  -R. Bu dizinde adında sembolik bir bağlantımız var logs-folder. İşaret ediyor /home/dave/logs.

ls -l günlükler-klasörü

Son aramamızı  -R(yinelemeli referans) seçeneği ile tekrarlayalım:

grep -R -i memfree.

Sembolik bağlantı takip edilir ve işaret ettiği dizin de aranır grep.

Tam Kelimeleri Arama

Varsayılan olarak, greparama hedefi başka bir dizenin içinde de dahil olmak üzere bu satırın herhangi bir yerinde görünüyorsa bir satırla eşleşir. Bu örneğe bakın. "Ücretsiz" kelimesini arayacağız.

grep -i ücretsiz geek-1.log

Sonuçlar, içinde "serbest" dizesi bulunan satırlardır, ancak bunlar ayrı kelimeler değildir. "MemFree" dizesinin parçasıdırlar.

grep Yalnızca ayrı "kelimeleri" eşleştirmeye zorlamak için -w(kelime regexp) seçeneğini kullanın.

grep -w -i ücretsiz geek-1.log
echo $?

"Ücretsiz" arama terimi dosyada ayrı bir kelime olarak görünmediği için bu sefer sonuç yok.

Birden Fazla Arama Terimini Kullanma

-E(Genişletilmiş regexp) seçeneği birden kelimeleri aramak için izin verir. ( -ESeçenek, kullanımdan kaldırılmış egrepsürümünün yerini alır grep.)

Bu komut iki arama terimini, "ortalama" ve "memfree" arar.

grep -E -w -i "ortalama | memfree" geek-1.log

Arama terimlerinin her biri için eşleşen tüm satırlar görüntülenir.

Tam kelime olması gerekmeyen birden çok terimi de arayabilirsiniz, ancak bunlar da tam kelime olabilir.

-e(Desenler) seçeneği komut satırında birden fazla arama terimi kullanmasını sağlar. Bir arama modeli oluşturmak için normal ifade köşeli ayraç özelliğini kullanıyoruz. grepParantez "[]" içinde yer alan karakterlerden herhangi biriyle eşleşmeyi söyler . Bu, greparama yaparken "kB" veya "KB" ile eşleşeceği anlamına gelir .

Her iki dizge de eşleşir ve aslında bazı satırlar her iki dizeyi de içerir.

Hatları Tam Olarak Eşleştirme

-x(Hat regexp) sadece çizgileri maç olacak tüm hat arama terimi ile eşleşir. Günlük dosyasında yalnızca bir kez göründüğünü bildiğimiz bir tarih ve zaman damgası arayalım:

grep -x "20-Ocak - 06 15:24:35" geek-1.log

Eşleşen tek satır bulunur ve görüntülenir.

Bunun tersi sadece çizgiler gösteriyor yok eşleşir. Bu, yapılandırma dosyalarına bakarken yararlı olabilir. Yorumlar harika, ancak bazen gerçek ayarları hepsinin arasında tespit etmek zor. İşte /etc/sudoersdosya:

Aşağıdaki gibi yorum satırlarını etkili bir şekilde filtreleyebiliriz:

sudo grep -v "#" / etc / sudoers

Ayrıştırmak çok daha kolay.

Yalnızca Eşleşen Metin Görüntüleniyor

Tüm eşleşen satırı, yalnızca eşleşen metni görmek istemediğiniz bir durum olabilir. -o(Sadece eşleştirme) seçeneğini yok sadece.

grep -o MemFree geek-1.log

Ekran, eşleşen satırın tamamı yerine yalnızca aranan terimle eşleşen metni gösterecek şekilde küçültülür.

Grep ile sayma

grepsadece metinle ilgili değildir, sayısal bilgi de sağlayabilir. Bizim grepiçin farklı şekillerde sayabiliriz. Bir arama teriminin bir dosyada kaç kez göründüğünü bilmek istiyorsak, -c(say) seçeneğini kullanabiliriz.

grep -c ortalama geek-1.log

grep arama teriminin bu dosyada 240 kez göründüğünü bildirir.

(Satır numarası) seçeneğini grepkullanarak her eşleşen satır için satır numarasının görüntülenmesini sağlayabilirsiniz -n.

grep -n Jan geek-1.log

Eşleşen her satırın satır numarası, satırın başında görüntülenir.

Görüntülenen sonuçların sayısını azaltmak için -m(maksimum sayı) seçeneğini kullanın. Çıkışı beş eşleşen satırla sınırlayacağız:

grep -m5 -n Jan geek-1.log

Bağlam Ekleme

Her eşleşen satır için bazı ek satırları (muhtemelen eşleşmeyen satırları) görebilmek genellikle yararlıdır. hangi eşleşen hatların ilgilendiğinizi ayırt etmeye yardımcı olabilir.

Eşleşen satırdan sonra bazı satırları göstermek için -A (bağlamdan sonra) seçeneğini kullanın. Bu örnekte üç satır istiyoruz:

grep -A 3 -x "20-Ocak-06 15:24:35" geek-1.log

Eşleşen satırdan önceki bazı satırları görmek için -B(önce bağlam) seçeneğini kullanın.

grep -B 3 -x "20-Ocak-06 15:24:35" geek-1.log

Eşleşen satırdan önceki ve sonraki satırları dahil etmek için -C(bağlam) seçeneğini kullanın.

grep -C 3 -x "20-Ocak-06 15:24:35" geek-1.log

Eşleşen Dosyaları Gösterme

Arama terimini içeren dosyaların adlarını görmek için -l (eşleşmeli dosyalar) seçeneğini kullanın. Hangi C kaynak kodu dosyalarının sl.hbaşlık dosyasına referanslar içerdiğini bulmak için şu komutu kullanın:

grep -l "sl.h" * .c

Eşleşen satırlar değil dosya adları listelenir.

Ve elbette, arama terimini içermeyen dosyaları arayabiliriz. -L(Maçın olmadan dosyaları) seçeneği yok sadece.

grep -L "sl.h" * .c

Hatların Başlangıcı ve Sonu

grepSadece bir satırın başında veya sonunda olan eşleşmeleri göstermeye zorlayabiliriz . “^” Normal ifade operatörü bir satırın başlangıcıyla eşleşir. Pratik olarak günlük dosyasındaki tüm satırlar boşluk içerecektir, ancak ilk karakterleri boşluk olan satırları arayacağız:

grep "^" geek-1.log

İlk karakter olarak - satırın başında - boşluk bulunan satırlar görüntülenir.

Satırın sonunu eşleştirmek için "$" normal ifade operatörünü kullanın. "00" ile biten satırları arayacağız.

grep "00 $" geek-1.log

Ekran, son karakterleri "00" olan satırları gösterir.

Boruları grep ile kullanma

Elbette, girişi grepborulayabilir, çıktıyı grepbaşka bir programa aktarabilir ve grepbir boru zincirinin ortasına yerleştirebilirsiniz.

Diyelim ki C kaynak kodu dosyalarımızda "ExtractParameters" dizesinin tüm oluşumlarını görmek istiyoruz. Oldukça az sayıda olacağını biliyoruz, bu yüzden çıktıyı şu şekilde aktarıyoruz less:

grep "ExtractParameters" * .c | az

Çıktı olarak sunulmuştur less.

Bu, dosya listesine göz atmanıza ve less'sarama özelliğini kullanmanıza olanak tanır .

Çıktıyı grepiçeri aktarır wcve -l(satırlar) seçeneğini kullanırsak, "ExtractParameters" içeren kaynak kod dosyalarındaki satırların sayısını sayabiliriz. (Bunu grep-c(count) seçeneğini kullanarak başarabilirdik , ancak bu, borulamayı göstermenin düzgün bir yoludur grep.)

grep "ExtractParameters" * .c | wc -l

Bir sonraki komutu ile, gelen çıkış boru ediyoruz lsiçine grepve gelen çıkış boru grepiçine sort. Geçerli dizindeki dosyaları listeliyor, "Aug" dizesine sahip olanları seçiyor ve dosya boyutuna göre sıralıyoruz:

ls -l | grep "Ağu" | sırala + 4n

Bunu parçalayalım:

  • ls -l : kullanarak dosyaların uzun formatlı bir listesini gerçekleştirin ls.
  • grep "Ağu" : Listeden "Ağu" yazan satırları seçin ls. Bunun adlarında "Ağustos" geçen dosyaları da bulacağını unutmayın.
  • sort + 4n : Çıktıyı grep'den dördüncü sütunda (dosya boyutu) sıralayın.

Ağustos ayında değiştirilen tüm dosyaların (yıldan bağımsız olarak), dosya boyutuna göre artan sırada sıralanmış bir listesini alırız.

İLGİLİ: Linux'ta Borular Nasıl Kullanılır

grep: Az Komut, Daha Çok Müttefik

grepemrinizde olması için müthiş bir araçtır. 1974'ten kalma ve hala güçlü çünkü yaptığı şeye ihtiyacımız var ve hiçbir şey daha iyisini yapamaz.

grepBazı normal ifadeler-fu ile birleştirmek , onu gerçekten bir sonraki seviyeye taşır.

İLGİLİ: Daha İyi Arama Yapmak ve Zamandan Tasarruf Etmek İçin Temel Normal İfadeler Nasıl Kullanılır