Parsing Dostu: AWK! Özkan KIRIK. ozkan ~ enderunix.org

Benzer belgeler
Regular Expressions Version 0.1

FreeBSD Ağ Uygulamaları

Dizi elemanları yukarıdaki gibi tek tek tanımlanabileceği gibi matematiksel ifadelerdeki diziler gibi de tanımlanabilir.

FreeBSD/OpenBSD Temel A Ayarları

OpenBSD PF CARP ve pfsync ile Redundancy Firewall

Belge Ozan UÇAR tarafından yazılmıştır ve yazarın ismine sadık kalmak kaydı ile belge izin alınmaksızın her şekilde paylaşılabilir ve dağıtılabilir.

FreeBSD Üzerinde VLAN Kullanımı

FreeBSD Üzerinde VLAN Kullanımı

Qt ile Bir Ağ Uygulaması

Javascript. 1) Notepad++ aşağıdaki kodları yazıp deneme.html olarak kaydedelim. 2) Biraz önceki sayfa sadece html kodların içeriyordu.

Internet Programming II

Ders Tanıtım Sunumu. Internet Programming II. Elbistan Meslek Yüksek Okulu Bahar Yarıyılı. Öğr. Gör. Murat KEÇECİOĞLU 1

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Düzenli İfadeler & Kullanım Alanları

Düzenli İfadeler & Kullanım Alanları

Bir dizinin boyutları sabittir ve kullanılmadan önce belirlenmelidir. Dizi boyutunu belirlemek için başka bir değişkende kullanabilirsiniz.

SQL PROGRAMLAMA. Bir batch, bir arada bulunan bir dizi SQL deyimidir. Batch ayıracı GO deyimidir.

while(), do-while(), for() M.İLKUÇAR 2010 MAKU-MYO

Python Programlama Dili

A. Murat Eren AWK Programlama Dili

Internet Programming II. Elbistan Meslek Yüksek Okulu Bahar Yarıyılı

Öğr. Gör. Cansu AYVAZ GÜVEN VERİTABANI-II. Değişken Tanımlama Ve Akış Kontrol Deyimleri

DÖNGÜLER (LOOPS) while(), do-while(), for(), foreach()

HSancak Nesne Tabanlı Programlama I Ders Notları

Sorgudan elde edilen değerin değişkenlere aktarılmasını sağlar. Sorgudan tek satır dönmesi gerekir, aksi durumda hata olur.

EXISTS VE NOT EXISTS fonksiyonları

Regular Expressions ve grep, awk, sed ile Kullanımı

if (ad == "Sabri") Console.WriteLine("Merhaba Sabri. Ne zamandır gözükmüyodun...");

Özyineleme (Recursion)

Değişkenler, içerisinde tek bir değer tutabilen yapılardır. Örneğin haftanın günlerini değişkenlerde tutmak istersek, her bir gün adı için bir

How to ASP Language. Elbistan Meslek Yüksek Okulu Bahar Yarıyılı. Öğr. Gör. Murat KEÇECĠOĞLU. 29 Eki. 1 Kas. 2013

Python Programlama Dili

İnternet Programcılığı Dersi 2.Dönem Ders Notu

String Sınıfını Yönetmek

LABORATUVAR ÇALIŞMASI 1 - Python a Giriş

Daha önce bu işlemin iki tane dosya oluşturduğunu gördük. GecDenTest.aspx dosyasının source kısmında içeriğini inceleyecek olursanız en başta

BTP 207 İNTERNET PROGRAMCILIĞI I. Ders 8

Lambda İfadeleri (Lambda Expressions)

<fn> FORMAT (a1,a2,a3,...) : format deyiminin satır numarasıdır READ, WRITE deyimleri ile verilir. : alan bildirim deyimleridir.

ALGORİTMA VE PROGRAMLAMA II

Bölüm 10: PHP ile Veritabanı Uygulamaları

Windows Sürüm 5.0 Standart Raporlarının NDER ile Bütünleşik Çalıştırılması

k ise bir gerçek sayı olsun. Buna göre aşağıdaki işlemler Matlab da yapılabilir.

1. Her marka için 3 aylık satış toplamı nedir? (Tablodaki satır toplamları)

Öğr. Gör. Cansu AYVAZ GÜVEN VERİTABANI-II. Değişken Tanımlama Ve Akış Kontrol Deyimleri

Genel Programlama II

Php İle Mysql Veritabanından Bilgi Çekme

PHP, nesne-yönelimli (object-oriented) bir dil olduğu için, nesne oluşturma imkânına ve bunların kullanılmasını sağlayan metodlara da sahiptir.

Kodlanacak programlama dilinin kaynaklarından faydalanılarak kod yazımı yapılır.

Microsoft Excel 4.BÖLÜM

Length: metin uzunluğunu yada diğer bir deyişle dizi elaman sayısını döndürür.

Kodlanacak programlama dilinin kaynaklarından faydalanılarak kod yazımı yapılır.

BM102 BİLGİSAYAR PROGRAMLAMA II LABORATUVAR UYGULAMALARI. 3Hafta

Nesne Tabanlı Programlama

ALGORİTMA VE PROGRAMLAMA I

13 Aralık Đlgili Versiyon/lar : ETA:SQL, ETA:V.8-SQL. Đlgili Modül/ler : Raporlar. Kullanıcı Tanımlı Raporlar Bölümünden Yapabildiklerimiz

Sorgudan elde edilen değerin değişkenlere aktarılmasını sağlar. Sorgudan tek satır dönmesi gerekir. Çok satır dönerse hata verir.

C# Programlama Dili. İlk programımız Tür dönüşümü Yorum ekleme Operatörler

C Konsol Giriş Çıkış Fonksiyonları

9. HAFTA KBT204 İNTERNET PROGRAMCILIĞI II. Öğr.Gör. Hakan YILMAZ.

Doküman JETSMS XML Mesaj Đşlemleri Yardım Dokümanı Tarih Sürüm 1.1.0

BİLGİSAYAR BİLİMİ DERSİ (KUR 1) PYTHON PROGRAMLAMA DİLİ ÇALIŞMA KÂĞIDI - 1

Print Komutu ile Değişkenleri Yazdırmak

KELİME İŞLEMCİ MİCROSOFT OFFİCE WORD KULLANIMI

KONTROL YAPILARI JAVADA UC TURLU KONTROL YAPISI VARDIR BUNLAR İF ELSE İF ELSE İF SWİTCH YAPILARIDIR. IF ELSE YAPISI if (deger) { }else {

Komutlar (Devam) ls -a > deneme (ls -a komutunun çıktısı deneme isimli. ls -a >> deneme (ls -a komutunun çıktısı deneme

JAVA PROGRAMLAMA DİLİ ÖZELLİKLERİ

BİL 810 İnşaat Mühendisliğinde Bilgisayar Uygulamaları

How to ASP Language. Elbistan Meslek Yüksek Okulu Güz Yarıyılı. Öğr. Gör. Murat KEÇECĠOĞLU. Hafta V

C++ Göstericiler (Pointer)

GİRİŞ/ÇIKIŞ VE TANIMLAMA DEYİMLERİ

Internet Programming I. Hafta III. Elbistan Meslek Yüksek Okulu Güz Yarıyılı. Öğr. Gör. Murat KEÇECĠOĞLU

Pointers (İşaretçiler)

iris setosa iris versicolor iris virginica

Bilişim Enstitüsü ++ Bilişim Enstitüsü ++ Bilişim Enstitüsü ++ Bilişim Enstitüsü ++ Bilişim Enstitüsü ++ Bilişim Enstitüsü ++ Bilişim Enstitüsü

man komut man ls (ls komutu hakkında bilgi verir.) man pwd (pwd komutu hakkında bilgi verir.)

8 Oracle da tablo yapısı içinde otomatik artan kolon yoktur. (identity kolon

Yukardaki gibi sonsuz döngülü programlara Ctrl+Break tuş takımı ile müdahale edilmesi gerekir, aksi halde program sonsuz döngüye girer.

ÜNİTE 9 ÜNİTE 9 MICROSOFT EXCEL - II TEMEL BİLGİ TEKNOLOJİLERİ İÇİNDEKİLER HEDEFLER

1 NEDEN PROGRAMLAMA ÖĞRENMELIYIZ?

$ rm dosya1 dosya2 dosya3 dosya4 dosya5 dosya6 dosya7 dosya8

PASCAL PROGRAMLAMA DİLİ YAPISI

FONKSİYONLARIN TABLO ŞEKLİNDE HESAPLANMASI

SAB 103 TEMEL BİLGİSAYAR KULLANIMI

Excel de Düşeyara Vlookup) Fonksiyonunun Kullanımı

SM 100 Terazi Ayarları. Digi SM 100. SM 100 Terazi Ayarları

Temel Bilgisayar Programlama Final Sınavı Çalışma Notları

Fedora Core Ağ Ayarları

# ifconfig le netmask broadcast

Pointer Kavramı. Veri Yapıları

SP_RENAMEDB eski_isim, yeni_isim VEYA SP_RENAMEDB 'eski isim', 'yeni isim'

Php 5 ile Filtreleme İşlemleri

Yrd. Doç. Dr. Caner ÖZCAN

MS WORD 6. BÖLÜM. Başvurular sekmesindeki seçenekler Şekil de görülmektedir. Şekil Başvurular Sekmesi

TEMEL STRING İŞLEMLERİ

4- Turbo Pascal Bilgisayar Programlamada Kullanılan Şart Yapıları

BİL1001 Bilgisayar Bilimlerine Giriş 1

Bash ile Programlama. Cem Ahmet Mercan. Ulusal Yüksek Başarımlı Hesaplama Merkezi (UHeM) 13 Temmuz 2017

Android Ders Notları

SIMAN KULLANIM KILAVUZU

Transkript:

Parsing Dostu: AWK! Özkan KIRIK ozkan ~ enderunix.org

Parsing Dostu: AWK! Özkan KIRIK Telif Hakkı 2005 Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.

İçindekiler 1. Awk ya bir bakış...1 2. Awk da Kod Blokları...2 3. Örneklerle Tekrarlı Blok...4 4. Regular Expressions ve Awk...5 5. Diziler ve Awk...8 iii

Bölüm 1. Awk ya bir bakış Awk, genelde giriş metnini inceleyip, metin içerisinde istediğinin verilerin, belirlediğiniz biçimde düzenler ve STDOUT a basar. Awk, giriş metnini bir veri tablosu gibi kabul eder. Tablonun her satırı (Row) bir kayıt gibi yorumlanır. Her sütunu ise Veri Alanı (Field) olarak kabul yorumlanır. Sütunları ayırmak için Alan Ayıracı (Field Seperator) kullanılıyor. Aksi belirtilmediği halde Field Seperator (FS) boşluk karakteridir. Bir ls -l çıktısı alıp inceleyelim, ls -l total 6 -rw-r--r-- 1 ryland wheel 767 Jun 6 00:04.cshrc -rw------- 1 ryland wheel 276 Nov 23 10:16.history -rw-r--r-- 1 ryland wheel 248 Jun 6 00:04.login Bu sonucu, awk ya girdi olarak verirsek, 4 Kayıttan (Row) oluşan bir veriyi inceliyor olacağız. Awk ile giriş metni incelenirken, her satır için Alan Sayısı (Number Of Fields) tekrar hesaplanır. Bu durumda ilk kayıtta NR (Number Of Row) değişkeni 1 i gösterirken, NF (Number Of Fields) değişkeni ise 2 yi gösterecektir. İkinci kayıt için, NR = 2, NF = 9 olacaktır Awk, Alan ayıracının tekrarlanması durumunda tek bir alan ayıracı varmış gibi davranır. Örneğin: "a b" ile "a b" girdileri awk için aynıdır. Awk, alanları 1 den başlayarak numaralandırır. Alanlara erişmek işin alan numarasının önüne $ işareti eklenir. Örneğin birinci alana erişmek için, $1 ifadesi kullanılıyor. Bütün satırı temsilen $0 ifadesi kullanılabilir. Yukarıdaki ls -l de ilk iki satırı incelersek; NR = 1, NF = 2, $1="total", $2="6" NR = 2, NF = 9, $1="-rw-r--r--", $2="1", $3="ryland", $4="wheel", $5="767", $6="Jun", $7="6", $8="00: 1

Bölüm 2. Awk da Kod Blokları Şimdi de, awk nın, kodlarını nasıl yorumladığından bahsedelim, Awk, kodlarını 3 aşamada inceler: 1. Giriş Metni İncelenmeden önce çalışacak kod (BEGIN) 2. Metnin Her Satırı için tekrar edilecek kod 3. İnceleme tamamlandıktan sonra çalışacak kod (END) Örnek bir awk scripti ele alalım: -- ornek.awk -- Giriş incelenmeden önce çalışacak bölüm BEGIN print "Örnek AWK Programına Hoşgeldiniz." print "Aşağıda, giriş metninin sadece birinci sutünları görüntülenecektir." Metnin Her Satırı için tekrar edilecek kod print $1 İnceleme tamamlandıktan sonra çalışacak kod END print "İnceleme tamamlandı." --------------- Scripti çalıştırırsak; ls -l awk -f../ornek.awk Örnek AWK Programına Hoşgeldiniz. Aşağıda, giriş metninin sadece birinci sütunları görüntülenecektir. total -rw-r--r-- -rw------- -rw-r--r-- -rw-r--r-- İnceleme tamamlandı. Aynı işi awk ile commandline olarak yapmak istersek, scripti tek tırnak tırnak içine alarak yazın. Mesela; ls -l awk print $1 Başka bir örnek ele alalım. ls -l nin çıktısında 5. sütun dosya boyutlarını gösteriyor. Bu değerleri toplayıp, toplam dosya sayısını ve boyutunu yazdiralim. -- ornek2.awk -- BEGIN 2

Bölüm 2. Awk da Kod Blokları toplamboyut=0 if (NR!= 1) toplamboyut=toplamboyut+$5 END dosyasayisi=nr-1 1 çıkartmamızın nedeni, ls -l de ilk satırın (total ile başlayan satır) dosya ol print "Toplam," print dosyasayisi" dosya, "toplamboyut" byte." Scripti çalıştıralım, ll awk -f../ornek2.awk Toplam, 4 dosya, 2018 byte. 3

Bölüm 3. Örneklerle Tekrarlı Blok Bu sefer biraz daha farklı bir örnek ele alalım. Giriş metninde kayıt, tek bir satırda değil de, 2 ya da daha fazla satıra yayılmışsa bu kayıtların incelenmesi olayını inceleyelim; -- giris.txt -- Arayan numara 02121112233 5 cevapsiz cagri Arayan numara 02164445566 3 cevapsiz cagri Arayan numara 02127778899 19 cevapsiz cagri --------------- Yukarıdaki şekilde bir girişimiz olsun. Bizden istenen çıktı ise, "02121112233 numarasından 5 çağrı var" şeklinde her arama tek satıra gelecek şekilde bir çıktı. -- ornek3.awk -- if ( (NR%2)==1 ) telno=$3 else aramasayisi=$1 print telno" numarasından "aramasayisi" çağrı var." % operatörü, soldaki sayının, sağdaki sayıya bölümünden kalan sayıyı veriyor (modulus). Bir sayının ikiye bölümünden kalan o sayının tek mi çift mi olduğuna dair fikir edinmemizi sağlıyor. Bu durumda tek satırlarda telefon numarası var, çift satırlarda ise cevapsız arama sayısı yer alıyor. Tek satırlarda telefon numarasını bir değişkene atıyoruz, çift satırlarda ise arama sayısını öğrenip, sonucu ekrana yazdırıyoruz. Şimdi scripti çalıştıralım, cat giris.txt awk -f ornek3.awk 02121112233 numarasından 5 çağrı var. 02164445566 numarasından 3 çağrı var. 02127778899 numarasından 19 çağrı var. 4

Bölüm 4. Regular Expressions ve Awk Regex ler awk da yazılırken / / arasına alınarak yazılır. (Örnek: /^[0-9]/ gibi). Awk da, bir ifadenin verilen regex le eşleşip eşlemediğini kontrol etmek için, ~ (tilda) operatörünü kullanıyoruz. Mesela giriş metninde, rakam ile başlayan satırları gösteren, diğerlerini göstermeyen bir awk kodu yazalım: -- giris.txt -- EnderUNIX Yazılım Geliştirme Takımı 3numaralı sayfa 1209348 nolu evrak Bu satir yazilmayacak degil mi --------------- -- ornek4.awk -- if ( $1 ~ /^[0-9]/ ) print Scripti çalıştırdığımızda; cat giris.txt awk -f ornek4.awk 3numaralı sayfa 1209348 nolu evrak Kodları incelersek, if satırında, ($1 ~ /^[0-9]/) koşulu, 1.ci alanda ($1) ^[0-9] regex inin uyup uymadığını kontrol ediyor. Regex in kullanıldığı bir başka nokta ise, değiştirme işlemi (string substitution). Awk, değiştirme işlemi için 2 fonksiyona sahip; sub ve gsub fonksiyonları. "sub" fonksiyonu verilen ifade içerisinde, aranan regexi ilk bulduğunda değistirme işlemini yapar ve aramayı durdurur. Aynı ifade içerisinde daha sonra aynı regex e uyan başka bir kelime varsa onlar değiştirilmez. "gsub" fonksiyonu ise verilen ifade içerisinde eşleşen bütün regexleri değiştirir. Her iki fonksiyonda da eşleşen kelime & işareti ile temsil edilir. Örneğin, ls -l nin çıktısında bir takım değiştirme işlemlerini yapalım: ls -l total 6 -rw-r--r-- 1 ryland wheel 767 Jun 6 00:04.cshrc -rw------- 1 ryland wheel 276 Nov 23 10:16.history -rw-r--r-- 1 ryland wheel 248 Jun 6 00:04.login -- ornek5.awk -- sub(/-r/,"r",$0); print 5

Bölüm 4. Regular Expressions ve Awk Scripti çalıştırırsak, ls -l awk -f../ornek5.awk total 6 Rw-r--r-- 1 root wheel 767 Nov 24 09:20.cshrc Rw------- 1 root wheel 276 Nov 24 09:20.history Rw-r--r-- 1 root wheel 975 Nov 24 09:21.shrc Rw-r--r-- 1 root wheel 0 Nov 24 09:21.vimrc Yukarıda bahsettiğimiz gibi, sub fonksiyonu sadece ilk eşleşen kelimeyi değiştiriyor. -- ornek6.awk -- gsub(/-r/,"r",$0); print Yukarıdaki örneği uyguladığımızda, ls -l awk -f../ornek.awk total 6 RwR-R-- 1 root wheel 767 Nov 24 09:20.cshrc Rw------- 1 root wheel 276 Nov 24 09:20.history RwR-R-- 1 root wheel 975 Nov 24 09:21.shrc RwR-R-- 1 root wheel 0 Nov 24 09:21.vimrc göründüğü gibi eşleşen tüm kelimeler değiştirilmiş. Bir de & işaretinin kullanımı hakkında bir örnek verelim: -- ornek7.awk -- for (i=1; i<=nf; i++) sub(/[0-9]/,"\&",$i) print Örnek7 yi çalıştıralım; ls -l awk -f../ornek7.awk total 6 -rw-r--r-- 1 root wheel 767 Nov 24 09:20.cshrc -rw------- 1 root wheel 276 Nov 24 09:20.history -rw-r--r-- 1 root wheel 975 Nov 24 09:21.shrc -rw-r--r-- 1 root wheel 0 Nov 24 09:21.vimrc 6

Bölüm 4. Regular Expressions ve Awk Yaptığımız işlem, i değişkenini 1 den NF (Number of Fields) değerine kadar arttırarak değiştirerek her alanda tek tek sub fonksiyonu aracılığı ile rakamla başlayan ifadelerin önüne karakteri ekliyoruz. Burada \& işareti, eşleşen kelimeyi temsil ediyor. 7

Bölüm 5. Diziler ve Awk Awk da dizi anahtarları rakamların yanı sıra kelimeler de olabiliyor. (Örneğin dizi["adi"]="özkan") Dizi işlemlerinin kullanıldığı, ifconfig in çıktısını parse eden bir script üzerinde çalışalım: -- ornek8.awk -- Birinci alanın son karakteri ":" ise ve ikinci alanın başlangıcı "flags" ise if ( ($1 ~ /\:$/) && ($2 ~ /^flags/) ) yukarıdaki koşul doğruysa birinci alan arayüz ismidir arayuz=$1 arayuz isminin sonundaki ":" karakterini kaldıralım sub(/\:/,"",arayuz) Bütün alanları sırayla tara for (x=1; x<=nf; x++) Eğer alanın değeri "inet" ise if ($x=="inet") bir sonraki alanda ip adresi var. alan sayacı olan x i 1 arrtır. x++ arayüz - ip adresi çiftini diziye at. ipadresleri[arayuz]=$x END for (arayuz in ipadresleri) print "Arayüz: "arayuz"\t IP Adresi: "ipadresleri[arayuz] Yukarıdaki scriptin çıktısı: ifconfig awk -f../ornek.awk Arayüz: lo0 IP Adresi: 127.0.0.1 Arayüz: bge0 IP Adresi: 172.16.0.2 Arayüz: bge1 IP Adresi: 192.168.0.1 Arayüz: gif0 IP Adresi: 1.2.3.4 ifconfig bge0: flags=8843<up,broadcast,running,simplex,multicast> mtu 1500 options=1a<txcsum,vlan_mtu,vlan_hwtagging> inet 172.16.0.2 netmask 0xffffff00 broadcast 172.16.0.255 ether 00:14:c2:60:83:9b media: Ethernet autoselect (1000baseTX <full-duplex>) status: active bge1: flags=8843<up,broadcast,running,simplex,multicast> mtu 1500 options=1a<txcsum,vlan_mtu,vlan_hwtagging> inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255 ether 00:14:c2:60:83:9a 8

Bölüm 5. Diziler ve Awk media: Ethernet autoselect (100baseTX <full-duplex>) status: active lo0: flags=8049<up,loopback,running,multicast> mtu 16384 inet 127.0.0.1 netmask 0xff000000 gif0: flags=8051<up,pointopoint,running,multicast> mtu 1500 tunnel inet 1.2.3.4 --> 5.6.7.8 9