column Komutu ile Terminal Çıktılarını Tablo Formatında Düzenleme

Terminal çıktılarına baktığınızda gözleriniz yanıyorsa, sütunlar birbirine giriyorsa ve hangi bilginin nerede olduğunu bulmak için ekrana yaklaşmak zorunda kalıyorsanız, column komutu tam aradığınız şey. Basit ama bir o kadar güçlü olan bu araç, ham ve düzensiz metin çıktılarını düzgün, okunabilir tablolara dönüştürüyor. Günlük sysadmin işlerinde log analizi yaparken, sistem bilgilerini raporlarken ya da script çıktılarını daha anlaşılır hale getirirken column gerçekten hayat kurtarıcı oluyor.

column Nedir ve Ne İşe Yarar?

column komutu, standart girişten veya dosyadan aldığı metni sütunlar halinde hizalayarak ekrana basar. Unix/Linux sistemlerinde util-linux paketinin bir parçası olarak gelir ve neredeyse tüm dağıtımlarda hazır bulunur.

Temel mantığı şu şekilde: Verilen girdiyi belirtilen ayraçlara göre böler, her sütunun maksimum genişliğini hesaplar ve tüm satırları bu genişliğe göre hizalar. Sonuç olarak elle yazmış gibi düzgün bir tablo çıktısı elde edersiniz.

Peki neden awk veya printf kullanmayalım? Kullanabilirsiniz elbette, ama column bu iş için özelleşmiş bir araç. Sütun genişliklerini dinamik olarak hesaplar, sizin her şeyi elle belirtmenize gerek kalmaz. 10 satırlık bir çıktıda da 10.000 satırlık bir çıktıda da aynı kolaylıkla çalışır.

Temel Sözdizimi ve Parametreler

column [seçenekler] [dosya...]

Temel parametreler şunlardır:

  • -t: En çok kullanılan seçenek. Girdiyi tablo formatına çevirir, sütunları otomatik hizalar
  • -s: Sütun ayracını belirtir (varsayılan boşluk veya tab)
  • -o: Çıktıda sütunlar arası kullanılacak ayracı belirtir
  • -n: Başlık satırını belirtir (yeni sürümlerde)
  • -H: Başlık satırını gizler
  • -N: Sütun isimlerini virgülle belirtir
  • -l: Maksimum sütun sayısını sınırlar
  • -c: Çıktının maksimum genişliğini (karakter sayısı) belirtir
  • -x: Sütunları önce sütun bazında, sonra satır bazında doldurur (varsayılan: önce satır)
  • -R: Belirtilen sütunları sağa hizalar
  • -W: Belirtilen sütunları kaydırır (wrap)

util-linux 2.23 sürümünden itibaren column komutu önemli iyileştirmeler aldı. Sisteminizde hangi sürümün kurulu olduğunu şu şekilde kontrol edebilirsiniz:

column --version

İlk Adımlar: Basit Kullanım Örnekleri

En basit kullanım şeklinden başlayalım. Diyelim ki bir dosyada şu şekilde düzensiz bir içerik var:

# Düzensiz metin verisi
echo -e "isim soyisim departman maasnAhmet Yilmaz IT 8500nFatma Kaya Muhasebe 7200nMehmet Demir Satis 6800nAyse Oz IT 9100" | column -t

Bu komut şöyle bir çıktı verir:

isim    soyisim  departman  maas
Ahmet   Yilmaz   IT         8500
Fatma   Kaya     Muhasebe   7200
Mehmet  Demir    Satis      6800
Ayse    Oz       IT         9100

Hiçbir ekstra ayar yapmadan, sadece -t parametresi ile tüm sütunlar otomatik olarak hizalandı. Bu kadar basit.

Şimdi CSV tarzı bir veriyle çalışalım:

# Virgülle ayrılmış veriyi tablo formatına çevirme
cat /tmp/sunucular.csv | column -t -s ','

Burada -s ',' ile virgülün ayraç olduğunu söylüyoruz. Eğer dosyanız noktalı virgülle ayrılmışsa -s ';' kullanırsınız.

Gerçek Dünya Senaryosu 1: /etc/passwd Dosyasını Okumak

/etc/passwd dosyası iki nokta üst üste ile ayrılmış alanlardan oluşur ve ham haliyle okunması gerçekten zor. column ile bunu anında düzeltelim:

# /etc/passwd dosyasını okunabilir formata çevirme
column -t -s ':' /etc/passwd | head -20

Sadece belirli alanları görmek istiyorsak awk ile birleştirebiliriz:

# Sadece kullanıcı adı, UID, GID ve açıklama sütunlarını göster
awk -F: '{print $1, $3, $4, $5}' /etc/passwd | column -t | head -20

Bu kombinasyon sysadmin işlerinde çok sık kullanılır. awk ile istediğiniz sütunları seçip column ile hizalıyorsunuz. Sonuç son derece temiz bir çıktı oluyor.

Gerçek Dünya Senaryosu 2: Disk Kullanımı Raporu

df komutunun çıktısı zaten bir ölçüde formatlanmış olsa da bazen özelleştirilmiş raporlar üretmeniz gerekir. Özellikle birden fazla sunucudan disk bilgisi topluyorsanız column işinizi kolaylaştırır:

# Disk kullanım raporu oluşturma
echo "Aygit Boyut Kullanilan Bos YuzdeDolu MountPoint" > /tmp/disk_rapor.txt
df -h | tail -n +2 | awk '{print $1, $2, $3, $4, $5, $6}' >> /tmp/disk_rapor.txt
column -t /tmp/disk_rapor.txt

Ya da tek satırda pipe zinciriyle:

# df çıktısını özelleştirilmiş formatta göster
{ echo "AYGIT TOPLAM KULLANILAN BOS DOLU_YUZDE BAG_NOKTASI"; df -h | tail -n +2; } | column -t

Kritik disk kullanımını vurgulayan bir script yazalım:

#!/bin/bash
# Disk kullanım raporu - %80 üzerini işaretle

echo "=== Disk Kullanim Raporu ===" 
echo ""
echo "AYGIT TOPLAM KULLANILAN BOS DOLUYU BAG_NOKTASI" | column -t
echo "-----------------------------------------------------------"

df -h | tail -n +2 | while read line; do
    kullanim=$(echo $line | awk '{print $5}' | tr -d '%')
    if [ "$kullanim" -ge 80 ] 2>/dev/null; then
        echo "!!! $line" | column -t
    else
        echo "$line" | column -t
    fi
done

Gerçek Dünya Senaryosu 3: Process Listesi Filtreleme

ps komutunun çıktısını filtreleyip özelleştirmek için column harika çalışır:

# Çalışan web sunucu processleri - temiz format
ps aux | grep -E "(nginx|apache|httpd)" | grep -v grep | 
awk '{print $1, $2, $3, $4, $11}' | 
column -t -N "KULLANICI,PID,CPU%,MEM%,KOMUT" 2>/dev/null || 
awk '{print $1, $2, $3, $4, $11}' | column -t

Daha gelişmiş bir process izleme scripti:

#!/bin/bash
# En fazla CPU kullanan 10 process

echo "Sira KULLANICI PID CPU_PCT MEM_PCT KOMUT" | column -t
echo "=============================================="

ps aux --sort=-%cpu | 
awk 'NR>1 && NR<=11 {print NR-1, $1, $2, $3, $4, $11}' | 
column -t

column ve grep/awk/sed Kombinasyonları

column tek başına güçlü bir araç, ama metin işleme komutlarıyla birleşince gerçek gücünü ortaya koyuyor.

grep ile Birlikte Kullanım

# Log dosyasından belirli hataları tablo formatında çıkar
grep "ERROR" /var/log/uygulama.log | 
awk '{print $1, $2, $3, $NF}' | 
column -t | tail -20

awk ile Birlikte Kullanım

# /etc/hosts dosyasını temiz formatta göster
grep -v "^#" /etc/hosts | grep -v "^$" | 
awk '{print $1, $2, (NF>2 ? $3 : "-")}' | 
column -t -N "IP_ADRESI,HOSTNAME,ALIAS"

sed ile Birlikte Kullanım

# Apache access log analizi
# Son 100 satırdan IP, metod ve yanıt kodunu çıkar
tail -100 /var/log/apache2/access.log | 
sed 's/[.*] //' | 
awk '{print $1, $6, $7, $9}' | 
sed 's/"//g' | 
column -t

Sütun Hizalama ve Gelişmiş Seçenekler

util-linux 2.33 ve üzeri sürümlerde bazı gelişmiş özellikler geldi. Bunları kullanabiliyorsanız işleriniz daha da kolaylaşır.

Sağa Hizalama

Sayısal verileri sağa hizalamak için -R parametresi kullanılır:

# Sayısal sütunları sağa hizala
echo -e "Sunucu CPU_Kullanim Bellek_MBnweb01 45.2 2048ndb01 78.9 8192nmail01 12.1 1024" | 
column -t -R 2,3

Bu çıktıda 2. ve 3. sütunlar (CPU ve Bellek) sağa hizalanır, sayısal değerler alt alta düzgün görünür.

Özel Sütun Ayracı Çıktısı

# Çıktıda sütunlar arası çizgi koy
echo -e "isim departman maasnAhmet IT 8500nFatma Muhasebe 7200" | 
column -t -o " | "

Çıktı şu şekilde olur:

isim  | departman | maas
Ahmet | IT        | 8500
Fatma | Muhasebe  | 7200

Bu format özellikle raporları ekrana yazdırırken veya HTML’e dönüştürmeden önce görsel doğrulama yaparken çok kullanışlı.

Gerçek Dünya Senaryosu 4: Network Bağlantı Raporu

#!/bin/bash
# Aktif ağ bağlantılarını özetleyen rapor

echo "=== Aktif Network Baglantilari ==="
echo ""

# Durum bazlı özet
echo "DURUM SAYI" | column -t
echo "--------------------"
ss -tan | 
awk 'NR>1 {print $1}' | 
sort | uniq -c | 
awk '{print $2, $1}' | 
sort -k2 -rn | 
column -t

echo ""
echo "=== En Fazla Baglanti Yapan IP'ler ==="
echo ""
echo "IP_ADRESI BAGLANTI_SAYISI" | column -t
echo "----------------------------"
ss -tan state established | 
awk 'NR>1 {split($5,a,":"); print a[1]}' | 
sort | uniq -c | 
sort -rn | head -10 | 
awk '{print $2, $1}' | 
column -t

Gerçek Dünya Senaryosu 5: Kullanıcı Hesap Yönetim Raporu

Sistem yöneticisi olarak düzenli kullanıcı denetimleri yapmanız gerekir. column bu raporları okunabilir hale getirir:

#!/bin/bash
# Sistem kullanicilari ve son giris bilgileri

echo "=== Kullanici Hesap Raporu ===" 
echo "Tarih: $(date '+%Y-%m-%d %H:%M')"
echo ""

echo "KULLANICI UID GRUP KABUK SON_GIRIS" | column -t
echo "=================================================="

while IFS=: read -r kullanici sifre uid gid aciklama ev_dizini kabuk; do
    # Sistem kullanıcılarını atla (UID < 1000)
    if [ "$uid" -ge 1000 ] && [ "$uid" -lt 65534 ] 2>/dev/null; then
        son_giris=$(last -1 "$kullanici" 2>/dev/null | 
                    awk 'NR==1 && $1!="wtmp" {print $4,$5,$6}' | 
                    tr -s ' ')
        [ -z "$son_giris" ] && son_giris="Hic_giris_yok"
        echo "$kullanici $uid $gid $kabuk $son_giris"
    fi
done < /etc/passwd | column -t

Dosya Listeleme ve column

ls komutunun çıktısını özelleştirmek için de column kullanabilirsiniz:

# Detaylı dosya listesini daha okunabilir yap
ls -lh /var/log/ | 
awk 'NR>1 {print $1, $3, $4, $5, $9}' | 
column -t -N "IZINLER,SAHIP,GRUP,BOYUT,DOSYA"
# Belirli uzantılı dosyaları bul ve detaylarını göster
find /etc -name "*.conf" -type f 2>/dev/null | 
xargs ls -lh 2>/dev/null | 
awk '{print $5, $9}' | 
sort -k1 -rh | head -20 | 
column -t -N "BOYUT,DOSYA_YOLU"

Script İçinde column Kullanımı

Monitoring ve raporlama scriptlerinde column kullanmak, çıktıların hem log dosyalarına hem de terminal ekranına düzgün yazılmasını sağlar:

#!/bin/bash
# Sistem durum ozeti

rapor_olustur() {
    echo "=========================================="
    echo "  SISTEM DURUM RAPORU"
    echo "  $(hostname) - $(date '+%d.%m.%Y %H:%M:%S')"
    echo "=========================================="
    echo ""
    
    echo "### SISTEM KAYNAKLARI ###"
    echo "KAYNAK KULLANIM DURUM" | column -t
    echo "-----------------------------------"
    
    # CPU
    cpu_yuk=$(uptime | awk -F'load average:' '{print $2}' | cut -d',' -f1 | tr -d ' ')
    echo "CPU_Yuk $cpu_yuk Normal" | column -t
    
    # Bellek
    bellek=$(free -h | awk '/^Mem:/{print $3"/"$2}')
    echo "Bellek $bellek Normal" | column -t
    
    # Swap
    swap=$(free -h | awk '/^Swap:/{print $3"/"$2}')
    echo "Swap $swap Normal" | column -t
    
    echo ""
    echo "### DISK KULLANIMI ###"
    { echo "DOSYA_SISTEMI BOYUT KULLANILAN BOS YUZ BAG_NOKTASI"; 
      df -h | grep -v tmpfs | tail -n +2; } | 
    column -t
}

# Raporu hem ekrana yaz hem dosyaya kaydet
rapor_olustur | tee "/var/log/sistem_raporu_$(date '+%Y%m%d').txt"

Sık Karşılaşılan Sorunlar ve Çözümleri

Sütunlar hala karışık görünüyor: Muhtemelen verinizdeki boşluklar düzensiz. column varsayılan olarak birden fazla boşluğu tek ayraç sayar. Eğer verinizdeyse boşluk içeren alanlar varsa, önce sed veya awk ile bunları farklı bir ayraçla değiştirin.

# Boşluk içeren alanları tırnak içine almak yerine
# ayraç olarak tab veya özel karakter kullan
awk '{OFS="t"; print $1, $2, $3}' veri.txt | column -t -s $'t'

Çok geniş terminal çıktısı: -c parametresiyle maksimum genişlik belirleyebilirsiniz:

column -t -c 120 veri.txt

Eski sistem uyumluluğu: Bazı eski sistemlerde column sadece -t ve -s parametrelerini destekler. -N, -R, -o gibi parametreler çalışmıyorsa sisteminizin util-linux sürümü eski demektir. Bu durumda awk ile printf kombinasyonuna geçmek daha güvenli olabilir.

Çok fazla sütun olduğunda: Veri sütun sayısı çok fazlaysa ve terminal genişliğiniz yetersizse çıktı bozulabilir. Bu durumda ya belirli sütunları awk ile seçin, ya da less -S ile yatay kaydırma yapın:

column -t buyuk_veri.txt | less -S

column Olmadan column Etkisi: Alternatifler

column komutuna erişiminiz yoksa veya daha fazla kontrol istiyorsanız alternatiflere bakalım.

awk ile benzer etki:

# awk ile basit sütun hizalama
awk '{printf "%-20s %-15s %-10sn", $1, $2, $3}' veri.txt

printf ile:

# printf ile başlık ve veri yazdırma
printf "%-20s %-15s %-10sn" "KULLANICI" "DEPARTMAN" "MAAS"
printf "%-20s %-15s %-10sn" "Ahmet Yilmaz" "IT" "8500"

Ancak bu alternatiflerde sütun genişliklerini elle belirlemeniz gerekir. Veri değiştikçe bu değerleri de güncellemeniz lazım. column ise bunu otomatik yapar.

Sonuç

column komutu, sysadmin araç kutusunda küçük ama vazgeçilmez bir yere sahip. Karmaşık log analizi, sistem raporlama veya yapılandırma dosyası okuma gibi günlük görevlerde terminal çıktılarını anında okunabilir hale getiriyor.

En önemli kullanım senaryolarını özetleyecek olursam:

  • /etc/passwd, /etc/group, /etc/fstab gibi iki nokta üst üste veya özel ayraçlı dosyaları okumak için
  • ps, df, ss, netstat gibi sistem komutlarının çıktılarını özelleştirmek için
  • Shell scriptlerinde temiz raporlar üretmek için
  • CSV veya TSV verilerini hızlıca incelemek için
  • grep, awk, sed gibi araçlarla pipe zinciri kurarak güçlü metin işleme akışları oluşturmak için

column -t muhtemelen günde en az birkaç kez kullanacağınız kadar temel bir komut. Buna -s ve -o parametrelerini ekleyince zaten ihtiyaçlarınızın büyük çoğunluğunu karşılıyor. Sisteminiz yeni bir util-linux sürümü destekliyorsa -R ve -N parametrelerini de keşfetmenizi tavsiye ederim.

Terminal çıktıları okunabilir olduğunda, sorunları daha hızlı tespit edersiniz. Ve sorunları hızlı tespit etmek, gece 2’de uyandırılmama şansınızı artırır. Bu tek başına bile column öğrenmek için yeterli bir sebep.

Yorum yapın