26 Mayıs 2010

Eski dost shell script

ile hasan

2001 senesinde (arkadaşlarımdan bir sene gecikmeli olarak) mezun olup Ankara’daki Bimel Elektronik şirketinde php yazılımcı olarak işe başlamıştık. İşe girmemize aynı üniversitede farklı bölümler okuduğumuz bir arkadaşım vesile olmuştu. Kendisi aynı firmada sistem yöneticisiydi. Biz de şirketin php-mysql tabanlı intranetini idame ettirmek ve yeni uygulamalar hazırlamak için Barış’ın tavsiyesi ile giden elemanın yerine işe alınmıştık.

O yıllar Linux ile en çok haşır neşir olduğum zamanlardı. Nasıl olmayayım, hemen karşımdaki masada Barış sıfırdan işletim sistemi dağıtımı (İstanbulx) hazırlıyor, her gün dökümanlar hazırlayıp nette yayınlıyordu. Istanbulx’in boot ekranının grafik çalışmasını ve pelikan logosunu da bildiğimiz kadarıyla biz hazırlamaya çalışmıştık. Aynı evi paylaştığımız için Linux’le yatıp Linux’le kalkıyorduk.

Ofisteki bilgisayarımda Slackware vardı. Masaüstüm KDE idi ve PHP editörü olarak sanırım Quanta kullanıyordum. Linux’un en sevdiğim yanı komut satırı (shell) idi (Windows’un ise en sevmediğim yanı). Barış php ile yapabileceğim işleri komut satırında anında hallediyordu. Beni şirkete aldırırken biraz Linux bilgim olduğunu sanıyordu ama ben “ls ne işe yarar?” diye sorduğumda suratındaki acı ifadeyi görmüştüm ve artık komik kaçabilecek soruları sormaktansa google’da arıyordum.

PHP ile fazla haşır neşir olduğum için çok heveslenmeme rağmen sistem yöneticisi olarak kendimi yetiştiremedim ama o günlerden hatıra olarak içimde hep bir Unix/Linux sevgisi kaldı. Windows’dan sıkıldığım zamanlarda en meşhur hangi Linux dağıtımı varsa onu kurup bir süre idare ediyordum. Photoshop ve veritabanı erişim programı EMS olmasa Windows’un adını bile etmezdim aslında. Ama bir yerde mecbur kalıyordum. Taki Mac OS ile tanışana kadar! Bu yazının konusu olmadığı için kısa keseceğim, blogdaki diğer yazılarda bahsettiğim üzere eşime iMac aldığımızda Mac Os ile yakından tanıştık ve yıllardır aradığım Windows’dan daha güzel, daha etkin ve Unix komutlarını doyasıya kullanabileceğim işletim sisteminin Mac Os olduğunu anladık. O günden beri elime geçen tüm pc’lere Mac Os kurmaya uğraşıyorum 🙂

Yazının başlığında “eski dost shell script” dedim ama henüz o mevzuya gelemedim değil mi 🙂

Efendim, PHP projemize çoklu dil desteği kazandıralım diye bir talimat geldi. Biz de işe formlardan başlayalım dedik. Diğer programcı arkadaşım formları tek tek açıp içindeki setLabel(“İsim:”) gibi ifadelerin stringlerini tek tek bir dosyaya yazmak isteyince aklıma shell script geldi.  Shell script ile dosyaları komut satırından süzüp aradığımız kelimenin geçtiği satırları istediğimiz gibi parse edip (parçalayıp) aralarından istediğimiz kısımlarını çıktı olarak başka bir dosyaya kaydedebiliyoruz rahatlıkla.

Kaynak dosyalarımızın içeriği şu şekilde idi:

$ogrenciNo = new Zend_Form_Element_Text(‘ogrenci_no’);
$ogrenciNo->setLabel(‘Öğrenci No’)
->addFilter(‘StripTags’)
->setValue($row[‘ogrenci_no’])
->addValidator(‘StringLength’, false, array(7, 7));

$ogrenciAdi = new Zend_Form_Element_Text(‘kb_adi’);
$ogrenciAdi->setLabel(‘Adı’)
->addFilter(‘StripTags’)
->addFilter(‘StringToUpper’)
->setValue($row[‘kb_adi’])
->addValidator(‘StringLength’, false, array(2, 50));

$ogrenciSoyadi = new Zend_Form_Element_Text(‘kb_soyadi’);
$ogrenciSoyadi->setLabel(‘Soyadı’)
->addFilter(‘StripTags’)
->addFilter(‘StringToUpper’)
->setValue($row[‘kb_soyadi’])
->addValidator(‘StringLength’, false, array(2, 50));

Bize bu dosyalardaki setLabel fonksiyonlarına parametre olarak gönderdiğimiz stringler gerekiyordu. Bu dosya gibi n tane form dosyası bir klasörde yer alıyordu. Bu işlem için dosyaların bulunduğu klasöre gidip komut satırından şunu yazmak yeterli:

#grep “setLabel” * | grep -v “submitLabel” | cut -d : -f 2 | cut -d \’ -f 2 >>cikti.txt

Tek tek açıklayalım;

grep “setLabel” *    //bulunduğumuz klasördeki tüm dosyalar içerisinde setLabel kelimesinin geçtiği satırları aşağıdaki gibi verir

DersProgramiForm.php:        $donem->setLabel(‘Dönem’)
DersProgramiForm.php:        $submit->setLabel($submitLabel)
FinalProgramiForm.php:        $submit->setLabel($submitLabel)
FinalProgramiForm.php:               $hocaKodu->setLabel(‘Öğrt. Üyesi’)
FinalProgramiForm.php:           $dersKodu->setLabel(‘Ders’)

Görüldüğü üzere hangi dosyada geçiyorsa onu da DosyaAdi: kelime şeklinde ekrana basıyor (daha doğrusu standart çıktı arabirimine gönderiyor). Pipe (|) ifadesi ile bu standart çıktıdaki bilgiyi diğer komuta standart girdi olarak vermiş oluyoruz.

grep -v “submitLabel”    //standart girdi’den aldığı bilgi içerisinde submitLabel geçmeyenleri alır

DersProgramiForm.php:        $donem->setLabel(‘Dönem’)
FinalProgramiForm.php:               $hocaKodu->setLabel(‘Öğrt. Üyesi’)
FinalProgramiForm.php:           $dersKodu->setLabel(‘Ders’)

cut -d : -f 2      //standart girdi’den aldığı bilgiyi iki nokta üstüste (:) ifadesinden bölerek 2. sutundaki (-f 2)  bilgiyi aşağıdaki gibi verir.

$donem->setLabel(‘Dönem’)
$hocaKodu->setLabel(‘Öğrt. Üyesi’)
$dersKodu->setLabel(‘Ders’)

Şimdi de bu çıktıyı tekrar -bu kez tırnak (‘) işaretinden- parçalama işlemine tabi tutup ikinci sutunu almak gerekiyor. Onun için bu bilgiyi terkar pipe (|) ile cut işlemin standart girdi olarak veriyoruz.

cut -d \’ -f 2     //standart girdiden gelen bilgiyi tek tırnak (‘) ifadesinden bölerek ikinci sutundaki bilgiyi aşağıdaki gibi verir:

Dönem
Öğrt. Üyesi
Ders

İşte sonunda istediğimiz kıvama geldi çıktımız. Bunu da bir dosyaya kaydettik mi işlemimiz tamamdır. Bunun için >>cikti.txt ifadesini kullanıyoruz. Eğer bu işlemi n tane klasöre uygulayacaksak ve her defasında sonucu bir dosyanın içine alt alta devam edecek şekilde kaydedeceksek >> ifadesini kullanmamız gerekiyor. Eğer > ifadesi ile bir dosyaya yönlendirirsek o zaman her defasında dosyayı silbaştan oluşturacağı için eski bilgiler gidecektir. Bunu da hatırlatmış olalım.