cat Komutu ve Kullanımı

Cat, Unix temelli işletim sistemlerinde sıklıkla kullanılan, temelde 3 farklı işlev sunan komutlardan biri. Bu işlevler; bir metin dosyası içeriğinin görüntülenmesi, kopyaların birleştirilmesi (farklı metin dosyası içeriklerinin vb.) ve kopyalardan (farklı metin dosyası içeriklerinden) yeni bir metin içeriği oluşturulması.

AA

Örneklerle ayrı ayrı bu işlemlere değineceğim. Ek olarak, ilerleyen günlerde farklı komutlarla ortak kullanımları ve gelişmiş alternatiflerine de yer vereceğim. Önceki yazılarda ssh key ve mysql şifreleri gibi dosya içeriğinden belirli satırları edinmek için temel bir giriş yaptığım komutun detaylarına geçelim1.

Cat Komutu

Cat komutu, çoğunlukla bir metin dosyasının içeriğini ekrana dökmek için kullanılmakta. Elbette bu işlemi doğrudan metnin kendisini ya da bir parçasını seçecek şekilde gerçekleştirmek mümkün. Bu işleme ek olarak farklı metin dosyalarının içeriğini başka bir dosyaya kaydetme işlemini de gerçekleştirmekte. Bir önceki cümle ile birleştirirsek, farklı metin dosyaları içerisinden seçilecek metinlerden yeni bir metin dosyası içeriği oluşturmak mümkün olmaktadır diyebiliriz. Örneklerle cat komutunun yeteneklerini biraz daha netleştirelim2 3 4.

Cat Komutu Kullanımı

Temel kullanım içerisinde kullanılabilecek opsiyonlar şu şekilde sıralanabilir:

cat [ - q ] [  -r ] [ - s ] [ - S ] [ - u ][ - Z ] [ - n [ - b ] ] [ - v [ - e ] [ - t ] ] [  - | Dosya ... ]

Opsiyonlar dışında en temel kullanımı şu şekildedir.

cat [dosya-adi]

Bu komutun temel işlevi belirtilen dosyayı metin olarak dökmektir. Dosya salt metin dosyası olmak zorunda değildir. Örneğin dosya olarak bir *.jpg dosyası (ikili) da seçebilirsiniz, elbette bu seçim anlamlı bir döküm vermeyecektir. Diğer yandan, *.txt, *.sql, *.json… gibi metin dosyalarını sorunsuz bir şekilde görüntüleyebilirsiniz.

cat SQL

Örnek olarak sunucudaki bir SQL dökümanını görüntüleyelim. cat komutu ardından dökümanımızı bulunduğu yol üzerinden belirtmemiz yeterli.

cat backup.sql

Yukarıdaki kod temel olarak şu alternatif komutlarla da uygulanabilir.

sed 's/a/b/' [dosya-adi]
awk '{print $1}' [dosya-adi]

Yukarıdaki komut uygulamaları döküm aşamasında farklılıklar taşıyacaktır. Bu alternatif komutları paylaşmamın nedeni ilgili komutlarla ilgili paylaşacağım yazılara referans olması ve karşılaştırmalarda değinecek olmam. Şimdilik cat ile kullanabileceğimiz temel opsiyonlara geçelim. -b metin dökümanı boşluklar hariç olacak şekilde, satır numaralarıyla birlikte dökülür

cat -b backup.json

-n Metin dökümanı boşluklar da dahil olacak şekilde, satır numaralarıyla birlikte dökülür. Örneğin aşağıdaki kod backup.json dökümanını görüntülerken içeriğindeki left satırlarını ayıklayacak ve ayıklanan left satırlarının ilk 5 sırasını bize iletecektir.

cat -n backup.json | grep 'left' | head -5

-e Her satır sonuna $ (dolar işareti) eklenir.

cat -e backup.json | grep -e 'inner'
cat grep

-t Tablar ^I ile belirtilir.

cat -t backup.json

-n ve -b opsiyonlarına ek olarak, işlemin başında boş ya da boşluk olarak eklenmiş satırları temizlemek isteyebilirsiniz.

cat [dosya-adi] | grep -v ^$

cat yerine yönlendirme işareti de kullanıldığını görebilirsiniz. Ancak basit işlemler dışında aynı işlemin gerçekleştiğini söylemek yanlış olacaktır. Örneğin bir metin dökümanını < işaretiyle de görüntüleyebilirsiniz. Hatta pipe ile işlemler gerçekleştirebilirsiniz.

< [dosya-adi] | grep 'done'

Yönlendirme işaretlerine tekrar değineceğim. Ancak, öncesinde cat komutunu çoklu metin dosyalarıyla birlikte nasıl kullanabileceğimize bakalım. İlk örneğimiz birden fazla metin dökümanına ait içeriği birleştirmek üzerine olsun. Bu dosyaların her biri farklı formatlarda metin dosyası olabilir.

cat [dosya-adi-1] [dosya-adi-2] [dosya-adi-3] ...

Komutu uyguladığınızda belirttiğiniz metin dosyalarına ait içerikler ekrana dökülecektir. Peki, ekrana dökmek yerine atama işlemi gerçekleştirmek istersek? Yukarıdaki komuta ek olarak, belirtilen dosyaların ardından > yönlendirme işaretiyle (büyüktür işareti) cat ile dökülecek metin yığınını birlestirilmis-yigin'a değer olarak atarız.

cat [dosya-adi-1] [dosya-adi-2] [dosya-adi-3] > [birlestirilmis-yigin]

Unutmayın, yönlendirme işleminde çıktıyı yönlendirmek orjinal verinin kaybolmasına neden olur. birlestirilmis-yigin'a yönlendirdiğimiz içeriği görüntülemek istersek yine cat komutunu kullanabiliriz.

cat [birlestirilmis-yigin]

Hatta, ayrı ayrı dökümanlar içeriğinde de yapabileceğimiz işlemleri bu yığın üzerinden de gerçekleştirebiliriz5. Aşağıdaki iki örnek de aynı sonuca sahip olacaktır.

cat [dosya-adi-1] [dosya-adi-2] [dosya-adi-3] | grep -v ^$
cat [dosya-adi-1] [dosya-adi-2] [dosya-adi-3] > [birlestirilmis-yigin]
cat [birlestirilmis-yigin] | grep -v ^$

Yukarıdaki işlemlerde var olan metin dökümanları üzerinden işlemler yapmıştık. Sıradaki işlemlerimizde yeni metin dökümanları da oluştalım o halde6. Örneğin bir *.json dökümanındaki tableAlias satırlarını bulup var olmayan tableAlias.txt dökümanını oluşturup içeriğine yazdırmak istersem kullanacağım komut şu şekilde olacaktır.

cat /Users/ceaksan/Desktop/backup.json | grep "\"tableAlias\"" > tableAlias

Aynı işlemi aşağıdaki şekilde, çift yönlendirme ile de gerçekleştirebilirsiniz.

cat /Users/ceaksan/Desktop/backup.json | grep "\"tableAlias\"" >> tableAlias

İkisinin temel farkı, tek yönlendirme işareti > dosya var ise üzerine yazma işlemi uygulaması, çift yönlendirme işaretinin >> ise son satıra ekleme yapmasıdır. Ek olarak, çift yönlendirme işaretini kullanarak var olan bir metin dökümanının son satırından itibaren yönlendirme dışında, doğrudan ekleme de yapabiliriz. Notlarımız şeklinde bir dökümanımız olsun ve bu notlarımıza yeni bir ekleme yapalım.

cat >> notlar.txt

Yukarıdaki komut uygulandığında eğer bulunulan dizinde notlar.txt dosyası yoksa yaratılacak ve eklediğiniz satır dökümana işlenecektir. Eğer ilgili dosya mevcutsa son satıra ekleme yapılacaktır. Satır eklediğiniz alandan Ctrl + D kısa yolunu kullanarak çıkış yapabilirsiniz. Bu işlemi tek yönlendirme işareti > ile gerçekleştirdiğinizde yine dizinde belirtilen dosya yoksa oluşturulacak, var ise üzerine yazılacaktır. Dosya kopyalama işlemi de yine yukarıdaki mantıkla işlemektedir.

cat [dosya-adi-1] > [dosya-adi-2]

Yukarıdaki komut [dosya-adi-1] içeriğini [dosya-adi-2] üzerine yazdıracaktır. Çift yönlendirme ile kullanıldığında ise [dosya-adi-1] içeriği [dosya-adi-2] satır sonundan itibaren eklenir. Yönlendirme işareti öncesinde belirteceğiniz her dosya yine yönlendirilen dökümana yönlendirme biçiminize uygun şekilde iletilir. - ve yönlendirme (> veya >>) kullanımında ise yine konsol üzerinden metin eklemeniz mümkün olacaktır7. Yukarıdaki işlemden farkı konsol üzerinden eklediğiniz satırın [dosya-adi-2]’nin ilk satırından itibaren eklenecek olması, ardından da [dosya-adi-1]’in [dosya-adi-2]’e eklenecek olmasıdır.

cat - [dosya-adi-1] > [dosya-adi-2]

Bir diğer kullanımda - işaretini yönlendirmeden önce kullanalım.

cat [dosya-adi-1] - > [dosya-adi-2]

Bu komut uygulandığında komut satırından gerçekleştirilen metin ekleme işlemi [dosya-adi-1]’den sonra gerçekleştirilir ve [dosya-adi-2]’ye uygulanır. Örneği biraz daha detaylandıralım. [dosya-adi-1] içeriğimizde, her satırda bir rakam {0,1,2,3,4,5,6,7,8,9} olsun ve biz rakamları ekrana dökerken bir de başlık ekleyelim. Ardından bu işlemi bir metin dosyası olarak kayıt altına alallım.

echo 'Rakamlar' | cat - [dosya-adi-1] > sayilar.txt
cat echo

Yukarıdaki işlemlerde kullanabileceğiniz pipe yönergelerine de kısaca değineyim. less ile cat komutunda işleyeceğiniz metin dökümanını sayfalara bölebilirsiniz ya da head ile belirtilen satır kadarını görüntüleyebilirsiniz.

cat [dosya-adi-1] | less # ya da head
cat [dosya-adi-1] | head -5 # ya da #tail

Son örneğimizde ise [dosya-adi] dosyamızın içeriğinde tableAlias dışındaki tüm satırları seçip [alan-adi-veya-ip-adresi] sunucumuzun /var/www/html/ yoluna aynı dosya adıyla ya da [dosya-adi-2] olarak iletelim (push)8.

cat [dosya-adi] | grep -v 'tableAlias' | ssh [kullanici-adi]@[alan-adi-veya-ip-adresi] "cat > /var/www/html/[dosya-adi-2]"

Bu işlemi şu şekilde de gerçekleştirebiliriz.

ssh [kullanici-adi]@[alan-adi-veya-ip-adresi] "cat > /var/www/html/[dosya-adi-2]" < [dosya-adi]

Peki, dosya almak (pull) için nasıl bir komut kullanabiliriz? Yapmamız gereken sadece yönlendirmeyi düzenlemek olacak.

ssh [kullanici-adi]@[alan-adi-veya-ip-adresi] "cat /var/www/html/[dosya-adi] | grep -v 'tableAlias'" < [dosya-adi-2]

Şimdilik cat komutuyla ilgili temel işlemleri bu şekilde sınırlandırabiliriz. Her zaman olduğu gibi daha detaylı bilgi için man cat komutunu kullanabilirsiniz.