Elinizin altında bulunmasında, komut satırı işlemlerinde işinizin kolaylıkla çözülebilmesinde oldukça yer sahibi olan ya da ileride tam da böyle bir etki yaratabilecek bir komuttan bahsedeceğim; grep.

grep yani evrensel düzenli ifade yazıcısı (global regular expression printer), belirtilen örgü (pattern) bağlamında bir metin yığını içerisinden seçme ve/ya işaretleme yapmamızı sağlar. Girilen şablon belirtilen yol içerisinde işlenir, şablona uygun sonuçlar işaretlenerek listelenir. Tek başına veya borularla (“|”, pipe) kullanılarak yetenekleri geliştirilebilir ve/ya farklı amaçlı işlemlerde değerlendirilebilir.

Grep nedir

Tek başına en yalın kullanımı şu şekildedir.

grep '[aranacak-metin/pattern]' [arama-yapilacak-dizin-ya-da-dosya]

O halde örneklere geçebiliriz. İşlemler için ben Apache web sunucusuna ait access_log.txt dökümanını kullanacağım. Metin yığını içerisinden sadece POST işlemlerini ayıklamak istiyorum. O halde şöyle bir komut kullanabilirim.

grep 'POST' /home/apache/access_log.txt

Peki, seçme işlemi yerine hariç tutma işlemi gerçekleştirmek istersem? Örneğin, 64.242.88.10 ip adresi dışında gerçekleşen işlemleri listelemek istiyorum.

Grep

grep -v '64.242.88.10' /home/apache/access_log.txt

Örneği biraz daha geliştirelim. Arama işlemlerini filtreleyip keywords.txt dosyasına yönlendirelim (“>”). Aksi belirtilmediği sürece büyük küçük harf duyarlılığı bağlamında işlemler gerçekleştirilecektir. Ben örnekte “-i” ile büyük/küçük harf ayrımı olmaksızın işlem yürütülmesini belirterek komutu uyguladım.

grep -i 'SearchResult' /home/apache/access_log.txt > search.txt

Bir örnek de wp cli üzerinden vereyim. Aşağıdaki komut ile human needs geçen ifadelerin sayılmasını istediğide 6 dönüşünü alıyorum.

wp-cli.phar post list --post_status=draft | grep -i --count 'human needs'

Yukarıdaki komutu biraz daha geliştirip, human needs ifadelerini renkli bir şekilde göstermesini isteyelim.

wp-cli.phar post list --post_status=draft | grep -i 'human needs' --color

O halde grep ile ilgili daha detaylı örneklendirmelere geçebiliriz. Örnek olarak birden fazla wordpress kurulumuna sahip sunucumuzda, içeriğinde define geçen *.php uzantılı satırlar yerine dosyaları listeleyelim.

grep -l 'define' *.php

Peki, wildcard ile .php uzantılı dökümanlar içerisinde return true çıktısı veren dosyaları bulmak istersek ne yapmalıyız?

grep -w 'return true\>' *.php

-w (watch) bizim için aramayı derinleştirerek belirttiğimiz örgüye uygun satırları arar. > ile aranması istenen örgünün satır sonunda olduğunu belirtmiş oluruz.

Grep watch

Pipe (“|”) ile ilgili detaylara bir başka yazı altında değineceğim. Şimdilik grep ile pipe kullanımına dair basit bir kaç örnek vermek istiyorum. Mesela, sunucunuzdaki, belirlediğiniz bir klasör içerisindeki dosyaların okuma (r – read permission) – yazma (w – write permission) – çalıştırma (e – execute permission) izimlerine bir bakalım ve 777 olanları listeleyelim.

ls -l ~/var/www/html/*.jpg | grep rwxrwxrwx

Yukarıdaki komut pipe öncesinde ls komutu dahilinde dosyaların detaylı bir listesini vermekte. pipe sonrasında ise grep komutuyla dökülen satırlarda rwxrwxrwx araması yapmaktayız. Esasında kodumuz yazma izinleriyle ilgili bir işlem yerine örgü olarak rwxrwxrwx harflerini aramakta ve işaretlemekte.

Yine Apache logumuza dönelim ve satırlara bakıp 64 ile başlayanları sayfa sayfa (more) getirelim.

grep '^64' /home/apache/access_log.txt | more

Peki, 64 yerine 64’ten küçük olanları liste dışı tutmak ve kalan satırları bölerek görüntülemek istersek?

grep -v '^[0-6][0-4]' /home/apache/access_log.txt | more

Birden fazla sayı işaretlemek istersek pipe kullanabiliriz. Örneğin aşağıdaki kod 10 ve 67 ile başlayan satırları getirecektir.

grep '^[10|67]' /home/apache/access_log.txt

Eğer birden fazla kelimeyi satırın herhangi bir noktasında aramak istersek (mesela spam ve hashes kelimelerini işaretleyelim) şu yöntemleri kullanabiliriz.

grep -i 'spam\|hashes' /home/apache/access_log.txt # yöntem 1
grep -iE 'spam|hashes' /home/apache/access_log.txt # yöntem 2
grep -i -e 'spam' -e 'hashes' /home/apache/access_log.txt # yöntem 3

Elbette extended regular expressions (egrep) de kullanabilirsiniz.

grep -w -i '^.c' /home/apache/access_log.txt

Yukarıdaki örnekte ise -w ile kendi başına bir kelime olup olmadığına bakılır. Bu işlem -i ile büyük/küçük harf ayrımı olmadan satır başı kontrolüyle gerçekleştirilir.

Grep w i

-o (–only-matching) ile boş olmayan (non-emptry) bir satırın eşleşen parçasını çekebilirsiniz. Örneğin aşağıdaki komut Türkiye’deki bölgelere bağlı deprem bilgilerinin yer aldığı lst4.asp sayfasından tarih, enlem ve boylam bilgilerini almamızı sağlayacaktır.

curl -s https://www.koeri.boun.edu.tr/scripts/lst4.asp | grep -o -E "2017.*[0-9]{2}.[0-9]{4}"

Arama kapsamını farklı açılardan genişleterek örneklerimizi devam ettirelim. Örneğin bir loop ile işaretlenen grep çıktımızı scp ile bir sunucuya iletebiliriz.

for file in $(grep '[aranacak-metin/pattern]' [arama-yapilacak-dizin-ya-da-dosya]); do scp $file <remote>; done;

Arama işlemini dizin ve alt dizinlerle genişletmek istersek -r, arama sonucunun sonrasında almak istediğimiz satır sayısı için -A (-A 2 ‘[aranacak-metin/pattern]’), sonucun üzerindeki kaç satırın alınacağını belirtmek için -B (kullanımı -A ile aynı), baştan ve sondan alınacak satır sayısı için ise -C (kullımı -A ile aynı) parametrelerini kullanabiliriz.

grep İle İlgili Ekstra Notlar

Satır işaretleme, dosya adı ve içeriğinde arama işlemlerinde ayrıca kullanabileceğimiz parametreler ve kullanım yöntemleri de mevcut. Elbette grep –help ile daha detaylı bilgi edinmek mümkün. Ancak kısa bir özet geçmek gerekirse;

-n parametresini kullanarak bir dosyanın içerisinde, arama örgümüze uygun eşleşmelerin satır numarasını alabiliriz. cat ile kullanarak head ve tail ile istediğimiz alanları dökebiliriz.

cat -n /home/apache/access_log.txt | grep "spam"  | head -5

Örnekte de görüldüğü üzere grep komutunu ilk olarak uygulamamıza gerek yok. pipe işareti sonrasında ilgili bir çok işlemi grep dahilinde devam ettirmek mümkün.

ls -alh | grep '.sql'

Yukarıdaki komut ile listeleme yapıp .sql taşıyan satırlar işaretlenecektir. Komutu dizinlerle (^d) ve dosyalarla (^-) düzenleyebilirsiniz.

Leave a Reply