Örneklerle Linux’ta Grep Komutu Nasıl Kullanılır

Merhabalar,

 

Grep komutu “genel düzenli ifade yazdırma” anlamına gelir ve Linux’ta en güçlü ve yaygın olarak kullanılan komutlardan biridir.

grep, belirli bir arama pattern (kalıbı) ile  eşleşen satırlar için bir veya daha fazla girdi dosyası arar ve eşleşen her satırı standart çıktıya yazar. Hiçbir dosya belirtilmemişse, grep, genellikle başka bir komutun çıktısı olan standart girişten okur.

Bu yazıda, en yaygın GNU grep seçeneklerinin pratik örnekleri ve ayrıntılı açıklamaları aracılığıyla grep komutunun nasıl kullanılacağını anlatacağım.

 

 

Grep Komutu Söz dizimi:

Grep komutunun söz dizimi aşağıdaki gibidir.

grep [OPTIONS] PATTERN [FILE...]

Köşeli parantez içindeki öğeler isteğe bağlıdır.

OPTIONS (SEÇENEKLER) – Sıfır veya daha fazla seçenek. Grep, davranışını kontrol eden bir dizi seçenek içerir.

PATTERN DESEN – Arama deseni.

FILE – Sıfır veya daha fazla girdi dosyası adı.

Dosyayı arayabilmek için komutu çalıştıran kullanıcının dosyaya okuma erişimi olması gerekir.

 

Dosyaların İçinde  Dizin Arama:

Grep komutunun en temel kullanımı, bir dosyada bir dize (metin) aramaktır.

Örneğin, /Desktop/KOMUTLAR/GREP/linux4.txt  dosyasındaki can dizesini içeren tüm satırları görüntülemek için aşağıdaki komutu çalıştırabiliriz.

grep can linux4.txt

 

Dize boşluk içeriyorsa, onu tek veya çift tırnak içine almanız gerekir:

grep "Linux is Friends" linux4.txt

 

 

Eşleşmeyi Ters Çevir (Hariç Tut):

Bir kalıpla eşleşmeyen satırları görüntülemek için -v (veya –invert-match) seçeneğini kullanabiliriz.

Örneğin, PIM dizesini içermeyen satırları yazdırmak için aşağıdaki komutu kullanabiliriz.

grep -v PIM linux4.txt

 

 

 

Bir Komutun Çıktısını Filtrelemek için Grep Kullanma:

Bir komutun çıktısı grep yoluyla filtrelenebilir ve terminalde yalnızca eşleşen satırlar yazdırabiliriz.

Örneğin, Kemal ve Fırat kullanıcıları olarak sisteminizde hangi işlemlerin çalıştığını öğrenmek için aşağıdaki ps komutunu kullanabilirsiniz:

ps -ef | grep firatcanoglu
ps -ef | grep kemal

 

 

Ayrıca komutta birden çok boruyu zincirleyebilirsiniz. Yukarıdaki çıktıda da görebileceğiniz gibi, grep işlemini içeren bir satır da var. Bu satırın gösterilmesini istemiyorsanız, çıktıyı aşağıda gösterildiği gibi başka bir grep örneğine iletin.

ps -ef | grep root | grep -v grep

 

 

Yinelemeli olarak bir kalıp aramak için grep’i -r seçeneğiyle (veya –recursive) çağırın. Bu seçenek kullanıldığında grep, belirtilen dizindeki tüm dosyaları arayacak ve yinelemeli olarak karşılaşılan sembolik bağlantıları atlayacaktır.

Tüm sembolik bağları takip etmek için -r yerine -R seçeneğini (veya –dereference-recursive) kullanın.

grep -r Efran /home/firatcanoglu/Desktop/KOMUTLAR/GREP/

 

/home/firatcanoglu/Desktop/KOMUTLAR/GREP/ dizini içindeki tüm dosyalarda Efran ifadesini arayacak.

-R seçeneğini kullanırsanız, grep tüm sembolik bağlantıları izleyecektir.

Aşağıdaki çıktının son satırına dikkat edin. grep -r ile çağrıldığında bu satır yazdırılmaz.Çünkü grep -r sembolik bağlantıları takip etmez.

 

 

 

 

 

 

Yalnızca Dosya Adını Göster:

Varsayılan grep çıktısını bastırmak ve yalnızca eşleşen kalıbı içeren dosyaların adlarını yazdırmak için -l (veya –files-with-matches) seçeneğini kullanın.

Aşağıdaki komut, geçerli çalışma dizininde *.txt ile biten tüm dosyaları arar ve yalnızca Efran dizesini içeren dosyaların adlarını yazdırır.

grep -l Efran /home/firatcanoglu/Desktop/KOMUTLAR/GREP/*.txt

 

-l seçeneği genellikle özyinelemeli seçenek -R ile birlikte kullanılır.

 

 

 

Büyük/küçük harfe duyarsız arama:

 

Varsayılan olarak grep, büyük/küçük harf duyarlıdır. Bu, büyük ve küçük harflerin ayrı olarak ele alındığı anlamına gelir.

Arama yaparken büyük/küçük harfe dikkat etmemek için grep’i -i seçeneğiyle (veya –ignore-case) çağırın.

Örneğin, herhangi bir seçenek olmadan Efran kelimesini içereni dizini ararken, aşağıdaki komutu kullanabiliriz.

grep --ignore-case Efran /home/firatcanoglu/Desktop/KOMUTLAR/GREP/*.txt

yada

grep -i Efran /home/firatcanoglu/Desktop/KOMUTLAR/GREP/*.txt

 

Yukarıda görüldüğü gibi Efran kelimesinin bulunduğu dizinleri aradım.Büyük küçük karakter ayrımı kalktığı için EFRAN, Efran ve eFrAn  gibi tüm kelimelerin bulunduğu dizinleri ekrana  getirdi.

 

Tam Kelimeleri Ara:

Bir ifade ararken grep, dizenin daha büyük dizelere gömülü olduğu tüm satırları görüntüler.

Örneğin, “Efran” kelimesini ararsanız, “EfranKEMAL” veya “Efraneftun” gibi daha büyük kelimelerde “Efran”nın gömülü olduğu tüm satırları eşleştirir.

Yalnızca belirtilen dizenin tam bir sözcük olduğu (kelime olmayan karakterlerle çevrelenmiş) satırları döndürmek için -w (veya –word-regexp) seçeneğini kullanabiliriz.

 

Hemen deneyelim.-w parametresi olmadan grep çağırdım.Efran kelimesinin birleşik  yada tek kelime olduğu tüm satırları döndürdü.

grep Efran /home/firatcanoglu/Desktop/KOMUTLAR/GREP/linux4.txt

grep -w Efran /home/firatcanoglu/Desktop/KOMUTLAR/GREP/linux4.txt

-w seçeneği de dahil olmak üzere yukarıdakiyle aynı komutu çalıştırırsanız, grep komutu yalnızca Efran’nın ayrı bir sözcük olarak dahil edildiği satırları döndürür.

 

 

 

Satır Numaralarını Göster:

-n ( veya –line-number) seçeneği, grep’e bir kalıpla eşleşen bir dize içeren satırların satır numarasını göstermesini söyler. Bu seçenek kullanıldığında grep, eşleşmeleri satır numarası ön ekine sahip standart çıktıya yazdırır.

 

Örneğin, /home/firatcanoglu/Desktop/KOMUTLAR/GREP/linux4.txt dosyasındaki, eşleşen satır numarasının ön ekine sahip Efran dizesini içeren satırları görüntülemek için aşağıdaki komutu kullanabiliriz.

grep -n Efran /home/firatcanoglu/Desktop/KOMUTLAR/GREP/linux4.txt

 

 

Eşleşmeleri Sayma:

Standart çıktıyla eşleşen satır sayısını yazdırmak için -c (veya –count) seçeneğini kullanabiliriz.

grep -c Efran /home/firatcanoglu/Desktop/KOMUTLAR/GREP/linux4.txt

yada

grep --count Efran /home/firatcanoglu/Desktop/KOMUTLAR/GREP/linux4.txt

 

 

 

Sessiz mod:

-q (veya –quiet), grep’e standart çıktıda hiçbir şey göstermemesi için sessiz modda çalışmasını söyler. Bir eşleşme bulunursa, komut 0 durumuyla çıkar. Bu, bir dosyanın bir dize içerip içermediğini kontrol etmek ve sonuca bağlı olarak belirli bir eylemi gerçekleştirmek istediğiniz kabuk komut dosyalarında grep kullanırken kullanışlıdır.

Burada, bir if ifadesinde bir test komutu olarak sessiz modda grep kullanımına bir örnek verilmiştir.

if grep -q Efran  linux.txt
then
echo Efran bulundu
else
echo Efran bulunamadı
fi

 

 

Temel Normal İfade:

GNU Grep, Temel, Genişletilmiş ve Perl uyumlu olmak üzere üç düzenli ifade özellik kümesine sahiptir.

Varsayılan olarak grep, kalıbı, meta karakterler dışındaki tüm karakterlerin aslında kendileriyle eşleşen normal ifadeler olduğu temel bir normal ifade olarak yorumlar.

Aşağıda en sık kullanılan meta karakterlerin bir listesi bulunmaktadır.

Satırın başındaki ifadeyi eşleştirmek için ^ (şapka) sembolünü kullanın. Aşağıdaki örnekte, Efran dizesi yalnızca satırın en başında yer alıyorsa eşleşecektir.

 

Bakalım şimdi.Aşağıda görüldüğü Efran kelimesinin sadece satırın başında olduğu dizinler ekrana getirildi.Onun dışındaki satırlar dahil edilmedi.

grep "^Efran" /home/firatcanoglu/Desktop/KOMUTLAR/GREP/linux4.txt

 

 

Bir satırın sonundaki ifadeyi eşleştirmek için $ (dolar) sembolünü kullanabiliriz. Aşağıdaki örnekte,Sacide dizesi yalnızca satırın en sonunda yer alıyorsa eşleşecektir.

grep "Sacide$" /home/firatcanoglu/Desktop/KOMUTLAR/GREP/linux4.txt

 

 

 

Kullan . (period) sembolü, herhangi bir tek karakterle eşleşir. Örneğin, Ahmet ile başlayan, sonra 5 karaktere sahip olan ve Can dizesiyle biten herhangi bir şeyi eşleştirmek için aşağıdaki kalıbı kullanabiliriz.Burada dikkat edilmesi gereken başlangıç ve son kelime arasında kaç karakter varsa o kadar nokta koymalısınız.

grep "Ahmet.....Can" /home/firatcanoglu/Desktop/KOMUTLAR/GREP/linux4.txt

 

 

 

Köşeli parantez içindeki herhangi bir karakteri eşleştirmek için [ ] (köşeli parantez) kullanın. Örneğin, Ercan veya “Erhan” içeren satırları bulmak için, aşağıdaki kalıbı kullanabiliriz.

grep "Er[hc]an" /home/firatcanoglu/Desktop/KOMUTLAR/GREP/linux4.txt

 

 

 

 

Parantez içine alınmayan herhangi bir karakteri eşleştirmek için [^ ] kullanın. Aşağıdaki kalıp, co(any_letter_except_l)a içeren herhangi bir dize kombinasyonuyla, örneğin Ercan,  Erkan gibi dizileri bulacak , ancak Erhan içeren satırlarla eşleşmez neden çünkü örnekte dedim ki “h”  içermeyen dizileri sadece bul.Bakalım şimd örneğe

grep "Er[^h]an" /home/firatcanoglu/Desktop/KOMUTLAR/GREP/linux4.txt

 

 

şimdi ikinci örneğe bakalım.Burada Er ve an  heceleri arasına “h, k”  harflerini içermeyenleri bulması söyledim.

grep "Er[^hk]an" /home/firatcanoglu/Desktop/KOMUTLAR/GREP/linux4.txt

 

 

diğer örneğe bakalım. Er ve an  heceleri arasına “h, k, c ”  harflerini içermeyenleri bulması söyledim.Aşağıdada görüldüğü gibi buna uygun bir dizi bulunamadı.

grep "Er[^hkc]an" /home/firatcanoglu/Desktop/KOMUTLAR/GREP/linux4.txt

 

Sonraki karakterin özel anlamından kurtulmak için \ (ters eğik çizgi) sembolünü kullanabiliriz.

 

 

 

Genişletilmiş Normal İfadeler:

Kalıbı genişletilmiş bir normal ifade olarak yorumlamak için -E (veya –extended-regexp) seçeneğini kullanın. Genişletilmiş normal ifadeler, daha karmaşık ve güçlü arama kalıpları oluşturmak için ek meta karakterlerle birlikte tüm temel meta karakterleri içerir. Aşağıda bununla ilgili bazı örneklere bakalım.

 

Belirli bir dosyadaki tüm e-posta adreslerini eşleştirip bulalım.

grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" /home/firatcanoglu/Desktop/KOMUTLAR/GREP/linux4.txt

 

 

Belirli bir dosyadaki tüm geçerli IP adreslerini eşleştirin ve çıkarın:

grep -E -o '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' /home/firatcanoglu/Desktop/KOMUTLAR/GREP/linux4.txt

 

-o seçeneği yalnızca eşleşen dizeyi yazdırmak için kullanılır.

 

 

Birden Çok Dize Patterns (Desen) Arama :

VEYA operatörü | kullanılarak iki veya daha fazla arama modeli birleştirilebilir.

Varsayılan olarak grep, kalıbı, | gibi meta karakterlerin bulunduğu temel bir normal ifade olarak yorumlar. özel anlamlarını kaybederler ve ters eğik çizgili versiyonları kullanılmalıdır.

Aşağıdaki örnekte, linux4.txt isimli dosya içinde aynı anda Erkan, Efran ve Sacide kelimelerini içeren dizeleri arıyoruz.

grep 'Erkan\|Efran\|Sacide' Desktop/KOMUTLAR/GREP/linux4.txt

 

 

Genişletilmiş normal ifade seçeneğini -E kullanırsanız, operatör | ile aşağıdaki gibi kullanabiliriz.

grep -E 'Erkan|Efran|Sacide' Desktop/KOMUTLAR/GREP/linux4.txt

 

 

 

Eşleştirmeden Önceki Satırları Yazdırma:

Eşleşen satırlardan önce belirli sayıda satırı yazdırmak için -B (veya –bağlamdan önce) seçeneğini kullanın.

Örneğin Elif kelimesinin bulunduğu satırı arıyorum.Elif bulunduğunda  Elif satırından önceki 5 satırı yazıdırır sonrada Elifi yazdırır.

grep -B 5 Elif /home/firatcanoglu/Desktop/KOMUTLAR/GREP/linux6.txt

 

 

 

Eşleştirmeden Sonraki Satırları Yazdırma:

Eşleşen satırlardan sonra belirli sayıda satırı yazdırmak için -A (veya –after-context) seçeneğini kullanın.

Örneğin Elif kelimesinin bulunduğu satırı arıyorum.Elif bulunduğunda  ilk önce Elif satırını yazdırır sonrada Elif satırından sonraki 5 satırı yazdırır.

grep -A 5 Elif /home/firatcanoglu/Desktop/KOMUTLAR/GREP/linux6.txt

 

 

Bu eğitim yazımızında sonuna geldik.Umarım bu eğitim yazısı sizler için faydalı olur.

 

Bu eğiticiye oy ver
[Total: 2 Average: 5]
Firat CANOĞLU TAĞ