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ı.
Ö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.
Ö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'
-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
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.
- Computer Hope. (2019). Linux cat command ↩
- cat (Unix). Wikipedia ↩
- UNIX Basic commands: cat. Tech on the Net ↩
- Vivek Gite. (2018). How To Use cat Command In Linux / UNIX ↩
- Himanshu Arora. 10 Linux Cat Command Examples for Beginners. HowtoForge ↩
- Ravi Saive. (2017). 13 Basic Cat Command Examples in Linux. TecMint ↩
- The cat Command. Linfo ↩
- Flexo. (2011). How to copy a file without using scp inside an ssh session?. StackExchange ↩