Doküman

Linux’ta Column ile Veriler Nasıl Biçimlendirilir

Column, en yaygın Linux dağıtımlarının hepsinde genellikle util-linux paketinin bir parçası olarak kurulan ve bu nedenle en minimal kurulumlara bile dahil edilen ücretsiz ve açık kaynaklı bir yardımcı programdır. Bu yardımcı program ile dosyaların içeriğini veya diğer komutların çıktılarını sütunlar halinde düzenleyebilir, güzel tablolar oluşturabilir ve hatta JSON formatlı belgeler üretebiliriz.

Çıktıyı tablo olarak biçimlendirme

Girişte söylediğimiz gibi, bir dosyanın içeriğini veya bir tablodaki diğer komutların çıktısını düzenlemek için “Column” yardımcı programını kullanabiliriz. Unix benzeri işletim sistemlerinde, /etc/fstab dosyası, açılışta otomatik olarak bağlanması gereken dosya sistemleri hakkında bilgi içerir. Söz konusu bilgiler, her biri belirli bir bilgiyi içeren sütunlar halinde düzenlenmiştir. Dosyanın nasıl göründüğüne dair minimal bir örnek:

#
# /etc/fstab
# Created by anaconda on Wed Nov  2 08:18:43 2022
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/rl-root     /                       xfs     defaults        0 0
UUID=2a9dc637-e858-407c-81dc-26ea16ac6c57 /boot                   xfs     defaults        0 0
/dev/mapper/rl-swap     none                    swap    defaults        0 0

Gördüğünüz gibi, /etc/fstab dosyasına yalnızca iki dosya sistemi dahil edilmiştir ve dizelerin farklı uzunlukları nedeniyle sütunlar iyi hizalanmamıştır. Bu, elbette, işlevsellik açısından alakalı değil, ama oldukça çirkin; onu “güzelleştirmek” için “column” yardımcı programını kullanabiliriz.

“Column” komutu, bir girdi dosyasının yolunu argüman olarak kabul eder, ancak bu durumda, işlemeden önce dosyanın içeriğinden yorumları kaldırmak istiyoruz. Bu görevi gerçekleştirmek için sed ve pipe kullanabiliriz:

$ sed /^#/d /etc/fstab | column --table

Yukarıdaki örnekte –table seçeneği (-t) ile “column” yardımcı programını çağırdık: bu bir tablo oluşturmak için gereklidir. İşte elde ettiğimiz sonuç:

/dev/mapper/rl-root                        /      xfs   defaults  0  0
UUID=2a9dc637-e858-407c-81dc-26ea16ac6c57  /boot  xfs   defaults  0  0
/dev/mapper/rl-swap                        none   swap  defaults  0  0

Sütun adları sağlama

“Column” tarafından üretilen çıktı güzel bir şekilde hizalanmıştır, ancak bazı durumlarda sütun adlarını içeren ek bir “satır” eklemek isteyebiliriz. Bunu yapmak için, yardımcı programı –table-columns seçeneğiyle (-N) başlatabilir ve virgülle ayrılmış sütun adları listesini argüman olarak iletebiliriz. Bu durumda şunları çalıştırabiliriz:

$ sed /^#/d /etc/fstab | column --table --table-columns BLOCK_DEVICE,MOUNTPOINT,FILESYSTEM,MOUNT_OPTIONS,DUMP,FSCK_ORDER

Yukarıdaki komut aşağıdaki sonucu üretir:

BLOCK_DEVICE                               MOUNTPOINT  FILESYSTEM  MOUNT_OPTIONS  DUMP  FSCK_ORDER
/dev/mapper/rl-root                        /           xfs         defaults       0     0
UUID=2a9dc637-e858-407c-81dc-26ea16ac6c57  /boot       xfs         defaults       0     0
/dev/mapper/rl-swap                        none        swap        defaults       0     0

Giriş ayırıcısını değiştirme

Varsayılan olarak, “column” yardımcı programı, bir dosyanın içeriğini sütunlar halinde düzenlemek için boşluk karakterini giriş sınırlayıcı olarak kullanır. Bu, önceki örnekte gördüğümüz gibi belirli durumlarda işe yarar, ancak bazen ayırıcı olarak kullanılacak farklı bir karakter belirtmemiz gerekebilir. Örneğin, /etc/passwd dosyasındaki bilgilerin nasıl düzenlendiğine bir göz atalım. Bu dosya, bildiğimiz gibi, hesap bilgilerini depolamak için kullanılır; iki nokta üst üste karakteri (“:”) her girişteki alanları ayırmak için kullanılır:

tux:x:1000:1000:tux:/home/tux:/bin/bash

Yukarıdaki satırda “tux” kullanıcısı hakkında bilgiler yer almaktadır. Satırın ilk alanı kullanıcı adını bildirir. İkincisi parola için kullanılır: burada x, parolanın hash edildiği ve /etc/shadow dosyasında saklandığı anlamına gelir. Üçüncü ve dördüncü alanlar, kullanıcı birincil grubunun sırasıyla UID’sini (Kullanıcı Kimliği) ve GID’sini (Grup Kimliği) bildirir. Beşinci alan sözde GECOS alanıdır: tam adı veya telefon numarası gibi ek kullanıcı bilgilerini içerebilir. Altıncı alan, kullanıcının HOME dizininin yolunu içerir. Yedinci ve son alan, bunun yerine, bu durumda “/bin/bash” olan, kullanıcı için varsayılan kabuk veya komut hakkında bilgi içerir.

Bu dosyanın içeriğini “pretty” tablosunda biçimlendirmek için “column” yardımcı programına ayırıcı olarak “:” kullanmasını söylemeliyiz. Bunu –separator seçeneği (-s) ile yapabiliriz:

$ column --table --separator=":" /etc/passwd

Elde ettiğimiz sonuç şudur:

root                 x  0      0      root                                           /root                      /bin/bash
bin                  x  1      1      bin                                            /bin                       /sbin/nologin
daemon               x  2      2      daemon                                         /sbin                      /sbin/nologin
adm                  x  3      4      adm                                            /var/adm                   /sbin/nologin
lp                   x  4      7      lp                                             /var/spool/lpd             /sbin/nologin
sync                 x  5      0      sync                                           /sbin                      /bin/sync
shutdown             x  6      0      shutdown                                       /sbin                      /sbin/shutdown
halt                 x  7      0      halt                                           /sbin                      /sbin/halt
mail                 x  8      12     mail                                           /var/spool/mail            /sbin/nologin
operator             x  11     0      operator                                       /root                      /sbin/nologin
games                x  12     100    games                                          /usr/games                 /sbin/nologin
ftp                  x  14     50     FTP User                                       /var/ftp                   /sbin/nologin
nobody               x  65534  65534  Kernel Overflow User                           /                          /sbin/nologin
systemd-coredump     x  999    997    systemd Core Dumper                            /                          /sbin/nologin
dbus                 x  81     81     System message bus                             /                          /sbin/nologin
polkitd              x  998    996    User for polkitd                               /                          /sbin/nologin
avahi                x  70     70     Avahi mDNS/DNS-SD Stack                        /var/run/avahi-daemon      /sbin/nologin
rtkit                x  172    172    RealtimeKit                                    /proc                      /sbin/nologin
sssd                 x  997    993    User for sssd                                  /                          /sbin/nologin
pipewire             x  996    992    PipeWire System Daemon                         /var/run/pipewire          /sbin/nologin
libstoragemgmt       x  995    991    daemon account for libstoragemgmt              /var/run/lsm               /sbin/nologin
tss                  x  59     59     Account used for TPM access                    /dev/null                  /sbin/nologin
geoclue              x  994    989    User for geoclue                               /var/lib/geoclue           /sbin/nologin
cockpit-ws           x  993    988    User for cockpit web service                   /nonexisting               /sbin/nologin
cockpit-wsinstance   x  992    987    User for cockpit-ws instances                  /nonexisting               /sbin/nologin
rpc                  x  32     32     Rpcbind Daemon                                 /var/lib/rpcbind           /sbin/nologin
flatpak              x  991    986    User for flatpak system helper                 /                          /sbin/nologin
colord               x  990    985    User for colord                                /var/lib/colord            /sbin/nologin
setroubleshoot       x  989    984    SELinux troubleshoot server                    /var/lib/setroubleshoot    /sbin/nologin
clevis               x  988    983    Clevis Decryption Framework unprivileged user  /var/cache/clevis          /usr/sbin/nologin
gdm                  x  42     42                                                    /var/lib/gdm               /sbin/nologin
gnome-initial-setup  x  987    982                                                   /run/gnome-initial-setup/  /sbin/nologin
rpcuser              x  29     29     RPC Service User                               /var/lib/nfs               /sbin/nologin
sshd                 x  74     74     Privilege-separated SSH                        /usr/share/empty.sshd      /sbin/nologin
chrony               x  986    981                                                   /var/lib/chrony            /sbin/nologin
dnsmasq              x  985    980    Dnsmasq DHCP and DNS server                    /var/lib/dnsmasq           /sbin/nologin
tcpdump              x  72     72                                                    /                          /sbin/nologin
systemd-oom          x  978    978    systemd Userspace OOM Killer                   /                          /usr/sbin/nologin
tux                  x  1000   1000   tux                                            /home/tux                  /bin/bash

Çıkış ayırıcısını değiştirme

Girdi ayırıcı, gördüğümüz gibi, bir dosyanın içeriğini sütunlar halinde düzenlemek için hangi karakterin kullanılması gerektiğini “column”a söylemek için kullanılır. Bunun yerine çıktı ayırıcı, çeşitli alanları sınırlandırmak için komutun çıktısında kullanılır. Varsayılan olarak, çıktı ayırıcı olarak iki boşluk kullanılır; farklı bir karakter kullanmak için bunu –output-separator seçeneğine (-o) argüman olarak iletmeliyiz.

Aşağıdaki örnekte | çıktı ayırıcı olarak karakter:

$ column --table --separator ":" --output-separator "|" /etc/passwd

Şunu elde ederiz:

root               |x|0    |0    |root                                         |/root                    |/bin/bash
bin                |x|1    |1    |bin                                          |/bin                     |/sbin/nologin
daemon             |x|2    |2    |daemon                                       |/sbin                    |/sbin/nologin
adm                |x|3    |4    |adm                                          |/var/adm                 |/sbin/nologin
lp                 |x|4    |7    |lp                                           |/var/spool/lpd           |/sbin/nologin
sync               |x|5    |0    |sync                                         |/sbin                    |/bin/sync
shutdown           |x|6    |0    |shutdown                                     |/sbin                    |/sbin/shutdown
halt               |x|7    |0    |halt                                         |/sbin                    |/sbin/halt
mail               |x|8    |12   |mail                                         |/var/spool/mail          |/sbin/nologin
operator           |x|11   |0    |operator                                     |/root                    |/sbin/nologin
games              |x|12   |100  |games                                        |/usr/games               |/sbin/nologin
ftp                |x|14   |50   |FTP User                                     |/var/ftp                 |/sbin/nologin
nobody             |x|65534|65534|Kernel Overflow User                         |/                        |/sbin/nologin
systemd-coredump   |x|999  |997  |systemd Core Dumper                          |/                        |/sbin/nologin
dbus               |x|81   |81   |System message bus                           |/                        |/sbin/nologin
polkitd            |x|998  |996  |User for polkitd                             |/                        |/sbin/nologin
avahi              |x|70   |70   |Avahi mDNS/DNS-SD Stack                      |/var/run/avahi-daemon    |/sbin/nologin
rtkit              |x|172  |172  |RealtimeKit                                  |/proc                    |/sbin/nologin
sssd               |x|997  |993  |User for sssd                                |/                        |/sbin/nologin
pipewire           |x|996  |992  |PipeWire System Daemon                       |/var/run/pipewire        |/sbin/nologin
libstoragemgmt     |x|995  |991  |daemon account for libstoragemgmt            |/var/run/lsm             |/sbin/nologin
tss                |x|59   |59   |Account used for TPM access                  |/dev/null                |/sbin/nologin
geoclue            |x|994  |989  |User for geoclue                             |/var/lib/geoclue         |/sbin/nologin
cockpit-ws         |x|993  |988  |User for cockpit web service                 |/nonexisting             |/sbin/nologin
cockpit-wsinstance |x|992  |987  |User for cockpit-ws instances                |/nonexisting             |/sbin/nologin
rpc                |x|32   |32   |Rpcbind Daemon                               |/var/lib/rpcbind         |/sbin/nologin
flatpak            |x|991  |986  |User for flatpak system helper               |/                        |/sbin/nologin
colord             |x|990  |985  |User for colord                              |/var/lib/colord          |/sbin/nologin
setroubleshoot     |x|989  |984  |SELinux troubleshoot server                  |/var/lib/setroubleshoot  |/sbin/nologin
clevis             |x|988  |983  |Clevis Decryption Framework unprivileged user|/var/cache/clevis        |/usr/sbin/nologin
gdm                |x|42   |42   |                                             |/var/lib/gdm             |/sbin/nologin
gnome-initial-setup|x|987  |982  |                                             |/run/gnome-initial-setup/|/sbin/nologin
rpcuser            |x|29   |29   |RPC Service User                             |/var/lib/nfs             |/sbin/nologin
sshd               |x|74   |74   |Privilege-separated SSH                      |/usr/share/empty.sshd    |/sbin/nologin
chrony             |x|986  |981  |                                             |/var/lib/chrony          |/sbin/nologin
dnsmasq            |x|985  |980  |Dnsmasq DHCP and DNS server                  |/var/lib/dnsmasq         |/sbin/nologin
tcpdump            |x|72   |72   |                                             |/                        |/sbin/nologin
systemd-oom        |x|978  |978  |systemd Userspace OOM Killer                 |/                        |/usr/sbin/nologin
tux                |x|1000 |1000 |tux                                          |/home/tux                |/bin/bash

İçeriği JSON olarak biçimlendirme

“Column” yardımcı programının gerçekten güzel bir özelliği, bir dosyanın içeriğini, sütunların içeriğini değerler ve sütun adlarını anahtar olarak kullanarak JSON olarak biçimlendirme yeteneğidir. Bu görevi gerçekleştirmek için –json seçeneği (-J) kullanılır. Seçenek yalnızca –table-columns ile birlikte kullanıldığında kabul edilir, ki bu daha önce gördüğümüz gibi sütun adlarını belirtmek için kullanılır:

$ column --table --separator=":" --table-columns username,password,uid,gid,gecos,home,shell --json /etc/passwd

İşte yukarıdaki komut tarafından üretilen çıktı (uygun şekilde kısalttık):

{
   "table": [
      {
         "username": "root",
         "password": "x",
         "uid": "0",
         "gid": "0",
         "gecos": "root",
         "home": "/root",
         "shell": "/bin/bash"
      },{
         "username": "bin",
         "password": "x",
         "uid": "1",
         "gid": "1",
         "gecos": "bin",
         "home": "/bin",
         "shell": "/sbin/nologin"
      },{
         "username": "daemon",
         "password": "x",
         "uid": "2",
         "gid": "2",
         "gecos": "daemon",
         "home": "/sbin",
         "shell": "/sbin/nologin"
      }, # remaining output truncated
   ]
}

Yukarıda da görebileceğiniz gibi, tüm dosya girişlerini içeren listeyle ilişkilendirilen anahtara “tablo” adı verilir. Bunu –table-name seçeneğini (-n) kullanarak değiştirebilir ve argüman olarak kullanmak istediğimiz ismi iletebiliriz.

Yazının orijinalini buradan okuyabilirsiniz.