15%

Tüm Hosting Hizmetlerinde %15 indirim

Becerilerini test et ve herhangi bir hosting planında İndirim kazan

Kodu kullanın:

Skills
Başlayın
10.11.2023

Linux’ta İçeriğe Göre Dosya Nasıl Bulunur: grep, find ve awk Açıklandı

Linux’ta bir dosyayı içeriğine göre aramak, yalnızca dosya adlarını veya meta verileri değil, dosya verilerini taramak anlamına gelir; bu işlem için grep, find ve awk gibi araçlar kullanılarak bir veya birden fazla dosyada aynı anda metin kalıpları, dizeler veya düzenli ifadeler eşleştirilir. Bu, ad tabanlı aramalardan temelden farklıdır ve bir dosyanın *ne içerdiğini* bildiğinizde ancak nerede bulunduğunu veya ne adla çağrıldığını bilmediğinizde doğru yaklaşımdır.

Bir VPS Hosting ortamı yöneten herkes için içerik tabanlı dosya arama, günlük operasyonel bir zorunluluktur: /etc içindeki yanlış yapılandırılmış yönergeleri bulmak, hata kalıpları için log dosyalarını denetlemek veya uygulama kaynak ağaçlarındaki sabit kodlanmış kimlik bilgilerini aramak. Bu kılavuzda ele alınan komutlar, ek paket gerektirmeksizin tüm büyük Linux dağıtımlarında — Debian, Ubuntu, CentOS, AlmaLinux ve Arch — aynı şekilde çalışır.

Linux Ortamlarında İçerik Tabanlı Aramanın Önemi

Ad tabanlı aramalar (ls, locate) bir dosyanın ne içerdiği hakkında hiçbir bilgi vermez. Üretim sistemlerinde kritik sorular neredeyse her zaman içerik odaklıdır:

  • Hangi yapılandırma dosyası max_connections‘yi belirli bir değere ayarlıyor?
  • Hangi PHP dosyası uyarılara neden olan kullanımdan kaldırılmış bir işlev çağrısı içeriyor?
  • Hangi log dosyası belirli bir IP adresini belirli bir zaman damgasıyla kaydetti?
  • Hangi cron job tanımı artık silinmiş bir betik yoluna başvuruyor?

Modern dosya yöneticileri ve GUI arama araçları bu soruları büyük ölçekte verimli biçimde yanıtlayamaz. Linux komut satırı ise doğru kullanıldığında milyonlarca dosyada milisaniyeler içinde bunu yapabilir.

grep Komutu: İçerik Araması için Birincil Araç

grep (Global Regular Expression Print), Linux’ta dosya içeriği aramak için standart araçtır. Dosyaları satır satır okur ve belirli bir kalıpla eşleşen satırları yazdırır.

Temel Sözdizimi

grep [OPTIONS] PATTERN [FILE_OR_DIRECTORY]

Özyinelemeli Dizin Araması

En yaygın gerçek dünya kullanımı, tüm bir dizin ağacında özyinelemeli aramadır:

grep -rnw '/path/to/directory/' -e 'search_text'

Her bayrağın açıklaması:

BayrakTam AdEtki
-r--recursiveAlt dizinlere otomatik olarak iner
-n--line-numberEşleşen satırın numarasını çıktıya ekler
-w--word-regexpYalnızca tam sözcükleri eşleştirir — test, testing ile eşleşmez
-e--regexpArama kalıbını açıkça belirtir; kalıp tire ile başladığında gereklidir
-i--ignore-caseBüyük/küçük harf duyarsız eşleştirme (Error, error ve ERROR ile eşleşir)
-l--files-with-matchesYalnızca dosya adlarını yazdırır, eşleşen satırları değil
-c--countDosya başına yalnızca eşleşen satır sayısını yazdırır
-v--invert-matchKalıpla EŞLEŞMEyen satırları döndürür
-A N--after-context=NBağlam için her eşleşmeden sonra N satır gösterir
-B N--before-context=NBağlam için her eşleşmeden önce N satır gösterir
--includeN/AAramayı glob kalıbıyla eşleşen dosyalarla sınırlar
--excludeN/AGlob kalıbıyla eşleşen dosyaları atlar

Pratik grep Örnekleri

/usr/games ve tüm alt dizinlerde “test1” dizesini arayın:

grep -r "test1" /usr/games

/etc altındaki “network” sözcüğünü (tam sözcük, büyük/küçük harf duyarsız) içeren tüm dosyaları satır numaralarıyla bulun:

grep -rniw "network" /etc

eval( içeren PHP dosyalarının yalnızca dosya adlarını listeleyin (eşleşen satırları değil):

grep -rl "eval(" /var/www/html --include="*.php"

Bir kalıbı arayın ve her eşleşmeden önce ve sonra 3 satır bağlam görüntüleyin:

grep -rn -A 3 -B 3 "FATAL" /var/log/

Tüm SSH yapılandırma dosyalarında “PermitRootLogin”in kaç kez geçtiğini sayın:

grep -rc "PermitRootLogin" /etc/ssh/

Bir hosts dosyasında “localhost” içermeyen satırları bulun:

grep -v "localhost" /etc/hosts

Düzenli İfadelerle grep

grep üç regex motorunu destekler:

  • BRE (Temel Düzenli İfadeler) — varsayılan mod
  • ERE (Genişletilmiş Düzenli İfadeler) — -E veya egrep ile etkinleştirilir
  • PCRE (Perl Uyumlu Düzenli İfadeler) — -P ile etkinleştirilir
# Match lines containing an IPv4 address pattern (ERE)
grep -rE '([0-9]{1,3}.){3}[0-9]{1,3}' /var/log/nginx/access.log

# Match lines with email addresses (PCRE)
grep -rP '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}' /var/www/html/

grep ile Kritik Uç Durumlar ve Tuzaklar

İkili dosyalar: Varsayılan olarak, grep ikili dosyalar için Binary file X matches yazdırır ve içeriklerini atlar. grep’i ikili dosyaları metin olarak işlemeye zorlamak için -a (--text) kullanın — derlenmiş yapılandırmaları veya veritabanı dökümlerini ararken yararlıdır. Büyük ikili dosyalarda dikkatli kullanın.

Sembolik bağlantılar: -r sembolik bağlantıları takip etmez. Sembolik bağlantıları özyinelemeli olarak takip etmek için -R (büyük R) kullanın. Döngüsel sembolik bağlantılar varsa sonsuz döngülere yol açabileceğini unutmayın.

Büyük ağaçlarda performans: grep varsayılan olarak tek iş parçacıklıdır. Büyük kod tabanları (milyonlarca dosya) için çok iş parçacıklı olan ve .gitignore kalıplarını otomatik olarak dikkate alan ripgrep (rg) veya ag (The Silver Searcher) kullanmayı düşünün.

Dosya adlarında null baytlar: find çıktısını -print0 ile yönlendirin ve boşluk veya özel karakter içeren dosya adlarını güvenli şekilde işlemek için grep --null veya xargs -0 kullanın.

Kodlama sorunları: grep karakterler üzerinde değil, baytlar üzerinde çalışır. Dosyalar UTF-16 veya başka kodlamalar kullanıyorsa sonuçlar güvenilmez olabilir. Bayt düzeyinde eşleştirmeyi zorlamak için komuttan önce LANG=C veya LC_ALL=C ayarlayın:

LC_ALL=C grep -r "pattern" /path/

find Komutu: Dosya Meta Verisi ve İçerik Aramasını Birleştirme

grep dosyaların *içinde* arama yaparken, find dosyaları meta verilerine göre — ad, tür, boyut, izinler, değiştirilme zamanı — bulur ve ardından her sonuç üzerinde isteğe bağlı komutlar çalıştırabilir. find‘i grep ile birleştirmek, hassas çok kriterli içerik aramaları yapmanızı sağlar.

Temel Sözdizimi

find /starting/path [CRITERIA] [ACTION]

find + grep Kullanarak İçerik Araması

find /path/to/directory/ -type f -exec grep -l 'search_text' {} ;

Bu komutun anatomisi:

BileşenAnlam
/path/to/directory/Aramanın kök dizini
-type fSonuçları yalnızca normal dosyalarla sınırlar (dizinleri, soketleri, aygıtları hariç tutar)
-exec ... {} ;Eşleşen her dosya için belirtilen komutu bir kez çalıştırır; {} dosya adıyla değiştirilir
grep -lEşleşme bulunursa eşleşen satırı değil, yalnızca dosya adını yazdırır

Hassasiyet için find Kriterlerini Birleştirme

find‘in gerçek gücü, grep çalıştırmadan önce birden fazla kriteri katmanlamak ve taranması gereken dosya sayısını önemli ölçüde azaltmaktır:

Yalnızca son 7 günde değiştirilen .conf dosyalarında arama yapın:

find /etc -type f -name "*.conf" -mtime -7 -exec grep -l "timeout" {} ;

Yalnızca 1MB’tan büyük dosyalarda arama yapın:

find /var/log -type f -size +1M -exec grep -c "ERROR" {} ;

Belirli bir kullanıcıya ait dosyalarda arama yapın:

find /home -type f -user john -exec grep -l "password" {} ;

Belirli izinlere sahip dosyalarda arama yapın (herkese yazılabilir):

find /var/www -type f -perm -o+w -exec grep -l "eval(" {} ;

Aramadan bir dizini hariç tutun:

find /var/www -type f -not -path "*/node_modules/*" -exec grep -l "API_KEY" {} ;

Daha İyi Performans için find ile xargs Kullanımı

-exec ... ; sözdizimi, bulunan her dosya için yeni bir işlem başlatır. Binlerce dosya içeren dizinlerde bu ölçülebilir biçimde daha yavaştır. xargs kullanmak, birden fazla dosya adını tek bir grep çağrısında toplu olarak işler:

find /path/ -type f -name "*.log" -print0 | xargs -0 grep -l "connection refused"

-print0 ve -0 bayrakları, yeni satırlar yerine null karakterleri sınırlayıcı olarak kullanır ve boşluk içeren dosya adlarını doğru şekilde işler.

awk Komutu: Yapılandırılmış İçerik Araması ve Çıkarımı

awk yalnızca bir arama aracı değil, tam bir metin işleme dilidir. CSV verileri, sabit sütunlu log dosyaları, yapılandırma dosyaları gibi yapılandırılmış dosyalarda kalıp aramanız ve aynı anda eşleşen verilerden çıkarım, dönüşüm veya hesaplama yapmanız gerektiğinde üstün performans gösterir.

Temel Sözdizimi

awk '/pattern/ { action }' file

Dosya İçeriği Araması için Pratik awk Örnekleri

Bir dosyada “error” sözcüğünü içeren tüm satırları yazdırın:

awk '/error/' /var/log/syslog

Bir kalıbı arayın ve yalnızca belirli alanları yazdırın (1. ve 5. sütun):

awk '/FAILED/ { print $1, $5 }' /var/log/auth.log

Birden fazla dosyada arama yapın ve eşleşen satırlarla birlikte dosya adını yazdırın:

awk '/search_term/ { print FILENAME": "$0 }' /etc/nginx/*.conf

awk’ta büyük/küçük harf duyarsız arama:

awk 'tolower($0) ~ /timeout/' /etc/mysql/my.cnf

Dosya başına bir kalıbın kaç kez geçtiğini sayın:

awk '/ERROR/ { count++ } END { print FILENAME, count }' /var/log/app.log

grep Yerine awk Kullanılacak Durumlar

awk şu durumlarda daha iyi bir seçimdir:

  • Sütun değerine göre filtrelemeniz gerektiğinde (örn. “3. alanı 500’den büyük olan satırları bul”)
  • Eşleşen veriler üzerinde aritmetik işlem yapmanız gerektiğinde
  • Bir dosya genelinde sonuçları toplamanız gerektiğinde (sayımlar, toplamlar)
  • Dosyanın tutarlı bir sınırlayıcısı varsa ve yapılandırılmış çıkarım gerekiyorsa

grep, yalnızca bir kalıbın *var olup olmadığını* ve *nerede* olduğunu bilmeniz gereken saf kalıp eşleştirme görevlerinde daha hızlı kalmaya devam eder.

Araç Karşılaştırması: grep vs find vs awk

Kritergrepfind + grepawk
Birincil amaçİçerik kalıbı eşleştirmeMeta veri filtreli içerik aramasıYapılandırılmış veri işleme
Özyinelemeli aramaEvet (-r / -R)Evet (yerel)Hayır (kabuk döngüsü gerektirir)
Meta veri filtrelemeHayırEvet (ad, boyut, tarih, sahip)Hayır
Düzenli ifade desteğiBRE, ERE, PCREgrep aracılığıylaERE
Çıktı biçimlendirmeSınırlıSınırlıTam programlanabilir kontrol
Büyük ağaçlarda performansHızlıDaha yavaş (dosya başına işlem)Orta
Öğrenme eğrisiDüşükOrtaYüksek
En iyi kullanım durumuHızlı anahtar kelime aramasıÇok kriterli üretim denetimleriLog ayrıştırma, veri çıkarımı

Üretim Ortamları için Gelişmiş Teknikler

Sıkıştırılmış Log Dosyalarında Arama

Logların döndürüldüğü ve sıkıştırıldığı sunucularda, .gz dosyalarını açmadan aramak için zgrep kullanın:

zgrep "segfault" /var/log/syslog.*.gz

tar Arşivlerinde Çıkarmadan Arama

tar -xOf archive.tar.gz | grep "search_pattern"

Frekans Analizi için grep’i sort ve uniq ile Birleştirme

Bir log dosyasındaki en yaygın hata mesajlarını bulun:

grep "ERROR" /var/log/app.log | sort | uniq -c | sort -rn | head -20

İkili Dosyaları Hariç Tutma ve Kaynak Koda Odaklanma

grep -r --include="*.py" --include="*.js" --include="*.php" "TODO" /var/www/

grep ile Gerçek Zamanlı İçerik İzleme

Belirli kalıplar için canlı log çıktısını izlemek üzere tail -f‘i grep ile yönlendirin:

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

--line-buffered bayrağı, grep‘ı her satırdan sonra çıktıyı temizlemeye zorlar; bu, sürekli bir akıştan yönlendirme yapılırken zorunludur.

Güvenlik Denetimi Kullanım Senaryoları

İçerik tabanlı dosya araması, Linux güvenlik sertleştirmesinde temel bir tekniktir. Bir Dedicated Server veya VPS’te bu kalıplar operasyonel açıdan kritiktir:

Web uygulama dosyalarında sabit kodlanmış parolaları tarayın:

grep -rniE "(password|passwd|pwd)s*=s*['"][^'"]{3,}" /var/www/ --include="*.php"

Herkese okunabilir özel anahtar dosyalarını bulun:

find / -name "*.pem" -o -name "*.key" | xargs grep -l "PRIVATE KEY"

Yaygın kabuk işlev kombinasyonlarını tarayarak PHP web kabukları tespit edin:

grep -rPl "evals*(s*(base64_decode|gzinflate|str_rot13)" /var/www/

Tüm kullanıcılardaki SSH authorized_keys dosyalarını denetleyin:

find /home -name "authorized_keys" -exec grep -H "." {} ;

Bir VPS with cPanel çalıştırırken bu denetimler özellikle önemlidir; çünkü cPanel ortamları birden fazla hesaba ev sahipliği yapar ve birindeki bir ihlal diğerlerini etkileyebilir.

Büyük Ölçekli Aramalar için Performans Optimizasyonu

Gereksiz yere derin dizin ağaçlarını geçmemek için arama derinliğini sınırlayın:

find /var/www -maxdepth 3 -type f -name "*.php" -exec grep -l "eval(" {} ;

Hız gerektiren görevler için ripgrep kullanın. Burada ayrıntılı olarak ele alınmasa da rg, paralellik ve daha akıllı dosya filtrelemesi sayesinde büyük kod tabanlarında grep‘dan 3–10 kat daha hızlıdır. Çoğu dağıtım deposunda mevcuttur:

apt install ripgrep   # Debian/Ubuntu
yum install ripgrep   # CentOS/RHEL

Farklı yaklaşımları kıyaslamak için time ile aramanızın profilini çıkarın:

time grep -r "pattern" /large/directory/

/proc ve /sys‘de arama yapmaktan kaçının — bu sanal dosya sistemleri takılmalara neden olabilir veya anlamsız çıktı üretebilir:

grep -r --exclude-dir={proc,sys,dev} "pattern" /

Doğru Yaklaşımı Seçme: Karar Matrisi

SenaryoÖnerilen Komut
Bir dizinde hızlı anahtar kelime aramasıgrep -rn "keyword" /path/
Büyük/küçük harf duyarsız tam sözcük aramasıgrep -rniw "keyword" /path/
Yalnızca belirli dosya türlerinde aramagrep -r --include="*.conf" "keyword" /path/
Son zamanlarda değiştirilen dosyalarda aramafind /path -mtime -1 -exec grep -l "keyword" {} ;
Büyük dosya ağaçlarında verimli arama`find /path -print0xargs -0 grep -l "keyword"`
Loglardan yapılandırılmış veri çıkarımıawk '/pattern/ { print $1, $NF }' logfile
Sıkıştırılmış loglarda aramazgrep "keyword" /var/log/*.gz
Gerçek zamanlı log izleme`tail -f /var/log/file.loggrep –line-buffered "pattern"`
Hassas dizeler için güvenlik denetimigrep -rPl "eval(base64_decode" /var/www/

Temel Teknik Çıkarımlar

  • Varsayılan özyinelemeli aramanız olarak grep -rniw kullanın — büyük/küçük harf, tam sözcük ve satır numaralarını tek geçişte işler.
  • Boşluk veya özel karakter içeren dosya adlarını güvenle işlemek için her zaman -print0 ile find ve -0 ile xargs kullanın.
  • Birden fazla dosyayı tek bir grep çağrısında toplu işlemek ve işlem yükünü azaltmak için -exec grep ... {} + (noktalı virgül yerine artı işareti) kullanın.
  • grep -R (büyük R) sembolik bağlantıları takip eder; grep -r takip etmez — ortamınızın hangi davranışı gerektirdiğini bilin.
  • Yerel ayarla ilgili performans cezalarından ve kodlama sürprizlerinden kaçınmak için betiklerde grep‘den önce LC_ALL=C ayarlayın.
  • Kalıp eşleştirme başlamadan önce ilgisiz dosyaları elemek için --include ve --exclude-dir kullanarak aramaları kısıtlayın.
  • VPS Control Panels aracılığıyla yönetilen çok hesaplı hosting ortamlarında, güvenlik kontrollerini otomatikleştirmek için bu komutları kullanan içerik denetimlerini cron job olarak zamanlayın.
  • Shared Web Hosting ortamlarında, içerik arama izinleri hosting sağlayıcısı tarafından kısıtlanmış olabilir — bu komutları yalnızca kendi hesabınızın dosya ağacında kullanın.

Sıkça Sorulan Sorular

Linux sunucusundaki tüm dosyalarda metin aramanın en hızlı yolu nedir?

Büyük dosya ağaçlarında hız için dosya türü kısıtlamalarıyla grep -r --include="*.ext" "pattern" /path/ kullanın ya da çok iş parçacıklı olan ve büyük kod tabanlarında standart grep‘dan genellikle 3–10 kat daha hızlı olan ripgrep (rg "pattern" /path/) yükleyin.

Belirli dizinleri hariç tutarak dosyalarda bir dize nasıl aranır?

grep‘ın --exclude-dir seçeneğini kullanın: grep -r --exclude-dir={.git,node_modules,vendor} "pattern" /path/. find tabanlı aramalar için -exec yan tümcesinden önce -not -path "*/dirname/*" kullanın.

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

grep -r özyinelemeli arama yapar ancak sembolik bağlantıları takip etmez. grep -R aynı özyinelemeli aramayı yapar ve ayrıca sembolik bağlantıları takip eder. -R‘ı yalnızca hedef dizin ağacında döngüsel sembolik bağlantı bulunmadığından emin olduğunuzda kullanın.

Sıkıştırılmış .gz log dosyalarında açmadan içerik araması yapılabilir mi?

Evet. Tek dosyalar için zgrep "pattern" /var/log/file.log.gz, birden fazla sıkıştırılmış dosya için zgrep "pattern" /var/log/*.gz kullanın. Çıktı biçimi standart grep ile aynıdır.

Linux dosyalarında çok satırlı bir kalıp nasıl aranır?

Standart grep satır satır eşleştirir ve birden fazla satıra yayılan kalıpları yerel olarak eşleştiremez. Perl uyumlu regex ile grep -P ve yeni satırlar için n kullanın ya da pcregrep mevcutsa pcregrep -M "line1nline2" file kullanın. Karmaşık çok satırlı çıkarımlar için RS (kayıt ayırıcı) yeniden tanımlamasıyla awk genellikle en okunabilir çözümdür.

15%

Tüm Hosting Hizmetlerinde %15 indirim

Becerilerini test et ve herhangi bir hosting planında İndirim kazan

Kodu kullanın:

Skills
Başlayın