00 İki aracın rolü
tr ve wc tek satır araçlar — küçük ama pipeline'ın vazgeçilmezleri.
# Büyük harfe çevir
echo "merhaba dünya" | tr 'a-z' 'A-Z'
MERHABA DÜNYA
# Satır sayısı
wc -l /etc/passwd
42 /etc/passwd
# Kelime sıklığı: kelimelere böl, say, sırala
tr -cs 'A-Za-z' '\n' < metin.txt | tr 'A-Z' 'a-z' | \
sort | uniq -c | sort -rn | head -10
01 tr: temel karakter dönüşümü
tr SET1 SET2 SET1'deki her karakteri, SET2'nin karşılık gelen karakteriyle değiştirir. Dosya adı almaz — sadece stdin.
# Küçük → büyük harf
tr 'a-z' 'A-Z' < dosya.txt
# Büyük → küçük harf
tr 'A-Z' 'a-z' < dosya.txt
# Boşlukları alt çizgiye dönüştür
echo "merhaba dünya" | tr ' ' '_'
merhaba_dünya
# Virgülleri sekmeye (CSV → TSV)
tr ',' $'\t' < data.csv
# Satır sonlarını boşluğa (çok satırı tek satıra)
tr '\n' ' ' < liste.txt
# Birden fazla karakter eşleme
tr 'aeiou' 'AEIOU' < dosya.txt # sadece ünlüleri büyüt
# Özel karakterler: \n \t \r \\ gibi kaçış dizileri
tr '\r\n' '\n\n' < windows.txt # CRLF → LF
tr '\r' '' < windows.txt # \r kaldır (dikkat: SET2 boş olmaz)
tr -d '\r' < windows.txt # \r sil (-d ile doğrusu)
tr 'a-z' 'A-Z' dosya.txt çalışmaz — dosya.txt argüman olarak verilse bile yoksayılır, yine stdin bekler. Dosya için yönlendirme: tr 'a-z' 'A-Z' < dosya.txt
02 tr: silme ve sıkıştırma (-d -s)
-d belirtilen karakterleri siler, -s ardışık tekrarları tek karaktere sıkıştırır. İkisi birlikte kullanılabilir.
# Rakamlara sil
echo "abc123def456" | tr -d '0-9'
abcdef
# Noktalama ve özel karakterleri sil
tr -d '[:punct:]' < metin.txt
# Satır sonlarını sil (hepsini tek satıra)
tr -d '\n' < dosya.txt
# -s: ardışık boşlukları tek boşluğa sıkıştır
echo "a b c" | tr -s ' '
a b c
# Birden fazla satır sonunu tek satır sonuna (boş satırları kaldır)
tr -s '\n' < dosya.txt
# -d ve -s birlikte: önce sil, sonra sıkıştır
tr -ds '0-9' ' ' < dosya.txt # rakamları sil, boşlukları sıkıştır
# -c ile tamamlayıcı: sadece harf DEĞİL olanları sil
tr -cd 'A-Za-z\n' < dosya.txt # harfler ve satır sonu dışını sil
03 tr: karakter sınıfları
POSIX karakter sınıfları ([:alpha:], [:digit:]...) yerel ayara (locale) duyarlıdır ve taşınabilir betiklerde tercih edilir.
# POSIX karakter sınıfları ([:sinif:] formatı)
tr '[:lower:]' '[:upper:]' < dosya.txt # a-z → A-Z (locale'e uygun)
tr -d '[:digit:]' < dosya.txt # tüm rakamları sil
tr -d '[:space:]' < dosya.txt # boşluk karakterlerini sil
tr -d '[:punct:]' < dosya.txt # noktalama işaretlerini sil
tr -cd '[:print:]\n' < dosya.txt # yazdırılamaz karakterleri sil
| Sınıf | Karşılığı | Örnek |
|---|---|---|
[:alpha:] | Harfler (a-z, A-Z) | tr -d '[:alpha:]' |
[:digit:] | Rakamlar (0-9) | tr -cd '[:digit:]' |
[:alnum:] | Harf + rakam | tr -cs '[:alnum:]' '\n' |
[:lower:] | Küçük harfler | tr '[:lower:]' '[:upper:]' |
[:upper:] | Büyük harfler | tr '[:upper:]' '[:lower:]' |
[:space:] | Boşluk, tab, \n... | tr -s '[:space:]' ' ' |
[:punct:] | Noktalama işaretleri | tr -d '[:punct:]' |
[:print:] | Yazdırılabilir karakterler | tr -cd '[:print:]\n' |
04 wc: satır, kelime, byte say
wc (word count) adına rağmen satır, kelime, karakter ve byte sayar. Bayrak olmadan hepsini birden verir.
# Hepsini göster: satır, kelime, byte
wc dosya.txt
42 350 2840 dosya.txt
# ^ ^ ^ ^ dosya adı
# satır kelime byte
# Sadece satır sayısı
wc -l dosya.txt
42 dosya.txt
# Sadece kelime sayısı
wc -w dosya.txt
# Sadece byte sayısı
wc -c dosya.txt
# Sadece karakter sayısı (UTF-8'de byte ≠ karakter)
wc -m dosya.txt
# En uzun satır kaç karakter?
wc -L dosya.txt
# Stdin'den (dosya adı göstermez)
cat dosya.txt | wc -l
# Sadece sayıyı al (dosya adı olmadan)
wc -l < dosya.txt
42
wc -l dosya.txt çıktısı: 42 dosya.txt — hem sayıyı hem dosya adını verir. Sadece sayıyı almak için yönlendirme kullanın: wc -l < dosya.txt → 42
05 wc: çoklu dosya ve seçici sayım
Birden fazla dosya verilince wc her birinin sayısını ve toplamı verir. Pipeline'la filtrelenmiş sayım için de kullanılır.
# Çoklu dosya — alt toplam da gösterir
wc -l /var/log/*.log
1234 /var/log/syslog
567 /var/log/kern.log
1801 total
# Sadece toplam (find + xargs)
find . -name '*.py' | xargs wc -l | tail -1
# Projedeki toplam kod satırı (yorumlar dahil)
find src/ -name '*.go' | xargs wc -l 2>/dev/null | tail -1
# Pipe'ta eleman sayısı
ls /usr/bin | wc -l # /usr/bin'de kaç dosya var?
grep 'ERROR' app.log | wc -l # kaç ERROR satırı var?
ps aux | grep 'python' | wc -l # kaç python süreci çalışıyor?
# Dosya boyutunu byte yerine insan-okunur göster
wc -c < dosya.txt | numfmt --to=iec # 2.8K gibi
06 Pratik vakalar
tr ve wc'nin gerçek kullanım senaryoları.
# CRLF → LF (Windows satır sonu → Unix)
tr -d '\r' < windows.txt > unix.txt
# Veya sed ile (yerinde düzenleme)
sed -i 's/\r//' windows.txt
# Metni kelimelere böl: harf olmayan → satır sonu
# -c tamamlayıcı, -s sıkıştır: harfsiz → \n
tr -cs 'A-Za-z' '\n' < makale.txt \
| tr 'A-Z' 'a-z' \
| sort \
| uniq -c \
| sort -rn \
| head -20
# Toplam satır
total=$(wc -l < script.sh)
# Boş olmayan satır sayısı
nonblank=$(grep -c '.' script.sh)
echo "Toplam: $total | Dolu: $nonblank | Boş: $((total - nonblank))"
# API'den dönen JSON'dan sadece sayısal değerleri çek
curl -s 'https://api.example.com/count' \
| jq '.total' \
| tr -d '"' # tırnak işaretlerini sil
# Base64 decode + kontrol karakterleri temizle
echo "SGVsbG8=" | base64 -d | tr -cd '[:print:]'
# Dil bazında satır sayısı (Go projesi)
for ext in go html css js yaml; do
count=$(find . -name "*.$ext" | xargs wc -l 2>/dev/null | tail -1 | awk '{print $1}')
printf "%-6s %s satır\n" ".$ext" "$count"
done
.go 12453 satır
.html 3210 satır
.css 987 satır
.js 2100 satır
.yaml 456 satır
Hatırlanacaklar
trsadece stdin okur —tr 'a-z' 'A-Z' < dosya.txttr -d '\r': Windows satır sonlarını temizle (CRLF → LF)tr -cs 'A-Za-z' '\n': metni kelimelere böl (kelime sıklığı için)tr -s ' ': ardışık boşlukları tek boşluğa sıkıştırwc -l < dosya: sadece sayı (dosya adı olmadan)grep -c '.' dosya: boş olmayan satır sayısı (wc -l'den farklı)- POSIX sınıfları (
[:alpha:]) locale'e duyarlı — taşınabilir betiklerde tercih et
Devam: cut, paste, column — alan seçimi · sort, uniq — sıralama ve tekilleştirme · grep, sed, awk — metin işleme üçlüsü