Sunucu Yönetimi & Linux

    grep ile Metin Arama ve Filtreleme

    grep ile dosya ve loglarda metin ve düzenli ifade araması yapıp sonuçları filtrelemenin pratik rehberi.

    12 dk okuma Güncellendi: 10 Temmuz 2026

    Bir sunucuda gün içinde yaptığınız işlerin çoğu aslında "aradığım şey burada mı?" sorusuna cevap aramaktan ibarettir. Yüz binlerce satırlık bir erişim logunda hangi IP'nin siteyi yorduğunu, bir yapılandırma dosyasında hangi satırın yorumlanıp yorumlanmadığını, bir uygulama çıktısında error kelimesinin geçtiği yeri saniyeler içinde bulmanız gerekir. İşte tam bu noktada grep devreye girer. grep, verilen bir metin desenini satır satır tarar ve yalnızca eşleşen satırları önünüze getirir. Basitliğine bakmayın; bir sistem yöneticisinin günlük hayatında grep kadar sık açılan başka bir alet kutusu yoktur.

    Bu rehberde grep komutunu sıfırdan değil ama pratikten yola çıkarak ele alacağız. Önce temel arama mantığını, sonra günlük işlerin yüzde doksanını halleden bayrakları (büyük küçük harf duyarsızlığı, özyinelemeli arama, satır numarası, ters eşleşme, sayma), ardından düzenli ifadeleri ve bağlam gösterimini işleyeceğiz. Örnekleri gerçek senaryolar üzerinden vereceğiz: bir Nginx erişim logunda 500 hatası avlamak, bir yapılandırma dosyasında aktif satırları ayıklamak, boru (|) ile başka komutların çıktısını süzmek gibi. Amaç, komutu ezberlemeniz değil, karşınıza çıkan bir problemde "bunu grep ile nasıl çözerim?" diye düşünebilmeniz.

    grep Nasıl Çalışır ve Temel Kullanım#

    grep en temel haliyle iki şey ister: bir arama deseni ve bu desenin içinde aranacağı bir kaynak. Kaynak bir dosya olabilir, birden fazla dosya olabilir veya başka bir komuttan boru ile gelen çıktı olabilir. Komut, kaynağı satır satır okur; desen bir satırda geçiyorsa o satırın tamamını ekrana basar.

    En yalın örnek, tek bir dosyada bir kelime aramaktır:

    grep "hata" uygulama.log
    

    Bu komut uygulama.log içinde hata metnini barındıran her satırı gösterir. Tırnak kullanmak zorunlu değildir ama alışkanlık edinin: deseninizde boşluk, yıldız veya özel karakter olduğunda tırnak sizi kabuğun (shell) beklenmedik davranışlarından korur.

    Birden fazla dosyada aynı anda arama yapabilirsiniz. Bu durumda grep her eşleşen satırın başına dosya adını ekler, böylece bulgunun hangi dosyadan geldiğini görürsünüz:

    grep "timeout" access.log error.log
    

    Çıktı şuna benzer:

    error.log:2026/07/10 09:14:22 [error] upstream timed out
    error.log:2026/07/10 09:14:51 [error] upstream timed out
    

    Aramanın nasıl davrandığını iyi kavramak için Linux'un temel komut mantığını da hatırlamakta fayda var; kabuk, dosya sistemi ve boru kavramlarına aşina değilseniz önce Linux temel komutlar rehberimize göz atmanızı öneririm. grep bu komutlarla birlikte kullanıldığında asıl gücünü gösterir.

    En Sık Kullanılan Bayraklar#

    grep'in asıl marifeti bayraklarında (flag) saklıdır. Aşağıdaki beş bayrak, günlük işlerin büyük bölümünü tek başına halleder. Önce bir tabloyla özetleyip sonra tek tek örnekleyelim.

    BayrakİşleviTipik kullanım
    -iBüyük küçük harf duyarsız aramagrep -i "error" app.log
    -rKlasörü özyinelemeli taramagrep -r "TODO" /var/www
    -nEşleşen satırın numarasını göstergrep -n "define" config.php
    -vDeseni içermeyen satırları göstergrep -v "^#" nginx.conf
    -cEşleşen satır sayısını saygrep -c "404" access.log

    -i bayrağı, aradığınız kelimenin hangi harf düzeninde yazıldığını bilmediğiniz durumların kurtarıcısıdır. Log dosyalarında bir uygulama Error, diğeri ERROR, üçüncüsü error yazabilir. Hepsini tek seferde yakalamak için:

    grep -i "error" uygulama.log
    

    -r bayrağı, bir dosya yerine bir klasör verdiğinizde o klasörün altındaki tüm dosyaları ziyaret eder. Bir proje ağacında bir fonksiyonun nerede tanımlandığını veya nerede çağrıldığını bulmak için birebirdir:

    grep -r "veritabaniBaglan" /var/www/proje/
    

    -n bayrağı her eşleşmenin dosya içindeki satır numarasını ekler. Bir yapılandırma dosyasında düzeltme yapacaksanız, önce satır numarasını grep -n ile bulup sonra editörle o satıra gitmek büyük zaman kazandırır. Dosyayı açıp düzenleme kısmına gelince nano ve vim metin düzenleyici rehberimiz işinizi kolaylaştırır.

    -v bayrağı mantığı tersine çevirir: deseni içeren satırları değil, içermeyen satırları gösterir. Yorumları ve boş satırları ayıklayıp bir yapılandırma dosyasının yalnızca aktif satırlarını görmek için sıkça kullanılır:

    grep -v "^#" /etc/nginx/nginx.conf | grep -v "^$"
    

    -c bayrağı ise eşleşen satırların tam listesini değil sadece sayısını verir. "Bugün kaç kez 404 aldık?" gibi sorulara anında cevap verir:

    grep -c "404" access.log
    

    Düzenli İfadeler ve -E Bayrağı#

    Bir kelime aramak güzeldir ama işler bazen daha karmaşıktır. "500 ile başlayan hata kodları", "üç haneli sayılar", "belirli üç kelimeden herhangi biri" gibi desenlere ihtiyaç duyarsınız. İşte burada düzenli ifadeler (regular expression, kısaca regex) devreye girer. grep varsayılan olarak temel düzenli ifadeleri (BRE) anlar; genişletilmiş sözdizimi için -E bayrağını eklersiniz. Böylece +, ?, |, () gibi karakterleri ters bölü koymadan kullanabilirsiniz.

    Sık kullanılan regex parçalarını bir tabloda toplayalım:

    KalıpAnlamıÖrnek eşleşme
    ^abcSatır abc ile başlarabc def
    abc$Satır abc ile biterxyz abc
    .Herhangi tek karaktera1c, axc
    [0-9]Bir rakam7
    +Bir öncekinden bir veya daha fazla[0-9]+2026
    |Veya (alternatif)hata|error

    -E ile birkaç kelimeden herhangi birini tek seferde aramak çok pratiktir. Aşağıdaki komut, log içinde error, warning veya critical kelimelerinden herhangi birinin geçtiği satırları toplar:

    grep -E "error|warning|critical" uygulama.log
    

    HTTP durum kodlarını sınıf olarak yakalamak da klasik bir örnektir. Nginx erişim logunda 5xx sınıfındaki tüm sunucu hatalarını görmek için:

    grep -E " 5[0-9]{2} " access.log
    

    Buradaki desen bir boşluk, ardından 5, ardından iki rakam ve yine bir boşluk arar; yani 500, 502, 503 gibi kodları yakalar ama 1500 gibi bir sayının içine yanlışlıkla düşmez. Bir IP adresi kalıbını yakalamak için de benzer bir mantık kurabilirsiniz:

    grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" access.log
    

    Düzenli ifadeler ilk bakışta soğuk görünse de birkaç kalıbı ezberlediğinizde günlük işlerin çoğuna yeter. Regex'i tam öğrenmek yerine, sık karşılaştığınız beş on kalıbı bir kenara not edip zamanla dağarcığınızı genişletmenizi öneririm.

    Bağlam Gösterme -A -B -C#

    Bir hatayı loglarda bulduğunuzda çoğu zaman yalnızca eşleşen satır yetmez; o hatanın hemen öncesinde ve sonrasında ne olduğunu görmek istersiniz. Bir istisna (exception) fırlatıldığında yığın izinin (stack trace) alt satırları veya hatadan önceki isteğin ayrıntıları bağlamı tamamlar. grep bunun için üç bayrak sunar.

    BayrakGösterdiğiAnlamı
    -A nAfterEşleşmeden sonraki n satır
    -B nBeforeEşleşmeden önceki n satır
    -C nContextÖncesi ve sonrası n satır

    Bir uygulama logunda Exception kelimesini bulup ardından gelen beş satırı da görmek istiyorsanız:

    grep -A 5 "Exception" uygulama.log
    

    Hatanın hangi istekten sonra oluştuğunu anlamak için öncesine bakmak isteyebilirsiniz:

    grep -B 3 "500 Internal" access.log
    

    En pratik olanı genellikle -C'dir; hem öncesini hem sonrasını verir, böylece olayı ortasından yakalamış olursunuz:

    grep -C 4 "database connection failed" uygulama.log
    

    Bağlam gösterirken grep, ardışık olmayan eşleşme bloklarını -- çizgisiyle ayırır. Bu sayede birden fazla hata bloğunu tek çıktı içinde karışmadan okuyabilirsiniz. Bu üç bayrak, özellikle Laravel, Node.js veya Python uygulamalarının çok satırlı hata çıktılarını incelerken paha biçilmezdir.

    Boru ile Diğer Komutları Filtreleme#

    grep'i asıl güçlü kılan, tek başına değil başka komutlarla birlikte çalışmasıdır. Boru işareti (|) bir komutun çıktısını grep'in girdisine bağlar. Böylece herhangi bir komutun uzun çıktısını anında süzebilirsiniz. Bu, sunucu yönetiminde sürekli başvuracağınız bir kalıptır.

    Çalışan süreçler arasında belirli bir servisi bulmak:

    ps aux | grep nginx
    

    Dinlenen portlar arasında 443'ü kontrol etmek:

    ss -tlnp | grep ":443"
    

    Kurulu paketler içinde bir kütüphaneyi aramak:

    dpkg -l | grep -i php
    

    Bir servisin canlı loglarını takip ederken yalnızca hataları görmek için tail -f çıktısını grep'e bağlayabilirsiniz. Bu, bir sorunu gerçek zamanlı izlerken çok işe yarar:

    tail -f /var/log/nginx/error.log | grep --line-buffered "upstream"
    

    Buradaki --line-buffered bayrağı önemlidir; canlı akışlarda çıktının tamponlanıp gecikmesini önler, satırlar oluştukça ekrana düşer. Bir grep çıktısını başka bir grep'e bağlayarak arama daraltabilirsiniz de. Örneğin önce belirli bir IP'nin isteklerini, sonra o istekler içindeki 404'leri süzmek:

    grep "203.0.113.45" access.log | grep " 404 "
    

    Bu zincirleme mantığı, karmaşık bir tek satırlık regex yazmaktan çoğu zaman daha okunaklı ve daha kolay hata ayıklanır. Küçük adımlarla süzmek, her aşamada çıktıyı görüp doğrulayabilmenizi sağlar.

    Gerçek Senaryo Log İçinde Hata Avlama#

    Teoriyi bir kenara bırakıp gerçek bir vakayı baştan sona ele alalım. Diyelim ki bir müşteri sitesinin ara ara yavaşladığından şikayetçi. Elimizde bir Nginx erişim logu var ve suçluyu bulmamız gerekiyor. Adım adım grep ile ilerleyelim.

    Önce bugün toplam kaç sunucu hatası (5xx) olduğuna bakalım:

    grep -cE " 5[0-9]{2} " /var/log/nginx/access.log
    

    Sayı yüksekse hataların hangi zamanlarda yoğunlaştığını görmek isteriz. Saat bilgisiyle birlikte 502 hatalarını çekelim:

    grep " 502 " /var/log/nginx/access.log | grep -oE "10/Jul/2026:[0-9]{2}"
    

    Buradaki -o bayrağı, satırın tamamını değil yalnızca eşleşen kısmı basar; böylece sadece saat bilgisini alıp yoğunluğu görebiliriz. Şimdi hangi IP'nin sunucuyu en çok yorduğunu bulalım. grep çıktısını awk, sort ve uniq ile birleştirmek klasik bir üçlüdür:

    grep " 502 " /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head
    

    Bu tek satır, 502 alan istekleri süzer, ilk sütundaki IP'yi ayıklar, sıralar, tekrar sayısıyla gruplar ve en çok isteği yapan ilk on IP'yi verir. Şüpheli bir IP çıktıysa, o IP'nin ne tür isteklerde bulunduğuna bakabiliriz:

    grep "198.51.100.7" /var/log/nginx/access.log | grep -E "POST|wp-login"
    

    Eğer bu bir kötü niyetli tarama trafiğiyse, çözüm genellikle uygulama katmanında değil, bir güvenlik duvarı katmanındadır. Bu tür bot ve saldırı trafiğini kaynağında durdurmak için WAF çözümümüzü veya DDoS koruma hizmetimizi değerlendirmenizi öneririm. Sunucu yönetimini bize bırakmak isterseniz sunucu yönetimi paketlerimiz de bu tür analizleri sizin adınıza yapar. Loglarda desen saymak da sık gereken bir iştir; örneğin belirli bir sayfaya kaç istek geldiğini görmek için:

    grep -c "GET /urunler" /var/log/nginx/access.log
    

    Bu yaklaşımın güzelliği, hiçbir özel araç kurmadan yalnızca grep ve birkaç yardımcı komutla derin bir analiz yapabilmenizdir. Aynı mantığı bir e-posta sunucusu logunda spam avlamak veya bir uygulama logunda hata örüntüsü çıkarmak için de kullanabilirsiniz.

    Performans ve Pratik İpuçları#

    grep çoğu durumda çok hızlıdır ama dev dosyalarda ve devasa klasör ağaçlarında bilinçli kullanım fark yaratır. Birkaç pratik ipucu, hem hızınızı hem çıktı kalitenizi artırır.

    Büyük bir klasörde özyinelemeli arama yaparken gereksiz dizinleri dışlamak aramayı hem hızlandırır hem gürültüyü azaltır. node_modules, .git veya vendor gibi klasörleri atlamak için:

    grep -r "apiKey" /var/www/proje --exclude-dir={node_modules,.git,vendor}
    

    Yalnızca eşleşen dosyaların adını isteyip satırlarla uğraşmak istemiyorsanız -l bayrağı işinizi görür. "Bu değişken hangi dosyalarda geçiyor?" sorusuna doğrudan cevap verir:

    grep -rl "DB_PASSWORD" /var/www/proje
    

    Bir kelimeyi tam sözcük olarak aramak isterseniz -w bayrağını kullanın. Böylece cat ararken category veya concatenate gibi kelimeler çıktıyı kirletmez:

    grep -w "cat" dosya.txt
    

    Sabit metin arıyorsanız ve deseninizde regex özel karakterleri (nokta, yıldız, köşeli parantez) varsa -F bayrağı hem daha hızlı çalışır hem de o karakterleri harfi harfine arar:

    grep -F "192.168.1.1" access.log
    

    Son olarak, modern sistemlerde grep'in daha hızlı bir akrabası olan ripgrep (rg) komutunu da tanımanızı öneririm; büyük kod tabanlarında .gitignore kurallarına uyarak varsayılan olarak çok daha hızlı sonuç verir. Yine de temel mantık aynıdır ve grep her Linux sunucusunda hazır bulunduğu için önce onu iyi öğrenmek en sağlam yatırımdır. Bu becerileri deneyimlemek için bir VDS sunucu veya sanal sunucu üzerinde pratik yapabilir, isterseniz hosting paketlerimizin SSH erişimiyle de log analizinize başlayabilirsiniz.

    Sıkça Sorulan Sorular#

    grep ile büyük küçük harf ayrımı olmadan nasıl arama yaparım?#

    Aramayı büyük küçük harf duyarsız yapmak için -i bayrağını eklemeniz yeterlidir. Örneğin grep -i "error" app.log komutu Error, ERROR ve error yazımlarının hepsini yakalar. Log dosyalarında aynı kavram farklı yazımlarla geçebildiği için bu bayrak günlük hata analizinde en çok kullandığınız seçeneklerden biri olacaktır.

    grep -r ile grep -R arasındaki fark nedir?#

    İkisi de klasörleri özyinelemeli tarar ancak sembolik bağlantılara (symlink) davranışları farklıdır. -r sembolik bağlantıları takip etmez, yalnızca gerçek dosya ve dizinlere iner; -R ise karşılaştığı sembolik bağlantıları da izleyerek işaret ettikleri hedefleri tarar. Çoğu günlük kullanımda -r yeterli ve daha güvenlidir, çünkü döngüsel bağlantılarda takılıp kalma riski taşımaz.

    Bir kelimenin kaç kez geçtiğini nasıl sayarım?#

    Burada dikkat edilecek ince bir nokta var. grep -c bayrağı, kelimenin toplam geçiş sayısını değil, kelimenin geçtiği satır sayısını verir; aynı satırda iki kez geçiyorsa yine bir sayar. Gerçek toplam geçiş sayısını istiyorsanız grep -o "kelime" dosya.txt | wc -l kalıbını kullanın; -o her eşleşmeyi ayrı satıra döker, wc -l de o satırları sayar.

    grep neden sonuç bulamıyor, hata da vermiyor?#

    Bu genellikle deseninizin dosyada gerçekten bulunmadığı anlamına gelir ve grep bu durumda sessizce hiçbir şey basmaz, ekrana hata da yazmaz. En sık karşılaşılan tuzaklar şunlardır: büyük küçük harf farkı (çözümü -i), deseninizdeki nokta veya yıldız gibi karakterlerin regex olarak yorumlanması (çözümü -F ile sabit arama) veya yanlış dosya yolu. Önce basit ve kısa bir desenle arama yapıp sonucu görmek, sorunu daraltmanın en hızlı yoludur.

    grep çıktısını nasıl başka bir komuta gönderirim?#

    grep çıktısını boru işaretiyle (|) başka bir komutun girdisine bağlarsınız. Örneğin grep " 404 " access.log | awk '{print $1}' | sort | uniq -c komutu, 404 alan istekleri süzer, IP adreslerini ayıklar ve her IP'nin kaç kez 404 aldığını sayar. Bu zincirleme yaklaşım, grep ile awk, sort, uniq ve wc gibi araçları birleştirerek karmaşık analizleri birkaç satırda yapmanızı sağlar.

    grep ile bir klasördeki tüm dosyalarda arama yaparken hız nasıl artırılır?#

    Özyinelemeli aramada en büyük yavaşlık kaynağı gereksiz dizinlerdir. --exclude-dir={node_modules,.git,vendor} gibi bir seçenekle bu ağır klasörleri atlarsanız arama çok hızlanır. Ayrıca yalnızca dosya adlarını istiyorsanız -l bayrağını kullanmak, tüm eşleşen satırları basmaktan daha hafiftir. Çok büyük kod tabanlarında ripgrep (rg) gibi bir alternatifi denemek de belirgin bir hız kazancı sağlar.

    Kapanış#

    grep, tek başına küçük ama doğru komutlarla birleştiğinde kocaman bir analiz aracına dönüşen o klasik Unix felsefesinin en güzel örneklerindendir. Temel aramayı, -i -r -n -v -c bayraklarını, genişletilmiş düzenli ifadeleri, -A -B -C ile bağlam gösterimini ve boru ile filtrelemeyi öğrendiğinizde, bir sunucudaki hemen her "bunu nerede bulurum?" sorusuna dakikalar içinde cevap verebilirsiniz. Sık kullandığınız beş on kalıbı bir kenara not edin; kas hafızası oluştukça grep refleks haline gelecektir.

    Bu becerileri gerçek bir ortamda uygulamak, öğrenmenin en hızlı yoludur. SSH erişimiyle log analizi ve sunucu yönetimini deneyimlemek isterseniz hosting paketlerimize veya daha fazla kontrol için VDS sunucularımıza göz atabilirsiniz. Sunucunuzun güvenliğini ve loglardan çıkan tehditleri profesyonel bir ekibe emanet etmek isterseniz sunucu yönetimi hizmetimiz ve WAF çözümümüz tam size göre. Clou.TR olarak altyapıyı biz üstlenelim, siz işinize odaklanın.

    grepMetinLinux

    Uygulamaya geçmeye hazır mısınız?

    NVMe SSD, ücretsiz SSL ve %99.9 uptime garantisiyle Clou.TR hosting ve sunucu çözümleriyle projenizi hayata geçirin.