Buyukweb
Linux'ta Metin Dosyası İşlemleri: grep, sed, awk ve cut Komutları

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.

Büyükweb Editör EkibiHosting, Sunucu ve Sistem Yönetimi Editörü11 dakika okuma

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 grep BSD'dir, -P (PCRE) desteklenmez. BSD'de grep -E kullanın ya da brew install grep ile 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 -i suffix olmadan çalışır (sed -i 's/x/y/' dosya). BSD/macOS sed -i suffix zorunludur: sed -i '' 's/x/y/' dosya. Taşınabilir script yazıyorsanız -i.bak kullanı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 cut yeterli ve daha hızlıdır. Koşul, hesaplama veya birden fazla işlem gerekiyorsa awk tercih 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

Linux & Komut Satırı İlgili Hizmetlerimiz

Bu yazıda anlatılan teknik konuyu profesyonel altyapıyla deneyimleyin

Etiketler:

#linux#komut satırı#terminal#sunucu yönetimi

Bu yazıyı paylaş