grep Komutu ve Kullanımı
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/veya 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/veya farklı amaçlı işlemlerde değerlendirilebilir.
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 -v '64.242.88.10' /home/apache/access_log.txt
Örneği biraz daha geliştirelim. Arama işlemlerini filtreleyip >
ile 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 vereyim1. 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.
Pipe (“|”) ile ilgili detaylara bir başka yazı altında değineceğim. Şimdilik grep
ile pipe kullanımına dair basit birkaç ö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ız2. 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 kelimeyi3 satırın herhangi bir noktasında aramak istersek4 (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 egrep
5 (extended regular expressions) komutunu da 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.
-o
(–only-matching) ile boş olmayan (non-emptry) bir satırın eşleşen parçasını çekebilirsiniz6 7 8. Ö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 iletebiliriz9 10.
for file in $(grep '[aranacak-metin/pattern]' [arama-yapilacak-dizin-ya-da-dosya]); do scp $file ; 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ün11.
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.
- wp post list. WP-CLI Commands ↩
- Grep komutu kullanımı. Ubuntu Wiki ↩
- Vivek Gite. (2020). Search Multiple Words / String Pattern Using grep Command on Bash shell ↩
- Match two strings in one line with grep. StackOverflow ↩
- Basic vs Extended Regular Expressions ↩
- Ramesh Natarajan. (2009). 15 Practical Grep Command Examples In Linux / UNIX ↩
- Using Grep -o or Sed/Awk to Grab Snippet from Middle of String. StackExchange ↩
- grep. explainshell ↩
- Loops. Advanced Bash-Scripting Guide ↩
- Berke Öz. (2013). Linux / Unix Komutu: Grep - Text Search - Text Araması ↩
- Mertcan Gökgöz. (2016). İşe Yarar 8 Linux Grep Komut ve Kullanımı ↩