
Linux'ta Metin Dosyası İşlemleri: grep, sed, awk ve cut Komutları
Linux'ta metin işleme araçlarını öğrenin. grep ile arama, sed ile metin değiştirme, awk ile veri işleme ve cut ile alan kesme komutlarının pratik kullanım rehberi.
Linux'ta Metin Dosyası İşleme: grep, sed, awk ve cut Komutları Pratik Rehberi (2026)
100 MB'lık nginx log'da 502 hatalarını bulup hangi IP'lerden geldiğini listeleyin — tek satırda yapabilir misiniz? Evet, grep ile filtreleme + awk ile alan çekme + sort | uniq -c ile sayma: hepsi 30 saniyede. Bu rehber Buyukweb VDS müşterilerine yönelik; /var/log/nginx/access.log gerçek senaryolarından WordPress debug.log temizlemeye, MySQL slow query filtrelemeden CSV alanı kesmaya kadar dört temel aracı pratik örneklerle anlatıyor.
Buyukweb perspektifi: VDS paketlerimizde (AlmaLinux 9, Ubuntu 22.04, Debian 12, RHEL 9) GNU grep 3.x, GNU sed 4.x, GNU awk (gawk) 5.x ve cut (GNU coreutils) default yüklüdür; kurulum gerekmez. cPanel hosting'de SSH jailed shell olabileceğinden ağır log analizi için VDS gereklidir. Tercih etmeyin: 100 GB+ log'u yalnızca grep+awk ile analiz etmeyi; o ölçekte GoAccess, ELK Stack veya Loki+Grafana gibi araçlar gerekir. Ama günlük "neyin patladığını öğren" için grep+awk hâlâ en hızlı yol.
Dört Araç — Hızlı Karşılaştırma
| Araç | Ne için kullanın | Güçlü olduğu yer | Dikkat |
|---|---|---|---|
| grep | Satır filtreleme, arama | Regex ile hızlı arama, binary-safe | Sadece satır düzeyinde çalışır |
| sed | Metin değiştirme, silme, yerinde düzenleme | Basit find/replace, in-place edit | Karmaşık mantık için awk daha iyi |
| awk | Alan tabanlı işleme, hesaplama, raporlama | CSV/log field processing, BEGIN/END blokları | Büyük dosyalarda bellek verimli |
| cut | Sabit-ayraçlı alandan hızlı kesme | Basit CSV/TSV, /etc/passwd gibi yapılar |
Regex desteklemez; awk daha esnek |
grep — Satır Filtreleme ve Arama
grep (GNU grep 3.x), dosyada ya da stdin akışında belirtilen kalıpla eşleşen satırları döndürür. Üç regex modunu destekler.
Regex Modları
| Mod | Flag | Desteklenenler | Örnek |
|---|---|---|---|
| Basic Regex (BRE) | (varsayılan) | ., *, ^, $, [], \+, \? |
grep "error\+" |
| Extended Regex (ERE) | -E |
BRE + +, ?, {, ` |
, ()` ekstradan |
| Perl-compatible (PCRE) | -P |
Lookahead, lookbehind, non-greedy *? |
grep -P "(?<=GET )/api/[^\s]+" |
GNU vs BSD farkı: macOS'taki
grepBSD'dir,-P(PCRE) desteklenmez. BSD'degrep -Ekullanın ya dabrew install grepile GNU grep kurun. Buyukweb VDS'de GNU grep olduğu için-Pçalışır.
Temel Kullanım ve Bayraklar
# Temel arama
grep "502" /var/log/nginx/access.log
# Büyük/küçük harf duyarsız (-i)
grep -i "error" /var/log/nginx/error.log
# Eşleşmeyen satırlar (-v)
grep -v "200" /var/log/nginx/access.log # 200 dışı tüm statüler
# Satır numarası (-n)
grep -n "Fatal" /var/log/php/error.log
# Sadece eşleşen dosya adı (-l)
grep -rl "DB_PASSWORD" /var/www/html/
# Özyinelemeli (-r / -R)
grep -r "wp_debug" /var/www/html/wp-content/
# Eşleşme sayısı (-c)
grep -c "404" /var/log/nginx/access.log
# Bağlam satırları: -A (sonra), -B (önce), -C (her iki yön)
grep -A 5 -B 2 "PHP Fatal error" /var/log/php/error.log
# Dosya filtresi (--include)
grep -r --include="*.php" "eval(" /var/www/html/
# Extended regex: OR kalıbı
grep -E "502|503|504" /var/log/nginx/access.log
# PCRE: non-greedy, lookahead (GNU grep -P)
grep -P "(?<="GET )/wp-admin[^s]*" /var/log/nginx/access.log
Gerçek Senaryo: Nginx 502 Analizi
# Son 1000 satırda 502 olan IP'leri listele
tail -1000 /var/log/nginx/access.log | grep " 502 " | awk '{print $1}' | sort | uniq -c | sort -rn
# Belirli saat aralığında 5xx hataları
grep "08/May/2026:14:" /var/log/nginx/access.log | grep -E " 5[0-9]{2} "
# Slow request (10+ saniye) — nginx upstream_response_time varsa
grep -E "upstream_response_time: ([1-9][0-9]|[0-9]{3,})." /var/log/nginx/access.log
sed — Akış Editörü
sed (GNU sed 4.x), metin akışlarında satır bazlı değiştirme, silme ve dönüşüm yapar. Regex olarak BRE kullanır; -E flag'i ile ERE etkinleşir.
Temel Substitution
# İlk eşleşmeyi değiştir (stdout'a yaz)
sed 's/eski/yeni/' dosya.txt
# Tüm eşleşmeleri değiştir (g bayrağı)
sed 's/eski/yeni/g' dosya.txt
# Büyük/küçük harf duyarsız (gi)
sed 's/error/HATA/gi' dosya.txt
# In-place düzenleme (-i) — dosyayı doğrudan değiştirir
sed -i 's/eski/yeni/g' dosya.txt
# Backup'lı in-place (-i.bak — BSD ve GNU her ikisinde de çalışır)
sed -i.bak 's/eski/yeni/g' dosya.txt
GNU vs BSD farkı: GNU
sed -isuffix olmadan çalışır (sed -i 's/x/y/' dosya). BSD/macOSsed -isuffix zorunludur:sed -i '' 's/x/y/' dosya. Taşınabilir script yazıyorsanız-i.bakkullanın.
Satır Silme ve Filtreleme
# Belirli kalıbı içeren satırları sil
sed '/^#/d' /etc/nginx/nginx.conf # Yorum satırlarını sil
# Boş satırları sil
sed '/^[[:space:]]*$/d' dosya.txt
# Satır aralığı silme (5-10. satırlar)
sed '5,10d' dosya.txt
# Belirli satırı yazdır (-n ile birlikte)
sed -n '15p' dosya.txt # Sadece 15. satır
sed -n '/ERROR/p' app.log # ERROR içeren satırlar
Çoklu Komut ve Hold Buffer
# Birden fazla komut (-e ile)
sed -e 's/http:/https:/g' -e 's/www.//g' dosya.txt
# Birden fazla satır: N komutu sonraki satırı pattern space'e ekler
# (çok satırlı XML/JSON parse için) — hold buffer kısa özet:
# h/H: pattern space'i hold space'e kopyala/ekle
# g/G: hold space'i pattern space'e al/ekle
# Bu ileri düzey; günlük kullanımda tek-satır substitution yeterli
Gerçek Senaryolar
# WordPress wp-config.php'de veritabanı adını değiştir
sed -i "s/define( 'DB_NAME', 'eski_veritabani' )/define( 'DB_NAME', 'yeni_veritabani' )/" /var/www/html/wp-config.php
# Windows satır sonlarını (CRLF) Unix'e (LF) dönüştür
sed -i 's/
//' windows-dosya.txt
# WordPress debug.log içindeki e-posta adreslerini maskele (KVKK / hassas veri temizleme)
sed -i -E 's/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}/[MASKED]/g' /var/www/html/wp-content/debug.log
# Nginx config'de port değiştir
sed -i 's/listen 8080;/listen 80;/g' /etc/nginx/sites-available/varsayilan
# PHP hata satırlarının başına tarih ekle
sed 's/^[/[2026-05-08 /' php-error.log
awk — Alan Tabanlı Veri İşleme
awk (GNU awk / gawk 5.x), her satırı otomatik alanlara bölen bir mini programlama dilidir. Log analizi, CSV işleme ve istatistik için cut'tan çok daha güçlüdür.
Temel Sözdizimi ve Alan Değişkenleri
# Temel: her satırda eylem
awk '{print $1}' dosya.txt # 1. alan
awk '{print $NF}' dosya.txt # Son alan (NF = alan sayısı)
awk '{print $1, $NF}' dosya.txt # 1. ve son alan, boşlukla
# Özel ayraç (-F veya FS=)
awk -F ':' '{print $1}' /etc/passwd # : ayraçlı — kullanıcı adları
awk -F ',' '{print $2}' veri.csv # CSV 2. sütun
awk 'BEGIN{FS=" "} {print $3}' rapor.tsv # TSV 3. sütun
BEGIN ve END Blokları
# BEGIN: ilk satır işlenmeden önce çalışır
# END: tüm satırlar işlendikten sonra çalışır
awk 'BEGIN{print "--- Rapor ---"} {print $1} END{print "--- Bitti ---"}' dosya.txt
# Toplam hesaplama
awk '{sum += $10} END {printf "Toplam trafik: %.2f MB
", sum/1024/1024}' /var/log/nginx/access.log
Koşullu İfadeler ve Pattern Matching
# Belirli alanı koşul olarak kullan
awk '$9 >= 500' /var/log/nginx/access.log # HTTP 5xx satırlar
awk '$9 == "404" {print $1, $7}' access.log # 404: IP + URL
awk '$10 > 1048576 {print $1, $7, $10}' access.log # 1 MB+ cevap dönen istekler
# Regex pattern
awk '/POST/ && /wp-login/' /var/log/nginx/access.log # Login brute-force IP'leri
awk '!/^#/ && NF > 0' /etc/nginx/nginx.conf # Yorum ve boş satır dışı
# if/else
awk '{if ($9 >= 500) print "HATA:", $0; else if ($9 >= 400) print "UYARI:", $0}' access.log
Gerçek Senaryolar
# Saatlik istek sayısı (Buyukweb VDS nginx/access.log analizi)
awk '{print substr($4,2,14)}' /var/log/nginx/access.log | cut -c1-14 | sort | uniq -c | sort -rn | head -24
# En çok 502 üreten IP'ler
awk '$9 == "502" {print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
# Toplam bant genişliği kullanımı (alan $10 = gönderilen byte)
awk 'NR>1 && $10 ~ /^[0-9]+$/ {sum += $10} END {printf "Toplam: %.1f GB
", sum/1073741824}' /var/log/nginx/access.log
# MySQL slow query log'da 5 saniyeden uzun sorgular
awk '/Query_time: [5-9][0-9]*.|Query_time: [1-9][0-9]{2,}/' /var/log/mysql/slow.log
# CSV: 3. sütun toplamı (başlık satırını atla)
awk -F ',' 'NR>1 {sum += $3} END {print "Toplam:", sum}' satis-raporu.csv
cut — Hızlı Alan Kesme
cut (GNU coreutils), sabit ayraçlı veya sabit karakter konumlu dosyalarda belirli alanları keser. Regex desteklemez; basit CSV/TSV ve sistem dosyaları için awk'tan hızlıdır.
# Ayraç (-d) ve alan (-f) ile
cut -d ':' -f 1 /etc/passwd # Kullanıcı adları (1. alan)
cut -d ':' -f 1,3 /etc/passwd # Kullanıcı adı + UID (1. ve 3. alan)
cut -d ',' -f 2-4 rapor.csv # CSV 2, 3, 4. sütunlar
cut -d ',' -f 3- rapor.csv # 3. alandan sona kadar
# Karakter pozisyonu (-c)
cut -c 1-15 /var/log/nginx/access.log # İlk 15 karakter (tarih alanı)
cut -c 14- /var/log/nginx/access.log # 14. karakterden sona
# Birden fazla dosyada aynı kolon
cut -d ':' -f 1 /etc/passwd /etc/group | sort -u
awk mı, cut mı? Sabit ayraçlı ve regex gerekmiyorsa
cutyeterli ve daha hızlıdır. Koşul, hesaplama veya birden fazla işlem gerekiyorsaawktercih edin.
GNU vs BSD: Temel Farklar
| Özellik | GNU (Linux VDS) | BSD/macOS |
|---|---|---|
grep -P (PCRE) |
Destekler | Desteklemez |
sed -i (in-place) |
Suffix olmadan: sed -i 's/x/y/' f |
Suffix zorunlu: sed -i '' 's/x/y/' f |
awk varsayılan |
gawk 5.x | BSD awk (onetrueawk) |
awk POSIX dışı |
gensub(), patsplit() gawk'a özgü |
Yok |
cut |
Destekler | Destekler (uyumlu) |
Taşınabilir script için -i.bak (sed), -E (grep) ve POSIX awk kullanın. Buyukweb VDS'de gawk olduğundan gensub() de çalışır.
Boru Hattı (Pipe) Senaryoları
Senaryo 1: Nginx Access Log — Saatlik 502 Dağılımı
# /var/log/nginx/access.log üzerinde saatlik 502 sayısı
grep " 502 " /var/log/nginx/access.log | awk '{print substr($4, 2, 14)}' | awk -F':' '{print $1 ":" $2}' | sort | uniq -c | sort -k2
Senaryo 2: En Saldırgan IP'leri Engellemeye Hazırla
# 1000'den fazla istek atan IP'ler → nginx deny listesi olarak çıktı
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | awk '$1 > 1000 {print "deny " $2 ";"}' > /etc/nginx/conf.d/blocked-ips.conf
Senaryo 3: WordPress debug.log İçindeki Hassas Veriyi Maskele
# E-posta adreslerini maskele, yedeği backup/ klasörüne koy
mkdir -p /var/www/html/wp-content/backup
cp /var/www/html/wp-content/debug.log /var/www/html/wp-content/backup/debug.log.orig
sed -i -E 's/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}/[EMAIL]/g' /var/www/html/wp-content/debug.log
Senaryo 4: CSV — Koşullu Filtreleme
# satis.csv: tarih,urun,miktar,gelir — geliri 1000 TL üstü satırlar
awk -F ',' 'NR==1 || $4 > 1000 {print $1 "," $2 "," $4}' satis.csv > filtreli.csv
Senaryo 5: MySQL Slow Query Log — En Yavaş Sorgular
# 5 saniyeden uzun sorguları filtrele ve Query_time değerini göster
grep -A 1 "Query_time: [5-9]." /var/log/mysql/slow.log | grep -v "^--"
Sıkça Sorulan Sorular
grep -E ile grep -P arasındaki fark nedir?
-E extended regex (ERE) açar: +, ?, |, () kaçış gerekmeden çalışır. -P Perl-compatible regex (PCRE) açar: lookahead ((?=...)), lookbehind ((?<=...)), non-greedy (*?, +?), \d, \w gibi kısaltmalar desteklenir. Günlük log analizinde -E yeterli; karmaşık pattern (e-posta, URL, IP+port birlikte) yakalamak için -P kullanın. macOS'ta -P çalışmaz (BSD grep); GNU grep yükleyin.
sed ile in-place düzenleme yaptım, nasıl geri alabilirim?
-i doğrudan dosyayı değiştirir, undo yoktur. Her zaman önce yedek alın:
cp dosya.txt dosya.txt.bak
sed -i 's/eski/yeni/g' dosya.txt
# Sorun olursa:
cp dosya.txt.bak dosya.txt
Ya da -i.bak suffix kullanın: sed -i.bak 's/eski/yeni/g' dosya.txt hem düzeltir hem dosya.txt.bak oluşturur.
awk ile cut arasında hangisini ne zaman kullanmalıyım?
Basit sabit-ayraçlı kolon kesme için cut daha hızlı ve okunaklıdır. Koşul, hesaplama, alan sayısı değişken, regex veya birden fazla işlem gerekiyorsa awk kullanın. Örnek: cut -d ':' -f 1 /etc/passwd ile awk -F ':' '{print $1}' /etc/passwd aynı çıktıyı verir; ama awk '$3 >= 1000 {print $1}' /etc/passwd (UID≥1000 olanlar) artık cut ile yapılamaz.
Regex'te non-greedy nasıl yazılır? grep, sed, awk farklı mı?
grep -P PCRE ile *? veya +? non-greedy çalışır. GNU sed ERE veya BRE kullanır, non-greedy yoktur; en yaygın geçici çözüm negatif karakter sınıfı: [^"]* yerine "[^"]*". gawk'ta da POSIX BRE/ERE var, non-greedy yok. Gerçek non-greedy ihtiyacı varsa perl -pe veya python3 -c ile one-liner yazın.
BSD/macOS ile GNU sed arasındaki in-place farkı neden önemli?
CI/CD pipeline veya script'i hem macOS (geliştirici) hem Linux (VDS) üzerinde çalıştırıyorsanız sed -i 's/x/y/' f macOS'ta hata verir ("invalid command code"). Çözüm: sed -i.bak 's/x/y/' f ve işlem sonrası .bak dosyayı silin; ya da script başında SED=$(command -v gsed || command -v sed) ile platform tespiti yapın.
100 GB nginx log dosyasını grep ile analiz etmeli miyim?
Hayır. grep her satırı sırayla tarar; 100 GB için saatler sürebilir, disk I/O'yu doldurur. Bu ölçekte GoAccess (incremental, gerçek zamanlı), ELK Stack veya logrotate + günlük analiz cron daha doğru. Günlük "son 1 saatlik triage" için tail -n 100000 access.log | grep " 502 " yeterli.
gawk'a özgü gensub() fonksiyonu ne işe yarar?
gensub(regex, replacement, how) POSIX gsub()'dan farkı: yakalama grubu (\1, \2) ile replacement yazılabilir.
# IP'nin son oktetini maskele
awk '{print gensub(/([0-9]+.[0-9]+.[0-9]+.)[0-9]+/, "\1***", "g", $1)}' access.log
macOS'ta yoktur; GNU gawk kurulu değilse POSIX match() + substr() kullanın.
Sonuç
grep, sed, awk ve cut: dört araç, sınırsız kombinasyon. Buyukweb VDS'de nginx/Apache log analizi, WordPress config düzenleme, MySQL slow query filtreleme ve CSV işleme — hepsi pipe zinciriyle tek satıra iner. 100 GB+ log veya sürekli izleme için GoAccess, ELK Stack veya Loki+Grafana gerekir; grep+awk "hızlı triage" aracıdır.
Buyukweb VDS paketleri ₺250/ay'dan; AlmaLinux 9, Ubuntu 22.04, Debian 12 veya RHEL 9, tam SSH root, KVM sanallaştırma, günlük Veeam yedekleme, 7/24 Türkçe destek.
Teknik destek: 0850 302 60 70 veya iletişim sayfamız.
İlgili Büyükweb Hizmetleri
- VDS Sunucu — Tam SSH erişimi, GNU araçlar hazır
- Linux Hosting
- Linux Web Hosting
- cPanel Web Hosting
Linux & Komut Satırı İlgili Hizmetlerimiz
Bu yazıda anlatılan teknik konuyu profesyonel altyapıyla deneyimleyin
Etiketler:

