CSV Dosyalarını Komut Satırında İşleme: grep, awk ve sed Rehberi

Veri analizi ve sistem yönetimi işlerinde CSV dosyaları her yerde karşımıza çıkar. Sunucu loglarından dışa aktarılan raporlar, veritabanı yedekleri, monitoring araçlarının ürettiği metrikler, kullanıcı listeleri… Hepsinin ortak noktası CSV formatı. Peki bu dosyaları işlemek için her seferinde Excel açmak zorunda mısın? Kesinlikle hayır. Linux terminal araçlarıyla CSV dosyalarını son derece hızlı ve verimli şekilde işleyebilirsin. Bu yazıda grep, awk, sed ve birkaç yardımcı araçla gerçek dünya senaryolarında CSV işlemeyi ele alacağız.

CSV Dosyasının Yapısını Anlamak

Başlamadan önce CSV’nin bazı can sıkıcı özelliklerini hatırlayalım. Teoride basit görünür: değerler virgülle ayrılır, her satır bir kayıt. Ama pratikte şunlarla karşılaşırsın:

  • Değerlerin içinde virgül olabilir (tırnak içine alınmış)
  • Değerlerin içinde satır sonu karakteri olabilir
  • Başlık satırı olabilir ya da olmayabilir
  • Farklı encoding’ler (UTF-8, Latin-1, Windows-1252)
  • Windows’tan gelen dosyalarda rn satır sonu karakterleri

Bu karmaşıklıklar yüzünden “gerçek” CSV ayrıştırma için Python veya özel araçlar daha güvenli olabilir. Ama sysadmin olarak günlük işlerde bu araçlara sürekli ihtiyaç duymadan, terminal komutlarıyla büyük çoğunluğu halledebilirsin. Özellikle tırnaksız, düzenli yapılı CSV dosyaları için terminal araçları müthiş bir hız ve esneklik sunar.

Test için kullanacağımız örnek dosyayı oluşturalım:

cat > sunucular.csv << 'EOF'
hostname,ip,os,cpu_cores,ram_gb,durum
web01,192.168.1.10,Ubuntu 22.04,4,16,aktif
web02,192.168.1.11,Ubuntu 22.04,4,16,aktif
db01,192.168.1.20,CentOS 7,8,32,aktif
db02,192.168.1.21,CentOS 7,8,32,bakimda
proxy01,192.168.1.30,Debian 11,2,8,aktif
cache01,192.168.1.40,Ubuntu 20.04,4,16,devre_disi
monitor01,192.168.1.50,Ubuntu 22.04,2,8,aktif
EOF

cut Komutu ile Sütun Seçme

CSV işlemede cut komutu en basit başlangıç noktasıdır. Belirli sütunları almak için idealdir.

# Sadece hostname ve ip sütunlarını al (1. ve 2. sütun)
cut -d',' -f1,2 sunucular.csv

# Çıktı:
# hostname,ip
# web01,192.168.1.10
# web02,192.168.1.11
# db01,192.168.1.20
# ...

# 3. sütundan sona kadar al
cut -d',' -f3- sunucular.csv

# Başlık satırını atlayarak sadece IP'leri listele
tail -n +2 sunucular.csv | cut -d',' -f2

-d’,’: Delimiter (ayraç) olarak virgül kullan -f1,2: 1. ve 2. alanları al -f3-: 3. alandan itibaren hepsini al

cut komutunun sınırlaması şu: tırnaklar içindeki virgülleri anlamaz. Düzenli yapılı CSV’lerde süper çalışır ama karmaşık verilerde sorun yaşarsın.

grep ile CSV Filtreleme

grep CSV dosyalarında belirli kayıtları bulmak için güçlü bir araçtır.

# Aktif sunucuları listele
grep "aktif" sunucular.csv

# Ubuntu sunucularını bul
grep "Ubuntu" sunucular.csv

# Başlık satırını koru, Ubuntu sunucularını filtrele
head -1 sunucular.csv; grep "Ubuntu" sunucular.csv

# 192.168.1.1x IP aralığındaki sunucular (regex)
grep -E "192.168.1.1[0-9]" sunucular.csv

# Aktif OLMAYAN sunucuları bul
grep -v "aktif" sunucular.csv | grep -v "hostname"

# Birden fazla pattern ile arama
grep -E "bakimda|devre_disi" sunucular.csv

# Kaç tane aktif sunucu var?
grep -c "aktif" sunucular.csv

Gerçek bir senaryoda log dosyasından hata kayıtlarını CSV formatında çektiğini düşün:

# Nginx access log'undan 500 hatalarını CSV'ye döndür
grep " 500 " /var/log/nginx/access.log | 
  awk '{print $1","$7","$9","$11}' | 
  head -100 > hatalar.csv

awk ile CSV’nin Gerçek Gücü

awk CSV işlemede asıl kahraman budur. Sütunlara doğrudan erişebilir, hesaplama yapabilir, koşullu filtreleme uygulayabilirsin.

Temel awk Kullanımı

# awk'a field separator olarak virgül ver
awk -F',' '{print $1}' sunucular.csv

# Başlık satırını atla (NR>1), sadece hostname ve durum yazdır
awk -F',' 'NR>1 {print $1, "-", $6}' sunucular.csv

# Aktif sunucuları filtrele
awk -F',' '$6=="aktif" {print $1, $2}' sunucular.csv

# CPU core sayısı 4'ten büyük sunucular
awk -F',' 'NR>1 && $4>4 {print $1, "CPU:", $4, "RAM:", $5"GB"}' sunucular.csv

awk ile Hesaplama ve İstatistik

CSV’deki sayısal verilerle istatistik üretmek sysadmin’lerin sık ihtiyaç duyduğu bir şey:

# Toplam RAM kapasitesini hesapla
awk -F',' 'NR>1 {toplam += $5} END {print "Toplam RAM:", toplam, "GB"}' sunucular.csv

# Ortalama CPU core sayısı
awk -F',' 'NR>1 {toplam += $4; sayac++} END {print "Ort CPU:", toplam/sayac}' sunucular.csv

# Duruma göre sunucu sayısını grupla
awk -F',' 'NR>1 {sayac[$6]++} END {for (durum in sayac) print durum":", sayac[durum]}' sunucular.csv

# OS'e göre toplam RAM
awk -F',' 'NR>1 {ram[$3] += $5} END {for (os in ram) print os":", ram[os]"GB"}' sunucular.csv

Gerçek Dünya Senaryosu: Kullanıcı Yönetimi

Şirkette 500 kullanıcının olduğu bir Active Directory’den CSV export aldığını düşün. Bu dosyayı Linux’ta işlemen gerekiyor:

# Örnek kullanici.csv yapisi:
# ad,soyad,email,departman,aktif,son_giris

# Pasif kullanıcıların email listesini çıkar
awk -F',' '$5=="false" {print $3}' kullanici.csv > pasif_kullanicilar.txt

# IT departmanındaki aktif kullanıcıları say
awk -F',' '$4=="IT" && $5=="true" {sayac++} END {print "IT aktif:", sayac}' kullanici.csv

# 90 günden uzun süredir giriş yapmamış kullanıcılar
# (son_giris alanı YYYYMMDD formatında olduğunu varsayalım)
bugun=$(date +%Y%m%d)
awk -F',' -v bugun="$bugun" 'NR>1 && $5=="true" {
    fark = bugun - $6
    if (fark > 90) print $3, $4, $6
}' kullanici.csv

sed ile CSV Dönüştürme ve Temizleme

sed özellikle CSV formatını dönüştürmek, temizlemek ve düzenlemek için idealdir.

Windows CSV Dosyalarını Temizleme

Windows’tan gelen CSV dosyalarında karşılaşacağın en yaygın sorun r karakterleridir:

# r karakterlerini kaldır
sed 's/r//' windows_dosyasi.csv > temiz_dosya.csv

# ya da yerinde düzenle
sed -i 's/r//' windows_dosyasi.csv

# Hem r hem de baştaki/sondaki boşlukları temizle
sed 's/r//g; s/ *, */,/g' windows_dosyasi.csv > temiz.csv

Alan Değerlerini Dönüştürme

# "aktif" değerini "1", "devre_disi" değerini "0" yap
sed 's/,aktif$/,1/; s/,devre_disi$/,0/; s/,bakimda$/,2/' sunucular.csv

# IP adreslerindeki ilk okteti maskele (log'larda privacy için)
sed 's/,192.168./,xxx.xxx./g' sunucular.csv

# Belirli bir sütundaki değeri değiştir (6. alanı hedefle)
# Bu biraz zor, awk ile birlikte kullanalım
awk -F',' 'BEGIN{OFS=","} {gsub(/aktif/,"AKTIF",$6); print}' sunucular.csv

Başlık Satırı Ekleme veya Kaldırma

# Başlık satırını kaldır
sed '1d' sunucular.csv

# Yeni başlık satırı ekle
sed '1isunucu_adi,adres,isletim_sistemi,cpu,ram,durum' sunucular.csv

# Başlık satırını değiştir
sed '1s/.*/hostname,ip_adresi,os,cpu_cores,ram_gb,status/' sunucular.csv

Birden Fazla Aracı Birleştirme: Pipeline Gücü

Gerçek gücü tek bir araçta değil, araçların birlikte kullanımında yatar. İşte bazı karmaşık senaryolar:

Senaryo 1: Sunucu Envanter Raporu

#!/bin/bash
# Sunucu envanterinden özet rapor üret

CSV_DOSYASI="sunucular.csv"

echo "=== SUNUCU ENVANTER RAPORU ==="
echo "Tarih: $(date)"
echo ""

echo "-- Durum Ozeti --"
awk -F',' 'NR>1 {sayac[$6]++} END {
    for (d in sayac) print d": "sayac[d]" sunucu"
}' "$CSV_DOSYASI"

echo ""
echo "-- OS Dagilimi --"
awk -F',' 'NR>1 {os[$3]++} END {
    for (o in os) print o": "os[o]" sunucu"
}' "$CSV_DOSYASI"

echo ""
echo "-- Kaynak Ozeti --"
awk -F',' 'NR>1 {
    toplam_cpu += $4
    toplam_ram += $5
    sayac++
} END {
    print "Toplam CPU Core:", toplam_cpu
    print "Toplam RAM:", toplam_ram"GB"
    print "Toplam Sunucu:", sayac
}' "$CSV_DOSYASI"

echo ""
echo "-- Dikkat Gerektiren Sunucular --"
awk -F',' 'NR>1 && $6!="aktif" {print "  !",$1,"("$6")"}' "$CSV_DOSYASI"

Senaryo 2: CSV’den Toplu Kullanıcı Oluşturma

#!/bin/bash
# yeni_kullanicilar.csv formatı: username,uid,grup,home_dir,shell

CSV="yeni_kullanicilar.csv"

# Başlık satırını atla, her satırı işle
tail -n +2 "$CSV" | while IFS=',' read -r username uid grup home_dir shell; do
    # Boş satırları atla
    [ -z "$username" ] && continue

    echo "Kullanıcı oluşturuluyor: $username"

    useradd 
        -u "$uid" 
        -g "$grup" 
        -d "$home_dir" 
        -s "$shell" 
        -m 
        "$username"

    if [ $? -eq 0 ]; then
        echo "  OK: $username oluşturuldu"
    else
        echo "  HATA: $username oluşturulamadı" >&2
    fi
done

Senaryo 3: Log Analizi ve CSV Çıktısı

# Apache/Nginx access log'undan IP bazlı istek sayısı CSV'ye yaz
echo "ip,istek_sayisi,toplam_byte" > ip_raporu.csv

awk '{
    ip[$1]++
    byte[$1] += $10
} END {
    for (i in ip) print i","ip[i]","byte[i]
}' /var/log/nginx/access.log | sort -t',' -k2 -rn >> ip_raporu.csv

# En çok istek atan 10 IP
head -1 ip_raporu.csv
tail -n +2 ip_raporu.csv | sort -t',' -k2 -rn | head -10

csvkit: Ciddi CSV İşi İçin

Eğer düzenli CSV işi yapıyorsan csvkit paketini mutlaka yüklemelisin. Python tabanlı bu araç gerçek CSV ayrıştırma yapar, yani tırnaklar içindeki virgülleri doğru anlar.

# Kurulum
pip install csvkit
# ya da
apt install python3-csvkit

# csvlook: CSV'yi düzgün tablo formatında görüntüle
csvlook sunucular.csv

# csvcut: Sütun adıyla seç
csvcut -c hostname,ip,durum sunucular.csv

# csvgrep: Belirli sütunda arama yap
csvgrep -c durum -m aktif sunucular.csv

# csvstat: İstatistiksel özet
csvstat sunucular.csv

# csvjoin: İki CSV'yi join'le (SQL gibi)
csvjoin -c hostname sunucular.csv performans_verileri.csv

# csvsql: CSV üzerinde SQL sorgusu çalıştır
csvsql --query "SELECT hostname, ip FROM sunucular WHERE durum='aktif'" sunucular.csv

csvkit özellikle karmaşık, tırnak içeren, gerçek dünya CSV dosyaları için hayat kurtarıcı. Ama basit görevler için awk ve cut çok daha hızlı çalışır.

sort ve uniq ile CSV Verisi Sıralama

# 4. sütuna (cpu_cores) göre sayısal sırala, başlığı koru
head -1 sunucular.csv > sirali.csv
tail -n +2 sunucular.csv | sort -t',' -k4 -n >> sirali.csv

# RAM'e göre büyükten küçüğe
head -1 sunucular.csv
tail -n +2 sunucular.csv | sort -t',' -k5 -rn

# OS değerlerine göre sırala, tekrarları say
tail -n +2 sunucular.csv | cut -d',' -f3 | sort | uniq -c | sort -rn

# Duplike hostname'leri bul
tail -n +2 sunucular.csv | cut -d',' -f1 | sort | uniq -d

Büyük CSV Dosyalarıyla Çalışma

Milyonlarca satırlık log CSV’leriyle çalışırken performans önemli olur:

# Dosya boyutunu ve satır sayısını öğren
wc -l buyuk_dosya.csv
du -sh buyuk_dosya.csv

# İlk 1000 satırı işle (test için)
head -1001 buyuk_dosya.csv | awk -F',' '{...}'

# Paralel işleme için split kullan
# Dosyayı 10000 satırlık parçalara böl
split -l 10000 buyuk_dosya.csv parca_

# Her parçayı işle
for parca in parca_*; do
    awk -F',' 'NR>1 {toplam += $5} END {print toplam}' "$parca"
done | awk '{toplam += $1} END {print "Genel toplam:", toplam}'

# pv ile ilerlemeyi izle
pv buyuk_dosya.csv | awk -F',' '{...}' > sonuc.csv

Pratik İpuçları ve Yaygın Hatalar

Encoding sorunları: Windows’tan gelen CSV’lerde BOM (Byte Order Mark) karakteri olabilir. Şöyle temizle:

sed -i '1s/^xEFxBBxBF//' dosya.csv
# ya da
iconv -f UTF-8-BOM -t UTF-8 dosya.csv > temiz.csv

Boş alanlar: awk‘ta boş alan kontrolü:

awk -F',' '$3=="" {print NR, "satırında OS bilgisi eksik"}' sunucular.csv

Tırnak işareti sorunu: Basit bir kural: değerler içinde virgül veya satır sonu yoksa awk/cut sorunsuz çalışır. Yoksa csvkit kullan.

Alan sayısını doğrula:

# Her satırda kaç alan var? Tutarsızlıkları bul
awk -F',' '{print NF}' sunucular.csv | sort | uniq -c

# Beklenen alan sayısından farklı satırları bul
awk -F',' 'NF!=6 {print NR": "NF" alan var, beklenen 6"}' sunucular.csv

Çıktıyı formatla: printf ile düzgün hizalama:

awk -F',' 'NR>1 {printf "%-15s %-18s %sn", $1, $2, $6}' sunucular.csv

Sonuç

CSV işleme konusunda Linux terminal araçları, doğru kullanıldığında Excel veya özel yazılımlardan çok daha hızlı ve esnek bir çözüm sunar. Özellikle awk bu alanda başı çekiyor: sütun bazlı işleme, koşullu filtreleme, gruplama ve hesaplama yapabilmesi onu CSV için biçilmiş kaftan yapıyor.

Pratik öneri olarak şunu söyleyeyim: basit sütun seçimi için cut, arama ve filtreleme için grep, dönüştürme ve temizleme için sed, hesaplama ve karmaşık filtreleme için awk, gerçek CSV ayrıştırma gerektiren durumlar için csvkit kullan. Bu araçları pipeline ile birleştirdiğinde neredeyse her CSV işini komut satırından halledebilirsin.

Otomasyon scriptlerinde bu komutları kullanmaya başladıktan sonra, CSV dosyalarını elle açıp kapamak için harcadığın zamanın ne kadar çok olduğunu fark edeceksin. Bir kez alışkanlık haline geldi mi, artık “Excel’i aç, filtreyi uygula, farklı kaydet” döngüsüne geri dönmek istemiyorsun.

Yorum yapın