tr Komutu ile Karakter Dönüştürme ve Silme

Terminal’de metin işlemenin en az ilgi gören ama en çok işe yarayan araçlarından biri tr komutudur. Büyük olasılıkla sed veya awk ile saatler geçirirken tr‘nin tam olarak ne yapabileceğini gözden kaçırmışsınızdır. Oysa doğru kullanıldığında tr, tek satırda onlarca satır kod yazmanızı engelleyebilecek bir zaman kurtarıcısı olabilir. Bu yazıda tr komutunu her açıdan ele alacağız, gerçek dünya senaryoları üzerinden gideceğiz ve sizi gerçekten işe yarayan örneklerle donateceğiz.

tr Komutu Nedir ve Ne Yapar?

tr, İngilizce “translate” kelimesinin kısaltmasıdır. Temel görevi, standart girdiden (stdin) okuduğu karakterleri belirli kurallara göre dönüştürmek ya da silmektir. Dosyaları doğrudan parametre olarak almaz, bu nedenle genellikle pipe (|) veya yönlendirme (<) ile kullanılır.

Temel sözdizimi şöyledir:

tr [SEÇENEKLER] SET1 [SET2]

Burada SET1 kaynak karakterler kümesini, SET2 ise hedef karakterler kümesini temsil eder. tr, SET1’deki her karakteri sırasıyla SET2’deki karşılığıyla değiştirir.

Sık kullanılan seçenekler şunlardır:

  • -d: Belirtilen karakterleri siler (delete)
  • -s: Ardışık tekrar eden karakterleri teke indirir (squeeze)
  • -c: SET1’in tümleyenini kullanır (complement), yani SET1’de olmayan karakterlere işlem yapar
  • -t: SET1’i SET2 uzunluğuna göre kırpar (truncate)

Temel Karakter Dönüştürme İşlemleri

Büyük-Küçük Harf Dönüşümleri

En klasik tr kullanım senaryosu harf dönüşümleridir. Küçük harflerden büyüğe veya büyükten küçüğe geçiş yapmak çok sık ihtiyaç duyulan bir işlemdir. Özellikle veri normalizasyonu yaparken bunu defalarca kullanırsınız.

echo "Merhaba Dunya" | tr 'a-z' 'A-Z'
# Çıktı: MERHABA DUNYA

echo "LINUX SISTEM YONETIMI" | tr 'A-Z' 'a-z'
# Çıktı: linux sistem yonetimi

Burada a-z ve A-Z aralık notasyonunu kullanıyoruz. tr bu aralıkları ASCII tablosuna göre işler. Dikkat etmeniz gereken nokta, Türkçe karakterlerin (ğ, ü, ş, ı, ö, ç) bu aralıklara dahil olmadığıdır. Bunun için özel işlem yapmanız gerekir, bunu ilerleyen bölümlerde ele alacağız.

Rakam ve Karakter Değiştirme

Bazen log dosyalarında veya config dosyalarında belirli karakterleri başka karakterlerle değiştirmeniz gerekir. Mesela noktalı ifadeleri alt çizgiye çevirmek isteyebilirsiniz.

echo "192.168.1.100" | tr '.' '_'
# Çıktı: 192_168_1_100

echo "log-file-2024-01-15" | tr '-' '_'
# Çıktı: log_file_2024_01_15

Bu tür dönüşümler özellikle script yazarken değişken isimlerini veya dosya adlarını normalize etmek için işe yarar.

Karakter Silme İşlemleri (-d Seçeneği)

-d seçeneği belirtilen karakterleri tamamen siler, herhangi bir değiştirme yapmaz. Bu çok güçlü bir özelliktir.

Boşlukları ve Özel Karakterleri Temizleme

echo "Kullanici: admin  " | tr -d ' '
# Çıktı: Kullanici:admin

# Sayı olmayan her şeyi sil
echo "Telefon: 0(532) 123-45-67" | tr -d -c '0-9'
# Çıktı: 05321234567

İkinci örnekte -c ve -d‘yi birlikte kullandık. -c seçeneği SET1’in tümleyenini alır yani “0-9 dışındaki her şey” anlamına gelir. Ardından -d bu karakterleri siler. Bu kombinasyon son derece kullanışlıdır.

Satır Sonu Karakterlerini Yönetme

Windows ve Linux arasında dosya transferi yapanlar bu sorunu mutlaka yaşamıştır. Windows dosyaları satır sonlarında rn kullanırken Linux n kullanır. Bu durumu düzeltmek için tr mükemmel bir araçtır.

# Windows satır sonlarını (CRLF) Linux formatına çevir
tr -d 'r' < windows_dosyasi.txt > linux_dosyasi.txt

# Alternatif olarak
cat windows_dosyasi.txt | tr -d 'r' > temizlenmis.txt

Bu işlemi dos2unix komutuyla da yapabilirsiniz ama her sistemde yüklü olmayabilir. tr ise neredeyse her Linux dağıtımında hazır gelir.

Rakamları Silme

echo "Server-01 aktif, Server-02 pasif" | tr -d '0-9'
# Çıktı: Server- aktif, Server- pasif

Sıkıştırma İşlemleri (-s Seçeneği)

-s seçeneği (squeeze), ardışık tekrarlanan karakterleri tek bir karaktere indirir. Log analizi ve metin normalizasyonu için çok değerlidir.

Fazla Boşlukları Temizleme

echo "isim:        admin        parola:    gizli" | tr -s ' '
# Çıktı: isim: admin parola: gizli

Bu özellik özellikle awk ile birlikte kullandığınızda çok işe yarar. Bazı komutların çıktıları fazla boşluk içerebilir ve bu durum alan ayrıştırmayı zorlaştırır.

# ps çıktısını temizleyip işleme
ps aux | tr -s ' ' | cut -d' ' -f1,2,3

Tekrar Eden Satırları Değil, Karakterleri Sıkıştırma

# Birden fazla alt çizgiyi teke indir
echo "dosya___adi___burada" | tr -s '_'
# Çıktı: dosya_adi_burada

# Birden fazla tire işaretini teke indir
echo "---baslık---" | tr -s '-'
# Çıktı: -baslık-

Gerçek Dünya Senaryoları

Senaryo 1: Log Dosyası Analizi

Bir web sunucusunun access log dosyasını işlediğinizi düşünün. IP adreslerini listelemek ve istatistik çıkarmak istiyorsunuz.

# Apache access log'dan IP adreslerini çekip analiz et
cat /var/log/apache2/access.log | 
    tr -s ' ' | 
    cut -d' ' -f1 | 
    sort | 
    uniq -c | 
    sort -rn | 
    head -20

Burada tr -s ' ' ile fazla boşlukları temizliyoruz, ardından cut ile ilk alanı (IP adresi) alıyoruz. Bu basit pipeline ile en çok istek yapan IP adreslerini buluyoruz.

Senaryo 2: Config Dosyası Normalizasyonu

Farklı kaynaklardan gelen konfigürasyon dosyalarını standart bir formata getirmeniz gerektiğinde:

# Config dosyasındaki büyük harfli anahtarları küçük harfe çevir
# ve fazla boşlukları temizle
cat uygulama.conf | 
    tr 'A-Z' 'a-z' | 
    tr -s ' ' > temiz_uygulama.conf

Senaryo 3: Parola ve Token Üretimi

tr komutu güvenli rastgele string üretmek için de kullanılabilir. Bu özellikle otomatik deployment script’lerinde işe yarar.

# Güvenli rastgele parola üret
cat /dev/urandom | tr -dc 'A-Za-z0-9!@#$%^&*' | head -c 16
echo ""

# Sadece alfanumerik karakterlerden oluşan token üret
cat /dev/urandom | tr -dc 'A-Za-z0-9' | head -c 32
echo ""

# API key formatında token (sadece büyük harf ve rakam)
cat /dev/urandom | tr -dc 'A-Z0-9' | head -c 24
echo ""

Bu örnekte /dev/urandom‘dan okunan rastgele baytları -dc seçeneğiyle filtreleyip sadece istediğimiz karakterleri tutuyoruz. -d siler, -c tümleyen alır yani “bu karakterler dışındakileri sil” demek oluyor.

Senaryo 4: CSV ve Veri Dönüşümleri

Veri işleme işlerinde sıkça karşılaşılan bir durum: farklı ayırıcılarla gelen verileri standartlaştırma.

# Noktalı virgülden virgüle dönüştürme
cat veri.csv | tr ';' ',' > standart_veri.csv

# Sekmelerden (tab) virgüle dönüştürme
cat veri.tsv | tr 't' ',' > veri.csv

# Virgülden sekmeye dönüştürme
cat veri.csv | tr ',' 't' > veri.tsv

Bu tür dönüşümler özellikle veritabanı import/export işlemlerinde hayat kurtarıcıdır.

Senaryo 5: Script’lerde Değişken Temizleme

Bash script yazarken kullanıcı girdilerini temizlemek kritik önem taşır:

#!/bin/bash

# Kullanıcıdan dosya adı al
echo "Dosya adi giriniz:"
read kullanici_girdisi

# Tehlikeli karakterleri temizle, sadece alfanumerik ve alt çizgiye izin ver
temiz_ad=$(echo "$kullanici_girdisi" | tr -dc 'A-Za-z0-9_.')
echo "Temizlenmiş dosya adı: $temiz_ad"

# Büyük harfleri küçüğe çevir
normalize_ad=$(echo "$temiz_ad" | tr 'A-Z' 'a-z')
echo "Normalize edilmiş: $normalize_ad"

Karakter Sınıfları ile Çalışma

tr POSIX karakter sınıflarını destekler. Bu sınıflar köşeli parantez içinde iki nokta üst üste ile belirtilir:

  • [:alpha:]: Tüm harfler (a-z ve A-Z)
  • [:digit:]: Tüm rakamlar (0-9)
  • [:alnum:]: Harfler ve rakamlar
  • [:lower:]: Küçük harfler
  • [:upper:]: Büyük harfler
  • [:space:]: Boşluk karakterleri (boşluk, sekme, yeni satır, vb.)
  • [:punct:]: Noktalama işaretleri
  • [:print:]: Yazdırılabilir karakterler
  • [:blank:]: Boşluk ve sekme

Bu sınıfları kullanarak daha taşınabilir script’ler yazabilirsiniz:

# Büyük-küçük harf dönüşümü (POSIX uyumlu)
echo "Merhaba DUNYA" | tr '[:upper:]' '[:lower:]'
# Çıktı: merhaba dunya

echo "merhaba dunya" | tr '[:lower:]' '[:upper:]'
# Çıktı: MERHABA DUNYA

# Rakam olmayan her şeyi sil
echo "ab12cd34ef56" | tr -dc '[:digit:]'
# Çıktı: 123456

# Noktalama işaretlerini sil
echo "Merhaba, Dünya! Nasılsın?" | tr -d '[:punct:]'
# Çıktı: Merhaba Dünya Nasılsın

POSIX sınıfları kullanmak özellikle farklı locale ayarları olan sistemlerde çalışırken daha güvenilir sonuçlar verir.

Kaçış Dizileri ile Çalışma

tr birkaç özel kaçış dizisini destekler:

  • n: Yeni satır karakteri
  • t: Sekme karakteri
  • r: Satır başı karakteri
  • \: Ters eğik çizgi
  • a: Zil (alert) karakteri
  • b: Geri silme (backspace)
  • f: Sayfa ilerleme (form feed)
  • v: Dikey sekme
# Yeni satırları boşlukla değiştir (çok satırlı metni tek satıra)
cat /etc/hosts | tr 'n' ' '

# Boşlukları yeni satırla değiştir (her kelimeyi ayrı satıra)
echo "bir iki uc dort" | tr ' ' 'n'
# Çıktı:
# bir
# iki
# uc
# dort

# Sekmeleri virgüle çevir
printf "kolon1tkolon2tkolon3" | tr 't' ','
# Çıktı: kolon1,kolon2,kolon3

tr’yi Diğer Komutlarla Birleştirme

tr tek başına çok şey yapabilir ama asıl gücü pipeline içinde ortaya çıkar.

tr + sort + uniq Kombinasyonu

# Bir metin dosyasındaki kelime frekansını bul
cat metin.txt | 
    tr '[:upper:]' '[:lower:]' | 
    tr -s '[:space:]' 'n' | 
    tr -d '[:punct:]' | 
    sort | 
    uniq -c | 
    sort -rn | 
    head -10

Bu pipeline sırasıyla şu işlemleri yapar: büyük harfleri küçüğe çevirir, boşlukları yeni satıra dönüştürür (her kelime ayrı satırda), noktalama işaretlerini siler, alfabetik sıralar, tekrarları sayar ve en sık geçen 10 kelimeyi gösterir.

tr + grep Kombinasyonu

# Sadece rakam içeren satırları bul, ama önce normalize et
cat log.txt | tr -s ' ' | grep -E '[0-9]{1,3}.[0-9]{1,3}'

# Büyük-küçük harf duyarsız arama (tr ile normalize et)
cat dosya.txt | tr '[:upper:]' '[:lower:]' | grep "aranan_kelime"

tr + awk Kombinasyonu

# Çıktıyı temizleyip awk ile işle
df -h | tr -s ' ' | awk -F' ' '{print $1, $5}'

# Nginx log analizi
cat /var/log/nginx/access.log | 
    tr -s ' ' | 
    awk '{print $9}' | 
    sort | 
    uniq -c | 
    sort -rn

Dikkat Edilmesi Gereken Noktalar

tr kullanırken bazı konulara dikkat etmeniz gerekir.

SET1 ve SET2 uzunlukları: Normalde SET1 ve SET2 aynı uzunlukta olmalıdır. Eğer SET2 kısaysa, tr SET2’nin son karakterini tekrarlayarak uzatır. Eğer SET2 uzunsa ve -t seçeneği kullanılmamışsa bazı implementasyonlar hata verebilir.

# SET2 kısa olursa son karakter tekrarlanır
echo "abcdef" | tr 'abcdef' 'XY'
# Çıktı: XYYYYY (X->X, b->Y, c->Y, d->Y, e->Y, f->Y)

Locale ve Türkçe karakterler: tr Türkçe karakterlerle çalışırken dikkatli olunması gerekir. a-z aralığı Türkçe harfleri kapsamaz.

# Bu çalışmaz (Türkçe ğ, ü, ş, ı, ö, ç dahil değil)
echo "şehir güneş" | tr 'a-z' 'A-Z'
# Çıktı: şEHİR GüNEş (bazı karakterler dönüşmez)

# Bu daha iyi sonuç verir
echo "şehir güneş" | tr '[:lower:]' '[:upper:]'
# Locale'e bağlı olarak çalışabilir

Türkçe karakter dönüşümleri için sed veya Python daha güvenilir sonuçlar verebilir.

tr dosya argümanı almaz: Bunu unutmayın. Direkt tr dosya.txt diyemezsiniz, mutlaka yönlendirme veya pipe kullanmanız gerekir.

# Yanlış
tr 'a-z' 'A-Z' dosya.txt

# Doğru
tr 'a-z' 'A-Z' < dosya.txt
cat dosya.txt | tr 'a-z' 'A-Z'

Yerinde değiştirme (in-place) yapılamaz: sed -i gibi bir seçenek tr‘de yoktur. Yerinde değiştirme için geçici dosya kullanmanız gerekir.

# Geçici dosya kullanarak yerinde değiştirme
tr 'a-z' 'A-Z' < dosya.txt > dosya.tmp && mv dosya.tmp dosya.txt

# Veya sponge komutu varsa (moreutils paketinden)
cat dosya.txt | tr 'a-z' 'A-Z' | sponge dosya.txt

Pratik Tek Satırlıklar (One-Liners)

Günlük sysadmin işlerinde işe yarayacak hazır tr komutları:

# Hostname'i büyük harfe çevir
hostname | tr '[:lower:]' '[:upper:]'

# Çevre değişkenlerini temizle ve listele
env | tr '=' ' ' | awk '{print $1}' | sort

# Dosyadaki tüm noktalama işaretlerini sil
tr -d '[:punct:]' < metin.txt > temiz_metin.txt

# Bir metindeki benzersiz karakterleri bul
echo "merhaba" | tr -s 'a-z' | fold -w1 | sort -u | tr -d 'n'

# Sistem uptime'ını tek satıra getir
uptime | tr -s ' '

# /etc/passwd'dan kullanıcı adlarını çıkar
cut -d: -f1 /etc/passwd | tr 'n' ' '

Sonuç

tr komutu sadeliği ile aldatıcıdır. İlk bakışta “sadece karakter değiştiriyor” gibi görünse de, doğru kullanıldığında metin işleme pipeline’larının vazgeçilmez bir parçası haline gelir. Özellikle şu durumlarda tr‘yi ilk düşünmeniz gereken araç olarak aklınıza not edin: Windows-Linux satır sonu dönüşümleri, harf büyültme-küçültme işlemleri, güvenli string üretimi, log normalizasyonu ve CSV format dönüşümleri.

grep, awk ve sed gibi araçlarla karşılaştırıldığında tr daha hızlıdır çünkü düzenli ifade motorunu devreye sokmaz. Karmaşık metin dönüşümleri için sed veya awk gerekebilir ama basit karakter düzeyindeki işlemler için tr hem daha hızlı hem de daha okunabilir kod üretir.

Eğer henüz tr‘yi aktif olarak kullanmıyorsanız, bir dahaki log analizi veya veri işleme script’inizde denemenizi öneririm. Bir kez alıştıktan sonra onsuz nasıl çalıştığınızı merak edeceksiniz.

Yorum yapın