GNU dosya araçları

Çeviri : Ergün Mıhcıoğlu

 

Abstract:

Bu dizinin ilk bölümü (Temel Unix komutları) Linux hakkında genel bir bilgi verdi. Bu bölüm temel becerileri almanızı ve işletim sistemini kullanabilmenizi sağlayan bir girişti; fakat kullanıcı genel Unix komut kümelerini de öğrenmek isteyebilir. Bu komutları ve kabuğu kullanarak çok verimli dosya ve sistem yönetimi başarılabilir. Bu bölüm bu gelişmiş, aynı zamanda da temel, araçları içerecektir.



 

Giriş: Unix Yoluyla Çalışma

Komutları tanıtmadan önce okuyucu bu komutların tarihi hakkında bazı gerçekleri bilmeli. Yetmişlerin başında Kem Thompson ve Denis RitcheUnix'i geliştirirken programcıların hayat biçimini kolaylaştıracak bir işletim sistemi oluşturmak istemişlerdi. Daha sonra bunu başarabilmenin en iyi yolunun bazı özel görevleri başarıyla yapan az sayıda basit araç tanımlamak olduğuna karar verdiler. Daha karmaşık görevler ise bu basit araçları birleştirerek başarılabilecekti. Bu birleştime sırasında birinin çıktısı diğerinin girdisi olacaktı.

Bu bilgileri gönderme fikri standart girdi ve çıktıyı kullanarak yapıldı. Pipelerin(|) ve tekrar yönelendirmenin (bir önceki makalede anlatıldı) varlığı sayesinde komutları birleştirmek olanaklı hale geldi.

Bunu bir örnekle açıklamak çok kolay. Bir kullanıcı şunu yazsın:

$ who | grep pepe

who ve grep pipe "|" ile birleştirilmiş iki ayrı programdır. who o anda bilgisayara bağlı olan tüm kullanıcıların bir listesini gösterir. Tipik bir çıktı şunun gibidir:

$ who
manolo tty1 Dec 22 13:15
pepe ps/2 Dec 22 14:36
root tty2 Dec 22 10:03
pepe ps/2 Dec 22 14:37

Çıktı tablarla ayrılmış dört alandan oluşmaktadır. Alanlar sırayla: kullanıcı adı(login), bağlantı terminali, bağlantının tarihi ve zamanıdır.

"grep pepe" "pepe" katarını içeren satırı arar.

Ve çıktı şöyledir:

$ who | grep pepe
pepe ps/2 Dec 22 14:36
pepe ps/2 Dec 22 14:37

Belki daha basit birşey istersiniz, birileri bağlı mı değil mi onu bulalım. Şu an bağlı olan terminal sayısını wc programı ile kontrol edebilirsiniz.

wc bir karakter, kelime ve satır sayıcısıdır. Bu durumda bizim sadace satır sayısına ihtiyacımız var, öyleyse sadece -l seçeneğini kullanacağız

$ who | wc -l
4
$ who | grep pepe | wc -l
2

Toplamada 4 kişi bağlı ve pepe iki terminalde bağlı.

Eğer antonio'yu kontrol edersek

$ who | grep antonio | wc -l
0

antonio bağlı değil.

 

GNU Araçlarının Doğuşu

Richard Stallman, GNU projesinin kurucusu, bilgisayar biliminin doğal olarak gelişmesini engelleyen birkaç büyük şirketin varlığı hakkında bir tartışma başlattı. MIT'te emacs editörünü geliştirdikten sonra, büyük şirketlerin müseccel versiyonlar yapmakta kendisinin işlerini kullanması gerçeği hoşuna gitmedi.Bu durumdan ileri gelerek, kaynak koduna herkesin erişebileceği bir yazılım projesine başlamaya karar verdi. İşte bu yazılım GNU. Uzun vadeli hedef hepsi açık kaynaklı tam bir işletim sistemi yapmaktı. İlk adımlar kaynak kodları açık yeni bir emacs versiyonu ve C derleyicisiydi (gcc), ve bununla birlikte unix için bazı tipik araçlar. Bu araçlar bu makalede irdelendi.

 

grep

İlk örneğimiz grep'in ana fonksiyonunu gösterdi. Şimdi grep'i çok daha detaylı bir şekilde ele alacağız.

grep'in temel kullanımı:

$ grep [-seçenekler] örüntü dosyalar

Ve en çok kullanılan seçenekler:
-n eşleşen her satırdan önce satır numarasını yazar(Büyük dosyaların içinde arama yaptığınızda ve eşleşen satırların nerede olduğunu bildiğinizde kullanışlı olur.)
-c eşleşen satır sayısını bulur
-v eşleşmeyen satır sayısını yazar( örüntünün olmadığı satırların aranması)

Örüntü aranacak karakter grubudur. Eğer gömülmüş bir boşluk varsa örüntü ve aranacak dosyanın karıştırılmaması için örüntü tırnak içinde yazılır. Mesela:

$ grep "Hola mundo" dosya.txt

Eğer içinde anlamlı karakterler, tırnak işaretleri, kesme işaretleri ve ya bölü işaretleri olan bir katar arıyorsak, kabukdan kaynaklanan değişiklikleri önlemek için anlamlı karakterden önce ters bölü koyarız:

$ grep \*\"\'\?\< dosya.txt
Bu şunu bulur:
Esto es una cadena chunga -> *"'?<

 

Düzenli ifadeler

grep ve diğer GNU araçları daha kapsamlı aramalar da yapabilir. Bu düzenli ifadelerle mümkündür. Bunlar kabuğun anlamlı karakterlerine benzerler; çünkü karakterlerin ve ya karakter gruplarının yerini değiştirirler. Makalenin sonunda düzenli ifadeleri detaylı bir şekilde anlatan ayrı bir makaleye bağlantı bulacaksınız.
Birkaç örnek:

$ grep c.n

c içeren bir katar, bir karakter ve t'nin varlığını arar.

$ grep "[Bc]el"

Bel ve cel'in bulunduğu tüm yerleri araştırır.

$ grep "[m-o]ata"

mata, nata ve ya oata içeren satırları bulur.

$ grep "[^m-o]ata"

ata ile biten ve baş harfi m, n ve ya o olmayan bir katar içeren satırları arar.

$ grep "^Martin come"

'Martin come' ile başlayan tüm satırlar. ^ köşeli parantezin dışındayken satır başı anlamına gelir, bir önceki örnekteki gibi bir grubun tersi anlamına değil.

$ grep "durmiendo$"

'durmiendo' ile biten tüm satırları. $ satır sonunu işaret eder.

$ grep "^Caja San Fernando gana la liga$"

Tam olarak bu katarı içeren satırlar.

Bu karakterlerin herhangi birinin özel anlamından korunmak için onlardan önce ters bölü işareti koyabiliriz.Örnek olarak:

$ grep "E\.T\."

'E.T.' katarını arar.

 

Find

Bu komut dosyaları bulmak için kullanılır. Diğer bir LinuxFocus makalesi bu komutu açıklıyor ve yapabileceğimiz en iyi şey sizi oraya iletmek.

 

cut & paste

Unix'te bilgi ASCII dosyalarında satır kayıtları ile saklanır ve alanlar özel bir karakterle sınırlandırılır, genel olarak düzenleme işareti ve ya iki nokta üst üste (:). Tipik bir kullanma durumu bir dosyadan bazı alanları alıp onu başka biri ile birleştirmektir. cut ve paste bu işi yapabilir.

Örnek olarak kullanıcı bilgilerini içeren /etc/passwd dosyasını kullanalım. Dosya ":" ile ayrılmış 7 alan içerir. Alanlar kullanıcının kullanıcı ismi, şifrelenmiş durumda şifresi, kullanıcı ID'si, grup ID'si, geco, ana klasör ve tercih edilmiş kabuğu gibi bilgilerini içerir.

Burada bu dosyadan tipik bir parça var:

root:x:0:0:root:/root:/bin/bash
murie:x:500:500:Manuel Muriel Cordero:/home/murie:/bin/bash
practica:x:501:501:Usuario de practicas para Ksh:/home/practica:/bin/ksh
wizardi:x:502:502:Wizard para nethack:/home/wizard:/bin/bash

Eğer kullanıcıları kabuklarıyla birleştirmek istersek alan 1 ve 7'i kesmeliyiz (cut). Hadi yapalım:

$ cut -f1,7 -d: /etc/passwd
root:/bin/bash
murie:/bin/bash
practica:/bin/ksh
wizard:/bin/bash

-f seçeneği kesilecek alanları ve -d alan ayırıcıyı(belirtilmezse düzenleme işareti kabul edilir) belirtir, ve satır üzerinde çalışılacak dosya ile biter.

Ve bir alan aralığı seçmek de mümkündür:

$ cut -f5-7 -d: /etc/passwd
root:/root:/bin/bash
Manuel Muriel Cordero:/home/murie:/bin/bash
Usuario de practicas para Ksh:/home/practica:/bin/ksh
Wizard para nethack:/home/wizard:/bin/bash

Eğer çıktıyı '>' işaretini kullanarak iki farklı dosyaya yönlendirir ve iki çıktıyı da birleştirmek istersek paste komutunu kullanabiliriz:

$ paste output1 output2
root:/bin/bash:root:/root:/bin/bash
murie:/bin/bash:Manuel Muriel Cordero:/home/murie:/bin/bash
practica:/bin/ksh:Usuario de practicas para Ksk:/home/practica:/bin/ksh
wizard:/bin/bash:Wizard para nethack:/home/wizard:/bin/bash

 

sort

geco alanını kullanarak /etc/passwd dosyasını sıralayacağımızı(sort) farzedelim. Bunu yapabilmek için sort'u kullanırız, unix'in sıralama aracı.

$ sort -t: +4 /etc/passwd
murie:x:500:500:Manuel Muriel Cordero:/home/murie:/bin/bash
practica:x:501:501:Usuario de practicas para Ksh:/home/practica:/bin/ksh
wizard:x:502:502:Wizard para nethack:/home/wizard:/bin/bash
root:x:0:0:root:/root:/bin/bash

Dosyanın sıralandığını görmek çok kolaydır. Fakat ASCII tablosu sırası kullanılarak sıralanmıştır. Eğer baş harfler arasında değişiklik yapılmasını istemiyorsak şunu kullanabiliriz:

$ sort -t: +4f  /etc/passwd
murie:x:500:500:Manuel Muriel Cordero:/home/murie:/bin/bash
root:x:0:0:root:/root:/bin/bash
practica:x:501:501:Usuario de practicas para Ksh:/home/practica:/bin/ksh
wizard:x:502:502:Wizard para nethack:/home/wizard:/bin/bash

-t alan ayırıcısını seçmek için kullanılan seçenek. +4 düzenleme yapılmadan önce atlanılacak alanın numarasını gösteriyor ve f büyük yada küçük harf önemsemeden sıralandırılacağını belirtiyor.

Daha karmaşık sıralandırmalar da yapılabilir. Mesela, ilk önce kabuğu kullanarak daha sonra da geco'yu kullanarak sıralandırabiliriz.

$ sort -t: +6r +4f /etc/passwd
practica:x:501:501:Usuario de practicas para Ksh:/home/practica:/bin/ksh
murie:x:500:500:Manuel Muriel Cordero:/home/murie:/bin/bash
root:x:0:0:root:/root:/bin/bash
wizard:x:502:502:Wizard para nethack:/home/wizard:/bin/bash

Borç verdiğin kişileri ve borç verdiğin miktarları tutan bir dosyan olduğunu varsay. Mesela 'deudas.txt':

Son Goku:23450
Son Gohan:4570
Picolo:356700
Ranma 1/2:700

Eğer ziyaret edilecek ilk kişiyi görmek istiyorsan listeyi sıralaman gerekir. Şunu dene:
Şunu dene:

$ sort +1 deudas
Ranma 1/2:700
Son Gohan:4570
Son Goku:23450
Picolo:356700

bu istenilen sonuç değil; çünkü alan sayısı dosya boyunca aynı değil. Çözüm 'n' seçeneği:

$ sort +1n deudas
Picolo:356700
Son Goku:23450
Son Gohan:4570
Ranma 1/2:700

sort için temel seçenekler
+n.m sıralamadan önce ilk n alanı ve daha sonra m karakteri atlar.
-n.m sıralamadan önce ilk n alanı ve daha sonra m karakteri atlar.

Bunlar da değiştirme parametreleri:
boşlukları atlar
-d sözlük sıralanması (sadece harfleri,sayıları ve boşlukları kullanır)
-f büyük küçük harf farklılıklarını görmezlikten gelir
-r sırayı ters çevirir

 

wc

Daha önce gördüğümüz gibi wc bir karakter, kelime ve satır sayacıdır. Normal çıktısı girdi dosyasının satır, kelime ve karakter sayısını içerir.

Çıktı tipi seçeneklerle biçimlendirilebilir

-l sadece satırlar
-w sadece kelime sayısını göster
-c karakter sayısını göster

 

Karşılaştırma araçları : cmp,comm,diff

Bazen aynı dosyanın iki versiyonu arasındaki farkları bilmek isteriz. Bu özellikle programlama alanında birden çok kişi aynı proje ve aynı kaynak kodu üstünde çalıştıklarında kullanılır. Bu araçlar bir versiyon ile diğer bir versiyon arasındaki çeşitliliği bulmak için kullanılır.

cmp bunların en basit olanıdır. cmp iki dosyayı karşılaştırır ve farklılığın görüldüğü yerin konumunu bildirir (farklılığın karakter ve satır numarası)

$ cmp eski yeni
eski yeni differ: char 11234, line 333

comm biraz daha gelişmiştir. çıktısı 3 sütün sağlar. İlki birinci dosyanın tek olan satırını içerir, ikincisi ikinci dosyanın tek olan satırını içerir ve üçüncüsü ortak satırı içeirir. Sayısal parametreler bu sütunların bazılarının atılmasına izin verir.
-1, -2 ve -3 birinci, ikinci ve üçüncü sütunun gösterilmeyeceğini söyler. Bu örnek sadece ilk dosyada görülen ve ortak olan satırı gösterir.

$ comm -2 old new

Sonuncu olarak diff. diff gelişmiş programlama projeleri için çok önemli bir araçtır. Eğer zaten derlemek için bir kernel indirmişsen, yeni bir tanesinin kaynak kodunu ve ya öncekine yama olan bir kaynak kodunu indirebileceğini bilirsin. Ama sonuncusu daha küçüktür. Bu yamanın bir diff takısı vardır, bu onun bir diff çıktısı olduğunu gösterir. Bu araç dosyaları tipik yapmak için editör komutlarını kullanır (vi, rcs). Bu ayrıca dosyaları tutan dizinlere ve arşivlere de uygulanır. Kullanma durumu oldukça açıktır: az olan kaynak kodunu indir (sadece değişiklikleri), yamayı uygula ve derle. Parametreler olmadan değişikliklerin nasıl yapılacağını belirtir, öyleki ilk olan ikinciye eşit olur, vi komutu ile.

$ diff eski yeni
3c3
< The Hobbit
---
> The Lord of the Rings
78a79,87
>Three Rings for the Elven-kings under the sky,
>Seven for the Dwarf-lords in their halls of stone,
>Nine for Mortal Men doomed to die,
>One for the Dark Lord on his dark throne
>In the Land of Mordor where the Shadows lie.
>One Ring to rule them all, One Ring to find them,
>One Ring to bring them all and in the darkness bind them
>In the Land of Mordor where the Shadows lie.

3c3 satır 3'te 3 satrını değişmek zorunda olduğunu gösterir, "The Hobbit"'i kaldırır ve yerine "The Lord of Rings"'i getirir. 78a79,87 satır 79'dan 87'e kadar yeni satırlar girmen gerektiği anlamına gelir.

 

uniq

uniq fazlalıkları temizler. Mesela, sadece şu anda bilgisayara bağlı olan kişileri bilmek istiyorsak who ve cut komutlarını kullanmalıyız:

$ who | cut -f1 -d' '
root
murie
murie
practica

Fakat çıktı tam olarak istediğimiz gibi değil. Kullanıcı murie'in ikinci kayıdını silmeliyiz. Bu şöyle olur:

$ who | cut -f1 -d' ' | sort | uniq
murie
practica
root

-d' ' seçeneği satır ayırıcısının boşluk olduğu anlamına gelir, çünkü who'nun çıktısı düzenleme işareti yerine boşluk karakterini kullanır.

uniq sadece ardışık satırları karşılaştırır. Bizim örneğimizde iki "murie" birbirinin ardından geldi fakat durum farklı olabilirdi.Bundan dolayı uniq'i kullanmadan önce çıktıyı sıralamak iyi bir fikirdir.

 

sed

sed Unix'in en garip araçlarından biridir. Stream editor görevini görür. Genel düzenleme kullanıcının istediği tüm değişiklikleri kontrol kabul eder. sed bize MS-DOS'taki batch dosyalarına benzer küçük kabuk betikleri yazma imkanı tanır. Bize kullanıcı tesiri olmadan bir dosyanın içeriğini değiştirme yeteneğini verir. Editörün yetenekleri hemen hemen tamamlandı ve daha derine inmek bu makaleyi çok uzatır. Öyleyse sadece ana bir giriş yapacağız, geri kalanını ilgilenen kullanıcılar için man ve info sayfalarına bırakacağız.

sed genel olarak şöyle çağırılır:

$ sed 'komut' dosyalar

Örnek olarak içindeki her "Manolo"'yu "Fernando" ile değiştireceğimiz bir dosyayı ele alalım. Bu işi yapmak için:

$ sed 's/Manolo/Fernando/g' dosya

Ve bu değiştirilmiş dosyayı ekrana verir. Eğer sonucu saklamak istiyorsak onu ">" ile bir dosyaya yönlendirebiliriz.

Birçok kullanıcı &'i vi ile değiştiren komutu tanıyacaktır. Ayrıca çoğu ":" komutları (ex'i çağırır) sed'in komutlarıdır.

Genellikle sed direktifleri bir ve ya iki adres (satırları seçmek için) ve çalıştırılacak komuttan oluşur. Adres satır olabilir, satırların aralığı ve ya örüntü olabilir.
En çok kullanılan komutlar:

Komut	  Görev
------- ------
------- ------
a\ adreslenmiş satırlardan sonraki satırı girdiye ekler
c\ adreslenmiş satırları satırı yazarak değiştirir
d satır(lar)ı siler
g örüntüyü sadece ilk göründüğü yerde değil tüm kayıtta
değiştirir
i\ satırları adreslenmiş satırdan sonra yerleştirir
p şimdiki satırları yazar
q adreslenmiş satıra geldiğinde bitirir
r dosya dosyayı okur içeriğini çıktıya ekler
s/bir/iki katar "bir"'i katar "iki" ile yer değiştirir
w dosya şimdiki satırı farklı bir dosyaya kayıt eder
= satır numarasını yazar
! komut komutu şimdiki satıra uygular

sed'i kullanarak hangi satırlara ve ya satır aralıklarına etki etmek istediğini belirtebilirsiniz:

$ sed '3d' dosya

dosyanın üçüncü satırını silecektir.

$ sed '2,4s/e/#/' dosya

2 ile 4'üncü satırlar arasında (ikiside dahil) "e"'yi ilk görüldüğü yerde "#" ile yer değiştirecektir.

Yukarıda tanımlanmış ifadeleri kullanarak belirli bir katarı içeren satırı seçebiliriz:

$ sed '/[Qq]ueen/d' songs

"Quenn" ve ya "quenn"'i içeren tüm satırları silecektir.

Örüntüleri kullanarak bir dosyadaki tüm boş satırları silmek çok kolaydır:

$ sed '/^$/d' dosya

bir satır, boşluk karakteri içerse bile silinmeyecektir. Bunu yapmak için biraz daha geniş bir örüntü kullanmalıyız:

$ sed '/^ *$/d' dosya

"*" karakteri bir önceki karakterin her var oluşunda manasına gelir, bu durumda boşluk (space).

$ sed '/InitMenu/a\
> the text to append' file.txt

Bu örnek "InitMeun" katarını içeren satırı arar ve o satırdan sonra yeni bir satır ekler. Bu örnek sadece bash ve ya sh shelleri ile çalışır. a\'a kadar yazıp return'e bas ve geri kalanını yaz.

Tcsh tırnak içerisinde yeni satır uzatmayı başka bir yolla yapar. Bundan dolayı tcsh'de çift ters bölü kullanlamalısınız:

$ sed '/InitMenu/a\
? the text to append' file.txt

? bash örneğinde olduğu gibi kabukdan gelir.

 

awk

Sonuncu program awk. İsmi geliştiricilerinin isminden geliyor: Alfred Aho Peter Weinberger ve Brian Kernighan.

awk Unix programları arasında en ilginç olanıdır. awk komut satırında geniş çeşitlilikteki işlemleri yapmamızı sağlayan karmaşık bir araçtır.

Dikkatinizi çekmiştir ki; awk ve sed daha karmaşık kabuk betiklerinin anahtar parçalarıdır. C ve ya başka bir programlama dili kullanmadan yapabileceğiniz şeyler gerçekten eykileyicidir.Slackware Linux kurulumu herhangi bir CGI ve programı kadar iyi bir kabuk betiğidir.

Bu günlerde komut satırı araçları bir kenara bırakıldı; çünkü şimdiki window ortamı için çok eskiler ve perl betiğinin gelmesi ile kabuk betikleri perl betikleri ile değiştirildi. Bu durumda komut satırı araçları unutulacakmış gibi görülebilir; fakat benim özel tecrübelerim gösteriyorki bir çok uygulama birkaç satır kabuk betiği ile yapılabilir (küçük bir veritabanı yönetimi dahil). Bundan ayrı olarak, satır komutlarını kabuğu kullanarak çok verimli olabilirsiniz.

Eğer awk ve sed'in gücünü birleştirirseniz genel olarak küçük bir veritabanı yöneticisi ile yapılan bir işlemi çok çabuk bir şekilde yapabilirsiniz.

Satın aldığınız malları, miktarlarını ve ürün başına fiyatlarını içeren bir faturayı ele alalım. Dosyaya "satıslar" diyelim:

portakal 	5	250
mandalina 3 120
elma 2 360

Bu alan ayırıcısı düzenleme işareti olan 3 kayıtlı bir dosyadır. Şimdi toplam tutarı veren dördüncü bir alan eklemek istiyoruz:

$ awk '{total=$2*$3; print $0 , total }' satıslar
portakal 6 250 1250
mandalina 3 120 360
elma 2 360 720

toplam ikinci ve üçüncü alanlardaki değerlerin çarpımını içeren bir değişkendir. Çarpımdan sonra tüm satır ve toplam değer yazıldı.

awk kendisi metin dosyalarındaki bilgilerle işlem yapmaya uyum sağlamış bir programlama ortamıdır. Eğer programla ilgileniyorsanız man ve info sayfalarını kullanarak bu program hakkında daha fazla şey öğrenebilirsiniz.

 

Kabuk betikleri

Kabuk betikleri, sırayla çalıştırmak için bir dosyada kaydedilmiş sistem komutlarıdır.

Kabuk betikleri DOS'taki batch dosyalarına benzer fakat onlardan daha güçlüdür. Kullanıcıya var olan komutları birleştirerek yeni komutlar yapma şansını tanır.

Kabuk betikleri parametre alabilirler. Parametreler, $0,$1,$2'den $9'a kadar olan değişkenlerde saklanırlar. Komut satırındaki tüm parametreler $* ile ifade edilebilir.

Herhangi bir metin editorü ile kabuk betikleri yaratılabilir. Betiği başlatmak için şunu yazmalısın:

$ sh shell-script

Ve ya, daha iyisi, bununla çalıştırma izni de verebilirsiniz

$ chmod 700 shell-script

e bunu yazarak çalıştır

$ shell-script

Bu makaleyi ve kabuk betikler hakkında tartışmayı burada bitiriyoruz, kabuk betiklerini ileriye erteliyoruz. Bir sonraki makale en çok kullanılan Unix metin editorlerini anlatacak: vi & emacs. Her Linux kullanıcısı bunlatı bilmeli.

 

Kaynaklar

Bu giriş düzeyinde bir makale, kullanıcı daha fazla detayı başka LinuxFocus makalelerinde bulabilir:

 

Kaynakça

İlerideki okumalar için:

 

Ana Sayfaya