This article is available in: |
Manuel Muriel Cordero tarafından Yazar Hakkında: Manuel Muriel Cordero Sevilla Üniversitesinde istatistik ve Bilgisayar Bilimleri Fakültesinde okuyor. İçerik:: |
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.
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.
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.
İ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 -> *"'?<
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.nc 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.
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.
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
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:356700bu 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
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
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 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 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' dosyadosyanın üçüncü satırını silecektir.
$ sed '2,4s/e/#/' dosya2 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' dosyabir 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.txtBu ö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.
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, 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-scriptVe ya, daha iyisi, bununla çalıştırma izni de verebilirsiniz
$ chmod 700 shell-scripte 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.
Bu giriş düzeyinde bir makale, kullanıcı daha fazla detayı başka LinuxFocus makalelerinde bulabilir:
|
Webpages maintained by the LinuxFocus Editor team
© Manuel Muriel Cordero, FDL LinuxFocus.org Click here to report a fault or send a comment to Linuxfocus |
2000-11-01, generated by lfparser version 1.9