00 Üç aracın rolü
CSV, TSV ve diğer yapılandırılmış metin dosyalarında sık kullanılan üç küçük araç — her biri bir işi mükemmel yapar.
# /etc/passwd'den kullanıcı adı ve kabuk sütunlarını çek
cut -d':' -f1,7 /etc/passwd | column -t -s':'
root /bin/bash
daemon /usr/sbin/nologin
www-data /usr/sbin/nologin
01 cut: alan bazlı kesme (-f -d)
-f alan numaralarını, -d alan ayırıcıyı belirtir. Varsayılan ayırıcı TAB'dır.
# CSV'den 2. alanı seç (varsayılan ayırıcı TAB)
cut -f2 dosya.tsv
# Virgül ayırıcı ile 1. ve 3. alan
cut -d',' -f1,3 data.csv
# Aralık: 2'den 5'e kadar (2-5 dahil)
cut -d':' -f2-5 /etc/passwd
# Açık aralık: 3'ten sona kadar
cut -d':' -f3- /etc/passwd
# Açık aralık: baştan 4'e kadar
cut -d':' -f-4 /etc/passwd
# Karmaşık seçim: 1, 3-5, 7. alanlar
cut -d',' -f1,3-5,7 data.csv
# Ayırıcı içermeyen satırları çıktıya dahil etme
cut -d',' -f2 -s data.csv # ayırıcısız satırları atla
-f1,3-5,7cut alan sırasını değiştiremez. -f3,1 yazsanız da çıktı 1,3 sıralamasında gelir. Alan sırası değiştirmek için awk '{print $3, $1}' kullanın.
02 cut: karakter ve byte bazlı kesme
-c karakter konumuna, -b byte konumuna göre keser. Sabit-genişlikli dosyalar için idealdir.
# Karakterlere göre: 1-10. karakterler
cut -c1-10 dosya.txt
# 5. karakterden sona kadar
cut -c5- dosya.txt
# Birden fazla aralık: 1-3 ve 8-10
cut -c1-3,8-10 dosya.txt
# Her satırın ilk karakterini sil (indent kaldır)
cut -c2- girintili.txt
# Byte bazlı (UTF-8 çok-baytlı karakterlerde -c tercih edilir)
cut -b1-4 binary.bin
# ls -l çıktısından izin bölümünü çek (sabit genişlik)
ls -l | cut -c1-10
-rw-r--r--
drwxr-xr-x
03 cut: tamamlayıcı seçim (--complement)
--complement seçili alanları değil, seçilmeyenleri verir — belirli sütunu atmak için kullanışlı.
# 2. alan hariç hepsini ver (şifreyi gizle)
cut -d':' -f2 --complement /etc/passwd
# 1-3. alanlar hariç hepsi
cut -d',' -f1-3 --complement data.csv
# Çıktı ayırıcısını değiştir (virgülden sekmeye)
cut -d',' -f1,2,3 --output-delimiter=$'\t' data.csv
# CSV'yi TSV'ye dönüştür
cut -d',' -f1- --output-delimiter=$'\t' data.csv > data.tsv
04 paste: dosyaları yan yana yapıştır
paste birden fazla dosyanın satırlarını yatay olarak birleştirir — her dosyadan karşılıklı satırları yan yana koyar.
# İki dosyayı yan yana yapıştır (TAB ayırıcı)
paste isimler.txt telefonlar.txt
Ali 0555-111-2233
Ayşe 0555-444-5566
# Ayırıcıyı değiştir (: ile)
paste -d':' isimler.txt telefonlar.txt
# Üç dosyayı virgülle yapıştır
paste -d',' ad.txt soyad.txt yas.txt > kişiler.csv
# Tek dosyayı N sütuna dönüştür (-s ardışık, sonra -d)
paste -s -d',' liste.txt # satırları tek satıra topla
ali,ayşe,mehmet,fatma
# Sütun sayısını sınırla: 3'er grupla yan yana
paste - - - < liste.txt # 3 sütun (- = stdin'den oku)
# Stdin'den: seq çıktısını 4 sütuna diz
seq 12 | paste - - - -
1 2 3 4
5 6 7 8
9 10 11 12
-d',-')- bir sütun)paste satır numaralarını eşleştirir — aynı satır numaralı satırları yan yana koyar. Belirli bir anahtara göre eşleştirme için join komutunu kullanın: join -t',' -1 1 -2 1 a.csv b.csv
05 column: sütunları hizala
column dağınık sütunlu metni okunabilir tabloya dönüştürür. Terminalde çıktı sunmak için idealdir.
# Basit hizalama: boşlukla ayrılmış sütunları hizala
column -t dosya.txt
# Özel ayırıcı ile (: ile ayrılmış)
column -t -s':' /etc/passwd | head -10
# CSV'yi hizalı tabloya
column -t -s',' data.csv
# util-linux column (daha yeni): --table-header ile başlık vurgusu
column --table --separator ',' --table-header 'Ad,Soyad,Yaş' data.csv
# Satırları N sütuna diz (liste biçimi)
ls /usr/bin | column
# Sütun genişliğini belirt
column -c 80 liste.txt # 80 karakter genişliğe göre sütunla
# Sık kullanım: ps çıktısını daha okunur yap
ps aux | column -t | head -10
-s',' veya -s':'BSD column (macOS) ile util-linux column (Linux) arasında flag farkları var. --table, --separator, --table-header util-linux'a özgü. Taşınabilir kullanım için -t -s yeterli.
06 Pratik vakalar
Üç aracın gerçek dünya kombinasyonları.
# Kullanıcı adı, UID, home dizin (1, 3, 6. alanlar)
cut -d':' -f1,3,6 /etc/passwd \
| column -t -s':'
root 0 /root
daemon 1 /usr/sbin
www-data 33 /var/www
# cut alan sırası değiştiremez — awk kullan
awk -F',' 'BEGIN{OFS=","} {print $3,$1,$2}' data.csv
# Başlığı koru, veriyi yeniden sırala
head -1 data.csv
tail -n +2 data.csv | awk -F',' 'BEGIN{OFS=","} {print $3,$1,$2}'
# A sunucusu ve B sunucusu çalışan servisler
ssh serverA 'systemctl list-units --type=service --state=running | awk '"'"'{print $1}'"'"'' > a.txt
ssh serverB 'systemctl list-units --type=service --state=running | awk '"'"'{print $1}'"'"'' > b.txt
paste a.txt b.txt | column -t
nginx.service nginx.service
mysql.service postgresql.service
redis.service memcached.service
# Nginx log: alan 1 = IP, alan 10 = yanıt süresi (μs)
awk '{print $1, $10}' access.log \
| sort -k2 -rn \
| head -20 \
| column -t
192.168.1.45 985432
10.0.0.12 756123
172.16.5.100 543210
Hatırlanacaklar
cut -d',' -f2,4: CSV'den 2. ve 4. alanlar — sıra değişmezcut -c5-: her satırın 5. karakterinden sona — indent kaldırmak için--complement: belirtilen alanlar hariç hepsini verpaste - - -: stdin'i 3 sütuna diz (her-bir sütun)paste -s -d',': tüm satırları tek satırda birleştircolumn -t -s':': kolon hizalama için en taşınabilir form- Alan sırası değiştirmek için
awk '{print $3,$1,$2}'—cutbunu yapamaz
Devam: tr, wc — karakter dönüşümü ve sayma · sort, uniq — sıralama ve tekilleştirme · grep, sed, awk — metin işleme üçlüsü