Dosyalarda Bilgi Bulmak için `grep` Komutu Nasıl Kullanılır
grep komutu — Global Regular Expression Print (Genel Düzenli İfade Yazdırma) kısaltması — bir veya daha fazla dosyayı satır satır tarayan ve belirli bir kalıpla eşleşen her satırı yazdıran bir Unix/Linux yardımcı programıdır. POSIX uyumlu herhangi bir sistemde metin aramanın fiili standardıdır ve hem temel hem de genişletilmiş düzenli ifadeleri destekler; bu sayede basit bir dizeden karmaşık çok karakterli kalıplara kadar her şeyi eşleştirebilir.
Mümkün olan en kısa yanıta ihtiyacınız varsa: bir dosyada arama yapmak için grep "pattern" filename komutunu çalıştırın, bir dizin ağacında yinelemeli arama için -r ekleyin, büyük/küçük harf duyarsız eşleştirme için -i ekleyin ve sonuçların yanında satır numaralarını göstermek için -n ekleyin. Aşağıdaki bölümler çok daha derine inerek gerçek dünya iş akışlarını, performans tuzaklarını ve çoğu öğreticinin tamamen atladığı gelişmiş regex tekniklerini ele almaktadır.
grep Arka Planda Gerçekte Ne Yapar
grep, girdiyi satır satır okur ve düzenli ifadenizden türetilmiş bir sonlu otomatı her satıra uygular. GNU uygulaması (Linux’ta varsayılan), değişmez dizeler için Boyer-Moore-Horspool algoritmasını ve regex kalıpları için Thompson NFA yapısını kullanır. Bu mimari, grep‘in büyük dosyalarda neden olağanüstü hızlı olduğunu açıklar — perl veya python gibi PCRE tabanlı araçların aksine geri izlemeden kaçınır.
GNU coreutils ailesinde üç farklı ikili dosya bulunur:
| Komut | Motor | Kullanım Durumu |
|---|---|---|
grep | BRE / ERE (-E ile) | Genel amaçlı satır eşleştirme |
egrep | ERE (genişletilmiş regex) | grep -E için kısaltma |
fgrep | Yalnızca sabit dizeler | En hızlı; regex yorumlaması yok |
zgrep | Sıkıştırılmış dosyalarda BRE / ERE | .gz, .bz2 arşivleri |
pgrep | İşlem adı eşleştirme | Dosyalar değil, işlem tablosunda arama yapar |
egrep ve fgrep modern sistemlerde kullanımdan kaldırılmış takma adlardır; taşınabilirlik için betiklerde sırasıyla grep -E ve grep -F tercih edin.
Temel Sözdizimi
grep [options] pattern [file ...]- pattern — tırnak içine alınmış bir dize veya düzenli ifade
- file — bir veya daha fazla dosya yolu; standart girdiden okumak için atlayın
- options — eşleştirme davranışını, çıktı biçimini veya performansı değiştiren bayraklar
syslog dosyasında "error" kelimesini içeren her satırı bulan minimal bir örnek:
grep "error" /var/log/syslogKalıbınızı her zaman tırnak içine alın. Kabuk meta karakterleri (*, ?, [, $) içeren tırnaksız kalıplar, grep onları görmeden önce kabuk tarafından genişletilir ve sessiz, hatalı sonuçlar üretir.
Her Yöneticinin Bilmesi Gereken Temel Seçenekler
Birden Fazla Dosya ve Dizinde Arama
Dosyaları açıkça listeleyin veya kabuk genişletmesi kullanın:
grep "error" access.log error.log debug.log
grep "error" *.logTüm bir dizin ağacı için -r kullanın (sembolik bağlantıları -R ile takip edin):
grep -r "error" /var/log/Tuzak: Derin iç içe log hiyerarşilerine sahip üretim sunucularında, kapsamsız bir -r önemli miktarda G/Ç tüketebilir. İkili dosyaları veya alakasız uzantıları taramaktan kaçınmak için --include ile kapsamı daraltın:
grep -r --include="*.log" "error" /var/log/Büyük/Küçük Harf Duyarsız Arama (-i)
grep -i "error" application.logBu, error, Error, ERROR, eRrOr ve diğer tüm büyük/küçük harf permütasyonlarıyla eşleşir. Dahili olarak, -i ile GNU grep karşılaştırmadan önce hem kalıbı hem de girdiyi küçük harfe dönüştürür; bu da çok büyük dosyalarda küçük bir ek yük oluşturur.
Satır Numaralarını Göster (-n)
grep -n "error" application.logÖrnek çıktı:
25:error occurred during processing
103:error: connection refusedSatır numaraları, bir düzenleyicide doğrudan bir eşleşmeye atlamanız gerektiğinde vazgeçilmezdir: vim +25 application.log dosyayı 25. satırda açar.
Eşleşmeleri Say (-c)
grep -c "error" application.logSatırların kendisi yerine yalnızca eşleşen satır sayısını döndürür. Birden fazla dosyada arama yapılırken her dosya kendi sayısını alır:
grep -c "error" *.logaccess.log:0
debug.log:14
error.log:3Ters Eşleştirme (-v)
grep -v "error" application.logKalıpla eşleşmeyen her satırı döndürür. Pratik bir kullanım: bir yapılandırma dosyasından yorum satırlarını başka bir yere aktarmadan önce temizleme:
grep -v "^#" /etc/nginx/nginx.conf | grep -v "^$"Bu, hem yorum satırlarını (# ile başlayan) hem de boş satırları kaldırarak yalnızca etkin yönergeleri bırakır.
Tam Kelime Eşleştirme (-w)
grep -w "error" application.log-w olmadan, error araması errors, error_code ve myerror ile de eşleşirdi. -w bayrağı, eşleşmeyi kelime karakterleri ([a-zA-Z0-9_]) ile kelime dışı karakterler arasındaki geçişler olarak tanımlanan kelime sınırlarına sabitler.
Çıktı Satırlarını Sınırla (-m)
grep -m 5 "error" application.loggrep, 5 eşleşen satır bulduktan sonra dosyayı okumayı durdurur. Yalnızca bir kalıbın var olduğunu doğrulamanız gereken 10 GB’lık bir log dosyasında, -m 1 yürütme süresini saniyelerden milisaniyelere indirebilir; çünkü grep ilk eşleşmeden hemen sonra çıkar.
Bağlam Satırları (-A, -B, -C)
En az kullanılan özelliklerden biri. Bir hatayı teşhis ederken, çevredeki satırlar genellikle temel nedeni içerir:
grep -A 3 "error" application.log # 3 lines After the match
grep -B 3 "error" application.log # 3 lines Before the match
grep -C 3 "error" application.log # 3 lines of Context (before and after)Bu, yalnızca error: connection refused görmek ile tam yığın izini veya hatayı tetikleyen önceki isteği görmek arasındaki farktır.
Renk Vurgulama (--color)
grep --color=auto "error" application.logÇoğu dağıtım /etc/profile.d/ veya ~/.bashrc dosyasında alias grep='grep --color=auto' ayarlar. ANSI kodlarını korumak için less -R‘a aktarırken --color=always kullanın:
grep --color=always "error" application.log | less -RYalnızca Eşleşen Kısmı Yazdır (-o)
Varsayılan olarak, grep eşleşen satırın tamamını yazdırır. -o bayrağı yalnızca satırın kalıpla eşleşen bölümünü yazdırır:
grep -o "192.[0-9]*.[0-9]*.[0-9]*" access.logBu, bir erişim günlüğünden her IPv4 adresini çıkarır — çıktı satırı başına bir adres — ve en aktif istemcileri bulmak için sort | uniq -c | sort -rn‘a aktarmak için idealdir.
Dosya Adı Çıktısını Gizle (-h) ve Zorla (-H)
Birden fazla dosyada arama yapılırken, grep her eşleşmenin başına dosya adını ekler. -h bunu gizler; -H tek bir dosyada arama yapılırken bile zorlar. Kaç dosya geçirildiğinden bağımsız olarak tutarlı çıktı biçimini garantilemek için betiklerde -H kullanın.
Yalnızca Dosya Adlarını Yazdır (-l ve -L)
grep -l "error" *.log # files that contain the pattern
grep -L "error" *.log # files that do NOT contain the patternHangi yapılandırma dosyalarının kullanımdan kaldırılmış bir parametreye başvurduğunu belirlemek için dağıtım betiklerinde kullanışlıdır.
grep ile Düzenli İfadeler
Temel Düzenli İfadeler (BRE)
grep varsayılan olarak BRE kullanır. Temel meta karakterler:
| Meta Karakter | Anlam | Örnek |
|---|---|---|
^ | Satır başlangıcı | grep "^error" — “error” ile başlayan satırlar |
$ | Satır sonu | grep "error$" — “error” ile biten satırlar |
. | Herhangi bir tek karakter | grep "err.r" — “error”, “errar” vb. ile eşleşir |
* | Öncekinin sıfır veya daha fazlası | grep "err*" — “er”, “err”, “errr” vb. |
[abc] | Karakter sınıfı | grep "[aeiou]" — herhangi bir sesli harf |
[^abc] | Olumsuzlanmış sınıf | grep "[^0-9]" — rakam olmayan herhangi bir karakter |
| Meta karakterden kaçış | grep "." — değişmez nokta |
BRE’de +, ?, {, }, (, ) ve | meta karakter olarak değerlendirilmek için ters eğik çizgiyle kaçırılmalıdır. Bu, BRE ve ERE arasında geçiş yaparken yaygın bir karışıklık kaynağıdır.
-E ile Genişletilmiş Düzenli İfadeler (ERE)
grep -E "error|failure|critical" application.logERE sözdizimi daha temiz hale getirir — +, ?, |, () ve {} ters eğik çizgi olmadan çalışır:
grep -E "err(or|ata)?" application.log # matches "err", "error", "errata"
grep -E "[0-9]{1,3}.[0-9]{1,3}" access.log # partial IP pattern
grep -E "^(ERROR|WARN|FATAL)" app.log # lines starting with severity levels-P ile Perl Uyumlu Düzenli İfadeler (PCRE)
GNU grep, -P bayrağı aracılığıyla PCRE’yi destekler; ileriye bakış, geriye bakış ve açgözlü olmayan niceleyicilerin kilidini açar:
grep -P "(?<=user=)w+" auth.log # extract username after "user="
grep -P "d{4}-d{2}-d{2}" app.log # ISO date formatÖnemli: -P bir GNU uzantısıdır ve BSD grep‘de (macOS varsayılanı) mevcut değildir. -P kullanan betikler, GNU grep yüklenmeden (macOS’ta brew install grep) taşınabilir değildir.
zgrep ile Sıkıştırılmış Dosyalarda Arama
Log rotasyonu genellikle eski logları gzip ile sıkıştırır. zgrep, manuel sıkıştırma açmadan bunları aramanıza olanak tanır:
zgrep "error" /var/log/syslog.2.gz.bz2 dosyaları için bzgrep kullanın. .xz dosyaları için xzgrep kullanın. Hem sıkıştırılmış hem de sıkıştırılmamış logları tek bir komutla aramanız gerekiyorsa:
zgrep -r "error" /var/log/Uç durum: zgrep dahili olarak sıkıştırmayı açmak için zcat çağırır, ardından grep‘a aktarır. Tüm grep bayraklarını desteklemez. Sıkıştırılmış dosyalarda -P veya -o‘e ihtiyacınız varsa, önce geçici bir dosyaya sıkıştırmayı açın veya zcat file.gz | grep -P "pattern" kullanın.
grep’i Diğer Komutlarla Birleştirme
grep‘in gerçek gücü, borular aracılığıyla diğer yardımcı programlarla birleştirildiğinde ortaya çıkar.
İşlem Çıktısını Filtrele
ps aux | grep "[n]ginx"[n]ginx köşeli parantez hilesi, grep işleminin sonuçlarda görünmesini engeller; çünkü [n]ginx kalıbı, işlem listesindeki [n]ginx değişmez dizesiyle eşleşmez.
Log Verilerini Çıkar ve Topla
grep "error" application.log | sort | uniq -c | sort -rn | head -20Bu boru hattı: tüm hata satırlarını bulur, sıralar, benzersiz oluşumları sayar, sıklığa göre azalan şekilde yeniden sıralar ve en yaygın 20 hatayı gösterir. Bu, herhangi bir üretim olayında ilk müdahale triyaj tekniğidir.
Kalıp İçeren Dosyaları Bul, Ardından Üzerlerinde İşlem Yap
grep -rl "deprecated_function" /var/www/html/ | xargs sed -i 's/deprecated_function/new_function/g'grep -rl kalıbı içeren dosyaları listeler; xargs bunları yerinde değiştirme için sed‘e aktarır. Her zaman önce -i olmadan test edin veya yedek oluşturmak için -i.bak kullanın.
SSH Üzerinden Arama
ssh user@server "grep -r 'error' /var/log/app/" | lessgrep‘i uzak bir sunucuda çalıştırabilir ve sonuçları yerel terminalinize aktarabilirsiniz — log dosyaları aktarmak için çok büyük olduğunda kullanışlıdır.
Yapılandırılmış Ayrıştırma için awk ile Birleştir
grep "POST /api" access.log | awk '{print $1, $7, $9}'grep ilgili satırları filtreler; awk belirli alanları (IP, URL, durum kodu) çıkarır. Bu kombinasyon, özel bir log toplama platformuna ihtiyaç duymadan log analizi görevlerinin büyük çoğunluğunu karşılar.
Performans Değerlendirmeleri
Büyük dosyalarda veya yüksek frekanslı otomasyonda bu optimizasyonlar önem taşır:
- Değişmez dizeler için
-Fkullanın.grep -F "exact string"regex derlemeyi tamamen atlar ve ölçülebilir şekilde daha hızlıdır. LC_ALL=Ckullanın.LC_ALL=C grep "pattern" fileayarlamak tek baytlı yerel işlemeyi zorlar; çok baytlı karakter işlemeyi atladığı için UTF-8 dosyalarında 2–5 kat daha hızlı olabilir.- Ağa bağlı dosya sistemlerinde
-r‘den kaçının. NFS veya CIFS üzerinde yinelemeli grep ağ G/Ç’sini doyurabilir. Bunun yerine-execve açık yol kapsamıylafindkullanın. - Linux’ta
--mmapkullanın.grep --mmap,read()sistem çağrıları yerine bellek eşlemeli G/Ç kullanır; bu da büyük dosyalarda ek yükü azaltır (tüm platformlarda mevcut değildir). xargs -Pile paralelleştirin. Birçok bağımsız dosyada arama yapmak için iş yükünü bölün:
find /var/log -name "*.log" | xargs -P 4 grep -l "error"Bu, birden fazla CPU çekirdeğini kullanarak 4 paralel grep işlemi çalıştırır.
grep ve Alternatif Arama Araçları
| Araç | Büyük Depolarda Hız | Regex Desteği | `.gitignore`’e Saygı Gösterir | En İyi Kullanım |
|---|---|---|---|---|
grep | Orta | BRE/ERE/PCRE | Hayır | Sistem dosyaları, loglar, betik yazma |
ripgrep (rg) | Çok hızlı | PCRE2 | Evet | Depolarda kod arama |
ag (Silver Searcher) | Hızlı | PCRE | Evet | Kod arama, rg‘e eski alternatif |
ack | Orta | PCRE | Kısmi | Perl merkezli kod tabanları |
fgrep / grep -F | En hızlı | Yok (değişmez dizeler) | Hayır | Sabit dizeli log tarama |
Sistem yönetimi görevleri için — /var/log, /etc veya canlı işlem çıktısını tarama — grep kurulum gerektirmeden evrensel olarak mevcut olduğu için doğru araç olmaya devam eder. Uygulama kod tabanlarında arama yapmak için ripgrep önemli ölçüde daha hızlı ve daha ergonomiktir.
Pratik Gerçek Dünya İş Akışları
SSH Giriş Başarısızlıklarını Denetle
grep -i "failed password" /var/log/auth.log | grep -oP "from K[d.]+" | sort | uniq -c | sort -rn | head -10Bu, her başarısız SSH giriş girişiminin kaynak IP’sini çıkarır ve bunları sıklığa göre sıralar — güvenlik duvarı kurallarını güncellemeden önce kaba kuvvet kaynaklarını belirlemenin ilk adımı.
Bir Servisi Yeniden Başlatmadan Önce Yapılandırma Hatalarını Bul
grep -rn "listens*443" /etc/nginx/Hangi Nginx yapılandırma dosyalarının HTTPS dinleyicileri tanımladığını doğrular. Bu dosyalarda başvurulan sertifika yollarının gerçekten var olduğunu doğrulamak için SSL Sertifikaları kurulumunuzla birleştirin.
Bir Log Dosyasını Gerçek Zamanlı İzle
tail -f /var/log/app/production.log | grep --line-buffered "ERROR"--line-buffered, grep‘i arabelleğe almak yerine her satırdan sonra çıktıyı temizlemeye zorlar; bu, tail -f‘den aktarırken önemlidir. Olmadan, eşleşmeler gerçekleşiyor olsa bile dakikalarca çıktı göremeyebilirsiniz.
Dağıtılmış Bir Yapılandırmayı Doğrula
grep -c "server_name" /etc/nginx/sites-enabled/* | grep -v ":0"En az bir server_name yönergesi içeren her etkin Nginx sitesini listeler — bir VPS Hosting ortamında yeni bir sanal ana bilgisayar dağıttıktan sonra hızlı bir akıl sağlığı kontrolü.
Bir Dosyadan E-posta Adreslerini Çıkar
grep -Eo "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}" contacts.txtERE kalıbıyla birleştirilen -o bayrağı, yalnızca eşleşen e-posta adreslerini satır başına bir tane olacak şekilde çıkarır ve daha fazla işleme hazır hale getirir.
Birden Fazla Sunucuda Uygulama Loglarında Arama
Birden fazla uygulama örneği çalıştıran bir Dedicated Server‘da, dizinler arasında logları ilişkilendirmeniz gerekebilir:
grep -rh --include="*.log" "transaction_id=abc123" /var/log/app1/ /var/log/app2/ /var/log/app3/-h dosya adlarını gizler, böylece çıktı zaman damgasına göre sıralanmış bir görünüme temiz bir şekilde aktarılabilir.
Yaygın Hatalar ve Bunlardan Kaçınma Yolları
Boşluk içeren kalıpları tırnak içine almayı unutmak:
# Wrong — shell splits "connection refused" into two arguments
grep connection refused /var/log/syslog
# Correct
grep "connection refused" /var/log/syslogERE gerektiğinde BRE sözdizimi kullanmak:
# Wrong in BRE — + is literal
grep "error+" app.log
# Correct — use -E or escape in BRE
grep -E "error+" app.log
grep "error+" app.logYinelemeli aramanın ikili dosyalara çarpması:
# Produces "Binary file matches" noise
grep -r "config" /usr/
# Correct — skip binary files
grep -r --binary-files=without-match "config" /usr/
# or equivalently
grep -rI "config" /usr/Sabitleme karışıklığı — karakter sınıfı içinde ^:
[^abc] “a, b veya c değil” anlamına gelir. ^ yalnızca kalıbın en başında, köşeli parantezlerin dışında göründüğünde “satır başlangıcı” anlamına gelir.
Temel Çıkarımlar ve Karar Matrisi
Bir grep komutu oluştururken bu kontrol listesini kullanın:
- Değişmez dize, regex gerekmiyor mu? Maksimum hız için
-Fekleyin. - Hedef dosyada büyük/küçük harf bilinmiyor mu?
-iekleyin. - Eşleşmenin dosyada nerede olduğunu bilmeniz mi gerekiyor?
-nekleyin. - Bir dizin ağacında mı arama yapıyorsunuz? Aramayı kapsamlandırmak için
-r --include="*.ext"ekleyin. - Büyük dosya, yalnızca varlığı doğrulamanız mı gerekiyor?
-m 1ekleyin vegrepilk eşleşmeden sonra çıkar. - Teşhis için çevredeki bağlama ihtiyacınız var mı?
-C 3ekleyin. - Kalıp kabuk meta karakterleri içeriyor mu? Kalıbı tek tırnak içine alın:
grep '$variable'. - Sıkıştırılmış logları mı arıyorsunuz?
zgrepveyazcat file.gz | grepkullanın. - Alternasyon veya
+/?niceleyicilerine ihtiyacınız var mı? ERE için-Eekleyin. - İleriye bakış veya açgözlü olmayan eşleştirmeye ihtiyacınız var mı? PCRE için
-Pekleyin (yalnızca GNU grep). - Tüm satırlar değil, belirli eşleşen metni mi çıkarıyorsunuz?
-oekleyin. - Sistem dosyaları yerine bir kod tabanında mı arama yapıyorsunuz? Bunun yerine
ripgrepkullanmayı düşünün.
Sunucu altyapısını yönetirken — ister VPS with cPanel ister bare Linux ortamında olsun — grep, bir şeyler bozulduğunda başvurduğunuz ilk araçtır. Bayrak kombinasyonlarını ve awk, sed, sort ve xargs ile birleştirilebilirliğini içselleştirmek, ham log verilerini saniyeler içinde eyleme dönüştürülebilir tanı bilgisine dönüştürür.
Email Hosting veya web uygulamalarının yüksek hacimli yapılandırılmış loglar ürettiği ortamlarda, grep‘i bir log toplama hattıyla (ELK yığını, Loki veya benzeri) eşleştirmek doğal bir sonraki adımdır — ancak grep her yerde, her zaman, hiçbir bağımlılık olmadan çalışan yedek araç olmaya devam eder.
Sıkça Sorulan Sorular
grep, egrep ve fgrep arasındaki fark nedir?
grep varsayılan olarak Temel Düzenli İfadeler kullanır. egrep, grep -E ile eşdeğerdir ve Genişletilmiş Düzenli İfadeler kullanır; burada +, ?, | ve () ters eğik çizgi olmadan çalışır. fgrep, grep -F ile eşdeğerdir ve kalıbı regex yorumlaması olmadan sabit bir değişmez dize olarak ele alır; bu da onu en hızlı seçenek yapar. Hem egrep hem de fgrep kullanımdan kaldırılmış takma adlardır; betiklerde grep -E ve grep -F kullanın.
grep -r neden bazen “Binary file matches” döndürür?
grep null baytları tarayarak ikili dosyaları algılar. İkili olarak değerlendirdiği bir dosyada eşleşme bulduğunda, eşleşen satır yerine bu mesajı yazdırır. İkili dosyaları grep -rI (büyük I) ile gizleyin veya grep -ra ile metin modu işlemeyi zorlayın (tüm dosyaları metin olarak ele alın). Derlenmiş nesnelerden veya sıkıştırılmış dosyalardan yanlışlıkla eşleşmeden kaynaklanan bozuk çıktıyı önlemek için üretimde -I kullanın.
Eğik çizgi içeren bir kalıbı nasıl ararım?
Eğik çizgilerin grep kalıplarında özel bir anlamı yoktur (sed veya awk‘den farklı olarak). Bunları doğrudan kullanabilirsiniz: grep "var/log" /etc/logrotate.conf. Kaçış gerekmez.
Büyük bir dosyada bir dizenin var olup olmadığını kontrol etmenin en hızlı yolu nedir?
grep -qF "string" file && echo "found" kullanın. -q bayrağı tüm çıktıyı gizler ve ilk eşleşmede 0 durumuyla çıkar, eşleşme yoksa 1 döndürür. -F bayrağı regex işlemeyi devre dışı bırakır. Birlikte, grep dosyayı yalnızca gerektiği kadar okur ve hemen çıkar — gigabayt aralığındaki dosyalar için kritiktir.
grep dosyaları yerel olarak kopyalamadan uzak bir sunucudaki dosyalarda arama yapabilir mi?
Evet. SSH üzerinden aktarın: ssh user@host "grep -r 'pattern' /var/log/". Arama uzak ana bilgisayarda yürütülür ve yalnızca eşleşen satırlar ağ üzerinden iletilir. Yinelenen aramalar için uzak dosya sistemini sshfs ile bağlamayı ve grep‘i yerel olarak çalıştırmayı düşünün; ya da hacim altyapıyı haklı kılıyorsa merkezi bir loglama çözümü kullanın.
