AWK - AWK

AWK
ParadigmaKomut dosyası oluşturma, prosedürel, veri tabanlı[1]
Tarafından tasarlandıAlfred Aho, Peter Weinberger, ve Brian Kernighan
İlk ortaya çıktı1977; 43 yıl önce (1977)
Kararlı sürüm
IEEE Std 1003.1-2008 (POSIX) / 1985
Yazma disipliniYok; dizeleri, tam sayıları ve kayan nokta sayılarını işleyebilir; düzenli ifadeler
işletim sistemiÇapraz platform
Majör uygulamalar
awk, GNU Awk, mawk, nawk, MKS AWK, Thompson AWK (derleyici), Awka (derleyici)
Lehçeler
eski awk oawk 1977, yeni awk nawk 1985, GNU Awk gawk
Tarafından etkilenmiş
C, sed, SNOBOL[2][3]
Etkilenen
Tcl, AMPL, Perl, Korn Kabuğu (ksh93, dtksh, tksh), Lua

AWK (awk)[4] bir alana özgü dil metin işleme için tasarlanmıştır ve tipik olarak bir veri çıkarma ve raporlama aracı. Sevmek sed ve grep, bu bir filtre,[4] ve çoğunun standart bir özelliğidir Unix benzeri işletim sistemleri.

AWK dili bir veri tabanlı komut dosyası dili karşı alınacak bir dizi eylemden oluşur Canlı Yayınlar metin verileri - doğrudan dosyalar üzerinde çalıştırın veya bir boru hattı - biçimlendirilmiş raporlar üretmek gibi metin çıkarma veya dönüştürme amaçları için. Dil yaygın olarak kullanır dizi veri tipi, ilişkilendirilebilir diziler (yani, anahtar dizeler tarafından indekslenen diziler) ve düzenli ifadeler. AWK'nın sınırlı bir amacı varken Uygulama alanı ve özellikle desteklemek için tasarlandı tek astarlı programlar, dil Turing tamamlandı ve hatta AWK'nın ilk Bell Labs kullanıcıları bile genellikle iyi yapılandırılmış büyük AWK programları yazdılar.[5]

AWK şu saatte oluşturuldu: Bell Laboratuvarları 1970 lerde,[6][daha iyi kaynak gerekli ] ve adı soyadlar yazarlarından: Alfred Aho, Peter Weinberger, ve Brian Kernighan. Kısaltma, kuşla aynı şekilde telaffuz edilir auk kapağında bulunan AWK Programlama Dili.[7] Tüm küçük harflerle yazıldığında awk, atıfta bulunur Unix veya Plan 9 AWK programlama dilinde yazılmış betikleri çalıştıran program.

Tarih

AWK ilk olarak 1977'de Alfred Aho (yazar egrep ), Peter J. Weinberger (küçük ilişkisel veritabanları üzerinde çalışan) ve Brian Kernighan; adını kendi baş harflerinden alır. Kernighan'a göre, AWK'nın hedeflerinden biri hem sayıları hem de dizgileri kolayca manipüle edebilecek bir araca sahip olmaktı. AWK ayrıca Marc Rochkind giriş verilerinde kalıp aramak için kullanılan ve kullanılarak uygulanan programlama dili yacc.[8]

Görünen ilk araçlardan biri olarak Sürüm 7 Unix AWK, bir Unix'e hesaplama özellikleri ekledi boru hattı yanında Bourne kabuğu, standart bir Unix ortamında kullanılabilen tek komut dosyası dili. Cihazın zorunlu hizmetlerinden biridir. Tek UNIX Belirtimi,[9] ve tarafından gereklidir Linux Standart Tabanı Şartname.[10]

AWK, 1985–88'de önemli ölçüde revize edildi ve genişletildi. GNU AWK tarafından yazılmış uygulama Paul Rubin, Jay Fenlason, ve Richard Stallman 1988'de piyasaya sürüldü.[11] GNU AWK, en yaygın kullanılan sürüm olabilir[12] çünkü GNU tabanlı Linux paketlerine dahildir. GNU AWK, yalnızca Arnold Robbins 1994 ten beri.[11] Brian Kernighan 's nawk (Yeni AWK) kaynağı ilk olarak 1993'te yayınlanmamış ve 1990'ların sonlarından bu yana halka açık bir şekilde yayınlandı; birçok BSD sistemi bunu GPL lisansından kaçınmak için kullanır.[11]

AWK'dan önce sed (1974). Her ikisi de metin işleme için tasarlanmıştır. Satır odaklı, veri odaklı paradigmayı paylaşırlar ve özellikle yazmaya uygundurlar tek astarlı programlar örtük nedeniyle Ana döngü ve mevcut hat değişkenleri. Erken AWK programlarının gücü ve anlaşılırlığı - özellikle tek satırlıları kolaylaştıran örtük değişkenler nedeniyle güçlü düzenli ifade işleme ve kısa ve öz olma - o zamanki AWK sınırlamalarıyla birlikte, önemli ilham kaynağı oldu. Perl dil (1987). 1990'larda Perl, Unix metin işleme dillerinin nişinde AWK ile rekabet ederek çok popüler oldu.

AWK programlarının yapısı

AWK, girişi her seferinde bir satır okur. Programdaki her desen için bir satır taranır ve eşleşen her desen için ilgili eylem yürütülür.

— Alfred V. Aho[13]

Bir AWK programı, şu şekilde yazılan bir dizi model eylem çiftidir:

şart { aksiyon }şart { aksiyon }...

nerede şart tipik olarak bir ifadedir ve aksiyon bir dizi komuttur. Giriş, kayıtlara bölünür, burada varsayılan kayıtlar satırsonu karakterleriyle ayrılır, böylece giriş satırlara bölünür. Program sırayla her bir kaydı koşullara karşı test eder ve aksiyon doğru olan her ifade için. Ya koşul ya da eylem ihmal edilebilir. Koşul, varsayılan olarak her kayıtla eşleşir. Varsayılan eylem, kaydı yazdırmaktır. Bu, sed ile aynı model-eylem yapısıdır.

Basit bir AWK ifadesine ek olarak, örneğin foo == 1 veya / ^ foo /koşul olabilir BAŞLA veya SON eylemin tüm kayıtlar okunmadan önce veya okunduktan sonra yürütülmesine neden olmak veya desen1, desen2 eşleşen bir kayıtla başlayan kayıt aralığıyla eşleşen desen1 eşleşen kayıt dahil desen2 tekrar eşleşmeye çalışmadan önce desen1 gelecek satırlarda.

Normal aritmetik ve mantıksal operatörlere ek olarak, AWK ifadeleri tilde operatörünü içerir, ~ile eşleşen Düzenli ifade bir dizeye karşı. Kullanışlı Sözdizimsel şeker, / regexp / tilde operatörü kullanılmadan geçerli kayıtla eşleşir; bu sözdizimi şundan türemiştir: sed bu da onu ed editör, nerede / arama için kullanılır. Eğik çizgi kullanmanın bu sözdizimi sınırlayıcılar düzenli ifadeler sonradan tarafından kabul edildi Perl ve ECMAScript ve artık yaygındır. Tilde operatörü de Perl tarafından benimsendi.

Komutlar

AWK komutları, yerine geçen ifadelerdir. aksiyon yukarıdaki örneklerde. AWK komutları, işlev çağrılarını, değişken atamaları, hesaplamaları veya bunların herhangi bir kombinasyonunu içerebilir. AWK, birçok işlev için yerleşik destek içerir; çok daha fazlası çeşitli AWK lezzetleriyle sağlanır. Ayrıca, bazı tatlar aşağıdakilerin dahil edilmesini destekler: dinamik bağlantılı kitaplıklar, bu da daha fazla işlev sağlayabilir.

Yazdır komut

Yazdır komutu metin çıktısını almak için kullanılır. Çıktı metni her zaman, varsayılan değeri bir satırsonu olan çıktı kaydı ayırıcısı (ORS) adı verilen önceden tanımlanmış bir dizeyle sonlandırılır. Bu komutun en basit şekli:

Yazdır
Bu, mevcut kaydın içeriğini görüntüler. AWK'da kayıtlar, alanlarve bunlar ayrı ayrı görüntülenebilir:
1 $ yazdır
Mevcut kaydın ilk alanını görüntüler
1 $, 3 $ yazdır
Geçerli kaydın birinci ve üçüncü alanlarını, varsayılan değeri tek boşluk karakteri olan çıktı alanı ayırıcısı (OFS) adı verilen önceden tanımlanmış bir dizeyle ayrılmış olarak görüntüler.

Bu alanlar (X $) değişkenlere benzerlik gösterebilir ($ simgesi, Perl ), aslında geçerli kaydın alanlarına başvururlar. Özel bir durum, $0, tüm kaydı ifade eder. Aslında, komutlar "Yazdır" ve "0 $ yazdır"işlevsellik açısından aynıdır.

Yazdır komut ayrıca hesaplamaların ve / veya işlev çağrılarının sonuçlarını da görüntüleyebilir:

/ regex_pattern / {    # Kayıt (satır) yukarıdaki regex_pattern ile eşleştiğinde gerçekleştirilecek eylemler    Yazdır 3+2    Yazdır foobar(3)    Yazdır foobar(değişken)    Yazdır günah(3-2)}

Çıktı bir dosyaya gönderilebilir:

/ regex_pattern / {    # Kayıt (satır) yukarıdaki regex_pattern ile eşleştiğinde gerçekleştirilecek eylemler    Yazdır "ifade" > "dosya adı"}

veya aracılığıyla boru:

/ regex_pattern / {    # Kayıt (satır) yukarıdaki regex_pattern ile eşleştiğinde gerçekleştirilecek eylemler    Yazdır "ifade" | "komut"}

Yerleşik değişkenler

Awk'nin yerleşik değişkenleri, alan değişkenlerini içerir: $ 1, $ 2, $ 3 vb. ($ 0, tüm kaydı temsil eder). Bir kayıttaki tek tek metin alanlarındaki metni veya değerleri tutarlar.

Diğer değişkenler şunları içerir:

  • NR: 'R'ecords sayısı': tüm veri dosyalarından o ana kadar okunan girdi kayıtlarının sayısının geçerli sayısını tutar. Sıfırdan başlar, ancak hiçbir zaman otomatik olarak sıfırlanmaz.[14]
  • FNR: 'R'ecords'un' F'ile 'N' sayısı: o ana kadar okunan giriş kaydı sayısının mevcut sayısını tutar mevcut dosyada. Bu değişken, her yeni dosya başlatıldığında otomatik olarak sıfırlanır.[14]
  • NF: 'F' alanlarının 'N' sayısı: geçerli girdi kaydındaki alanların sayısını içerir. Girdi kaydındaki son alan $ NF, 2.-son alan $ (NF-1), 3.-son alan $ (NF-2) vb. İle belirlenebilir.
  • DOSYA ADI: Mevcut girdi dosyasının adını içerir.
  • FS: 'Alan' S'eparator: girdi kaydındaki alanları bölmek için kullanılan "alan ayırıcı" karakterini içerir. Varsayılan "beyaz boşluk", herhangi bir boşluk ve sekme karakterini içerir. Alan ayırıcıyı değiştirmek için FS başka bir karaktere yeniden atanabilir.
  • RS: 'R'ecord' S'eparator: mevcut "kayıt ayırıcı" karakterini saklar. Varsayılan olarak, bir girdi satırı girdi kaydı olduğundan, varsayılan kayıt ayırıcı karakteri "satırsonu" dur.
  • OFS: 'O'utput' F'ield 'S'eparator: Awk onları yazdırdığında alanları ayıran "çıktı alanı ayırıcısını" saklar. Varsayılan, bir "boşluk" karakteridir.
  • ORS: 'O'utput' R'ecord 'S'eparator: Awk onları yazdırdığında çıktı kayıtlarını ayıran "çıktı kaydı ayırıcısını" saklar. Varsayılan, "yeni satır" karakteridir.
  • OFMT: 'O'utput' F'or'M'a'T ': sayısal çıktı formatını saklar. Varsayılan biçim "% .6g" dir.

Değişkenler ve sözdizimi

Değişken adları, dil anahtar sözcükleri haricinde [A-Za-z0-9_] karakterlerinden herhangi birini kullanabilir. Operatörler + - * / sırasıyla toplama, çıkarma, çarpma ve bölmeyi temsil eder. Dize için birleştirme, iki değişkeni (veya dize sabitlerini) yan yana koyun. Dize sabitleri varsa arada boşluk kullanmak isteğe bağlıdır, ancak birbirine bitişik yerleştirilmiş iki değişken adı arada boşluk gerektirir. İkili alıntı sınırlamak dize sabitleri. İfadelerin noktalı virgülle bitmesi gerekmez. Son olarak, kullanılarak programlara yorum eklenebilir. # bir satırdaki ilk karakter olarak.

Kullanıcı tanımlı işlevler

Benzer bir formatta C, fonksiyon tanımları anahtar kelimeden oluşur işlevi, işlev adı, bağımsız değişken adları ve işlev gövdesi. İşte bir fonksiyon örneği.

işlevi add_three (numara) {    dönüş numara + 3}

Bu ifade aşağıdaki şekilde çağrılabilir:

(Desen){   Yazdır add_three(36)     # Çıkışlar '' '39' ''}

Fonksiyonların yerel kapsamda değişkenleri olabilir. Bunların adları bağımsız değişken listesinin sonuna eklenir, ancak işlev çağrılırken bunlara ilişkin değerler atlanmalıdır. Biraz eklemek gelenekseldir Beyaz boşluk Parametrelerin bittiği ve yerel değişkenlerin nerede başladığını belirtmek için yerel değişkenlerin önündeki bağımsız değişken listesinde.

Örnekler

Selam Dünya

İşte gelenek "Selam Dünya "AWK ile yazılmış program:

BAŞLA { Yazdır "Selam Dünya!" }

Açık olduğunu unutmayın çıkış burada ifadeye gerek yoktur; çünkü tek model BAŞLAhiçbir komut satırı argümanı işlenmez.

80 karakterden uzun satırlar yazdırın

80 karakterden uzun tüm satırları yazdırın. Varsayılan eylemin geçerli satırı yazdırmak olduğunu unutmayın.

uzunluk($0) > 80

Kelimeleri say

Girişteki kelimeleri sayın ve satır, kelime ve karakter sayısını yazdırın (örneğin wc ):

{    kelimeler += NF    karakter += uzunluk + 1 # Her kaydın (satırın) sonundaki yeni satır karakterini hesaba katmak için bir tane ekleyin}SON { Yazdır NR, kelimeler, karakter }

Programın ilk satırı için model olmadığından, varsayılan olarak her girdi satırı eşleşir, bu nedenle her satır için artış eylemleri yürütülür. Bunu not et kelimeler + = NF kısaltmasıdır kelimeler = kelimeler + NF.

Son sözü topla

{ s += $NF }SON { Yazdır s + 0 }

s sayısal değeri ile artırılır $ NF, AWK'nın alan ayırıcısı (varsayılan olarak beyaz boşluk) tarafından tanımlandığı şekliyle satırdaki son sözcüktür. NF geçerli satırdaki alanların sayısıdır, ör. 4. beri $4 dördüncü alanın değeridir, $ NF bu satırın kaç alana sahip olduğuna veya çevreleyen satırlardan daha fazla veya daha az alana sahip olup olmadığına bakılmaksızın satırdaki son alanın değeridir. $ aslında en yüksek olan tekli bir operatördür Operatör Önceliği. (Satırda alan yoksa, NF 0, $0 satırın tamamıdır, bu durumda olası beyaz boşluktan ayrı olarak boştur ve dolayısıyla 0 sayısal değerine sahiptir.)

Girişin sonunda SON desen eşleşir, yani s basılmıştır. Ancak, hiç giriş satırı olmayabileceğinden, bu durumda hiçbir zaman değer atanmamıştır. svarsayılan olarak boş bir dize olacaktır. Bir değişkene sıfır eklemek, onu bir dizeden sayısal bir değere zorlamak için kullanılan bir AWK deyimidir. (Boş bir dizeyi birleştirmek, bir sayıdan bir dizeye zorlamaktır, ör. s "". Unutmayın, dizeleri birleştirecek bir operatör yoktur, sadece bitişik olarak yerleştirilirler.) Zorlama ile program boş bir girişe "0" yazdırır, bu olmadan boş bir satır yazdırılır.

Bir dizi giriş satırını eşleştirin

NR % 4 == 1, NR % 4 == 3 { printf "% 6d% s", NR, $0 }

Eylem ifadesi her satırı numaralandırılmış olarak yazdırır. Printf işlevi standart C'yi taklit eder printf ve yukarıda açıklanan yazdırma komutuna benzer şekilde çalışır. Bununla birlikte, eşleşecek model şu şekilde çalışır: NR AWK'nın şimdiye kadar okuduğu kayıtların sayısı, tipik olarak giriş satırları, yani ilk giriş satırı için 1'den başlayan mevcut satır numarası. % ... modulo Şebeke. NR% 4 == 1 1., 5., 9., vb. giriş satırları için geçerlidir. Aynı şekilde, NR% 4 == 3 3., 7., 11. vb. giriş satırları için geçerlidir. Aralık örüntüsü 1. satırdaki ilk bölüm eşleşene kadar yanlıştır ve ardından 3. satırdaki ikinci bölüm eşleşene kadar doğru kalır. Daha sonra ilk bölüm 5. satırda tekrar eşleşene kadar yanlış kalır.

Böylece, program 1,2,3 satırlarını yazdırır, 4. satırı atlar ve ardından 5,6,7 vb. Her satır için satır numarasını (6 karakter genişliğindeki bir alana) ve ardından satır içeriğini yazdırır. Örneğin, bu girişte çalıştırıldığında:

RomaFlorenceMilanNaplesTurinVenedik

Önceki program şunları yazdırır:

     1 Roma 2 Floransa 3 Milano 5 Torino 6 Venedik

Bir dosyanın ilk veya son bölümünü yazdırma

Özel bir durum olarak, bir aralık modelinin ilk bölümü sürekli doğru olduğunda, ör. 1aralık, girişin başlangıcında başlayacaktır. Benzer şekilde, ikinci kısım sürekli yanlışsa, ör. 0aralık, girişin sonuna kadar devam edecektir. Örneğin,

 / ^ - buradan kes - $ /, 0

normal ifadeyle eşleşen ilk satırdaki girdi satırlarını yazdırır ^ - buradan kes - $yani, sonuna kadar sadece "--buradan kes" ifadesini içeren bir satır.

Kelime frekanslarını hesaplayın

Kelime frekansı kullanma ilişkilendirilebilir diziler:

BAŞLA {    FS="[^ a-zA-Z] +"}{    için (ben=1; ben<=NF; ben++)        kelimeler[daha düşük($ben)]++}SON {    için (ben içinde kelimeler)        Yazdır ben, kelimeler[ben]}

BEGIN bloğu, alan ayırıcısını alfabetik olmayan herhangi bir karakter dizisine ayarlar. Ayırıcıların normal ifadeler olabileceğini unutmayın. Bundan sonra, eylemi her giriş satırında gerçekleştiren çıplak bir eyleme geçiyoruz. Bu durumda, satırdaki her alan için, ilk önce küçük harfe dönüştürülen kelimenin görünme sayısına bir ekliyoruz. Son olarak, END bloğunda kelimeleri frekanslarıyla birlikte yazdırıyoruz. Çizgi

için (kelimelerde i)

dizi boyunca giden bir döngü oluşturur kelimeler, ayar ben her birine alt simge dizinin. Bu, böyle bir döngünün her birinin içinden geçtiği çoğu dilden farklıdır. değer dizide. Döngü böylece her kelimeyi ve ardından frekans sayımını yazdırır. daha düşük kitap yayınlandıktan sonra yapılan One True awk'a (aşağıya bakınız) bir eklemeydi.

Komut satırındaki kalıbı eşleştir

Bu program birkaç şekilde temsil edilebilir. İlki, Bourne kabuğu her şeyi yapan bir kabuk betiği yapmak için. Bu yöntemlerin en kısası:

#! / bin / shDesen="$1"vardiyaawk '/'"$ desen"'/ {FILENAME yazdır ":" $ 0} " "$@"

$ desen awk komutundaki tek tırnaklarla korunmaz, böylece kabuk değişkeni genişletir, ancak boşluk içeren desenleri düzgün bir şekilde işlemek için çift tırnak içine alınması gerekir. Her zamanki gibi tek başına bir model, tüm çizginin ($0) maçlar. DOSYA ADI mevcut dosya adını içerir. awk'nin açık birleştirme operatörü yoktur; iki bitişik dize onları birleştirir. $0 orijinal değişmemiş giriş satırına genişler.

Bunu yazmanın alternatif yolları var. Bu kabuk betiği ortama doğrudan awk içinden erişir:

#! / bin / shihracat Desen="$1"vardiyaawk '$ 0 ~ ENVIRON ["desen"] {FILENAME yazdır ":" $ 0}' "$@"

Bu, kullanan bir kabuk betiğidir. ÇEVRE, kitap yayınlandıktan sonra One True awk'ın daha yeni bir sürümünde tanıtılan bir dizi. Alt simge ÇEVRE bir ortam değişkeninin adıdır; sonucu değişkenin değeridir. Bu gibi getenv çeşitli standart kitaplıklarda çalışır ve POSIX. Kabuk betiği bir ortam değişkeni oluşturur Desen ilk bağımsız değişkeni içerir, sonra bu bağımsız değişkeni bırakır ve her dosyadaki kalıbı awk araması yapar.

~ sol işleneninin sağ işlenenle eşleşip eşleşmediğini kontrol eder; !~ tersidir. Normal ifadenin yalnızca bir dizge olduğunu ve değişkenler içinde saklanabileceğini unutmayın.

Bir sonraki yol, bir awk argümanının bir değişkene atama olarak görülebildiği komut satırı değişken atamasını kullanır:

#! / bin / shDesen="$1"vardiyaawk '$ 0 ~ kalıp {print FILENAME ":" $ 0}' "desen =$ desen" "$@"

Veya kullanabilirsiniz -v var = değer komut satırı seçeneği (ör. awk -v kalıp = "$ desen" ...).

Son olarak, bu, bir kabuk yardımı olmadan veya awk betiğinin uygulanması hakkında çok fazla bilgi sahibi olmaya gerek kalmadan (komut satırındaki değişken atamasının yaptığı gibi) tamamen awk olarak yazılmıştır, ancak biraz uzundur:

BAŞLA {    Desen = ARGV[1]    için (ben = 1; ben < ARGC; ben++) # ilk argümanı kaldır        ARGV[ben] = ARGV[ben + 1]    ARGC--    Eğer (ARGC == 1) { # kalıp tek şeydi, bu yüzden standart girdiden zorla okuma (kitap tarafından kullanılır)        ARGC = 2        ARGV[1] = "-"    }}$0 ~ Desen { Yazdır DOSYA ADI ":" $0 }

BAŞLA sadece ilk argümanı ayıklamak için değil, aynı zamanda onun bir dosya adı olarak yorumlanmasını önlemek için de gereklidir. BAŞLA blok biter. ARGC, argümanların sayısı her zaman ≥1 olarak garanti edilir, çünkü ARGV [0] betiği çalıştıran komutun adıdır, çoğunlukla dize "awk". Ayrıca şunu unutmayın ARGV [ARGC] boş dizedir "". # satırın sonuna kadar genişleyen bir yorum başlatır.

Not Eğer blok. awk, yalnızca komutu çalıştırmadan önce standart girdiden okuyup okuması gerekip gerekmediğini kontrol eder. Bu şu demek

awk 'prog'

yalnızca dosya adı olmadığı gerçeği yalnızca daha önce kontrol edildiği için çalışır prog koşuyor! Açıkça ayarlarsanız ARGC 1'e kadar argüman olmaması için, awk basitçe çıkacaktır çünkü daha fazla girdi dosyası kalmadığını hisseder. Bu nedenle, özel dosya adıyla standart girdiden okumayı açıkça söylemeniz gerekir. -.

Bağımsız AWK komut dosyaları

Unix benzeri işletim sistemlerinde bağımsız AWK komut dosyaları, shebang sözdizimi.

Örneğin, belirli bir dosyanın içeriğini yazdıran bir komut dosyası, adında bir dosya oluşturularak oluşturulabilir. print.awk aşağıdaki içeriğe sahip:

#! / usr / bin / awk -f{ Yazdır $0 }

Şunlarla çağrılabilir: ./print.awk

-f AWK'ya, takip eden argümanın, sed'de kullanılan bayrakla aynı olan AWK programının okunacağı dosya olduğunu söyler. Genellikle tek satırlılar için kullanıldıklarından, her iki program da varsayılan olarak ayrı bir dosya yerine komut satırı argümanı olarak verilen bir programı çalıştırır.

Sürümler ve uygulamalar

AWK ilk olarak 1977'de yazılmış ve Sürüm 7 Unix.

1985'te yazarları, en önemlisi kullanıcı tanımlı işlevler ekleyerek dili genişletmeye başladı. Dil kitapta anlatılmıştır AWK Programlama Dili, 1988'de yayınlandı ve uygulaması şu yayınların yayınlarında sunuldu: UNIX Sistem V. Uyumsuz eski sürümle karışıklığı önlemek için, bu sürüme bazen "yeni awk" veya nawk. Bu uygulama, bir özgür yazılım lisansı 1996'da Brian Kernighan tarafından sürdürülmektedir (aşağıdaki harici bağlantılara bakınız).[kaynak belirtilmeli ]

Unix'in eski sürümleri, örneğin UNIX / 32V dahil awkcc, AWK'yı C'ye dönüştüren Kernighan, awk'ı C ++ 'ya dönüştürmek için bir program yazdı; durumu bilinmemektedir.[15]

  • BWK awk, Ayrıca şöyle bilinir nawk, sürümü şu şekilde ifade eder: Brian Kernighan. Bu terimin, dili orijinal olarak tanımlayan kitapla bağlantılı olarak kullanılması ve Kernighan'ın AWK'nın orijinal yazarlarından biri olması nedeniyle "One True AWK" olarak adlandırılmıştır.[7] FreeBSD bu sürümü şu şekilde ifade eder: tek gerçek.[16] Bu sürüm aynı zamanda kitapta olmayan özelliklere de sahiptir. daha düşük ve ÇEVRE yukarıda açıklananlar; ayrıntılar için kaynak arşivindeki FIXES dosyasına bakın. Bu sürüm, örneğin, Android, FreeBSD, NetBSD, OpenBSD, Mac os işletim sistemi, ve Illumos. Brian Kernighan ve Arnold Robbins, aşağıdaki kaynak kod deposuna ana katkıda bulunanlardır. nawk: github.com/ onetrueawk/ awk.
  • gawk (GNU awk) başka bir özgür yazılım uygulamasıdır ve uygulamada ciddi ilerleme sağlayan tek uygulamadır. uluslararasılaşma ve yerelleştirme ve TCP / IP ağı. Orijinal uygulama ücretsiz olarak sunulmadan önce yazılmıştır. Kendi hata ayıklayıcısını içerir ve profil oluşturucu kullanıcının bir komut dosyasında ölçülen performans geliştirmeleri yapmasını sağlar. Ayrıca kullanıcının, paylaşılan kitaplıklarla işlevselliği genişletmesine olanak tanır. Biraz Linux dağıtımları Dahil etmek gawk varsayılan AWK uygulaması olarak.[kaynak belirtilmeli ]
    • gawk-csv. CSV Uzantısı gawk CSV formatlı giriş ve çıkış verilerinin işlenmesi için kolaylıklar sağlar.[17]
  • mawk Mike Brennan tarafından yapılan çok hızlı bir AWK uygulamasıdır. bayt kodu çevirmen.
  • libmawk mawk çatalı, uygulamaların awk yorumlayıcılarının birden çok paralel örneğini yerleştirmesine izin verir.
  • Awka (kimin ön ucu, mawk programı) AWK betiklerinin C koduna başka bir çevirmenidir. Statik olarak yazarın libawka.a dosyası dahil derlendiğinde, ortaya çıkan çalıştırılabilir dosyalar önemli ölçüde hızlanır ve yazarın testlerine göre AWK'nın diğer sürümleriyle çok iyi karşılaştırılır. Perl veya Tcl. Küçük komut dosyaları 160–170 kB'lik programlara dönüşecektir.
  • tawk (Thompson AWK) bir AWK'dır derleyici için Solaris, DOS, OS / 2, ve pencereler, daha önce Thompson Automation Software tarafından satıldı (faaliyetlerini durdurdu).[18]
  • Çene AWK'yi uygulamaya yönelik bir projedir Java, SourceForge'da barındırılıyor.[19] AWK komut dosyalarındaki (yani, Java iş parçacıkları, soketler, koleksiyonlar vb.) Java özelliklerine erişim sağlamak için dile uzantılar eklenir.
  • xgawk çatal mı gawk[20] bu genişler gawk dinamik olarak yüklenebilir kitaplıklar ile. XMLgawk uzantısı resmi GNU Awk 4.1.0 sürümüne entegre edildi.
  • QSEAWK gömülü bir AWK yorumlayıcı uygulamasıdır. uygulama programlama Arayüzü (API) için C ve C ++.[21]
  • libfawk C ile yazılmış çok küçük, yalnızca işlev, evresel, gömülebilir bir yorumlayıcıdır
  • BusyBox Dmitry Zakharov tarafından yazılmış bir AWK uygulamasını içerir. Bu, gömülü sistemler için uygun olan çok küçük bir uygulamadır.

Kitabın

  • Aho, Alfred V.; Kernighan, Brian W.; Weinberger, Peter J. (1988-01-01). AWK Programlama Dili. New York, NY: Addison-Wesley. ISBN  0-201-07981-X. Alındı 2017-01-22.
  • Robbins, Arnold (2001-05-15). Etkili awk Programlama (3. baskı). Sebastopol, CA: O'Reilly Media. ISBN  0-596-00070-7. Alındı 2009-04-16.
  • Dougherty, Dale; Robbins, Arnold (1997-03-01). sed & awk (2. baskı). Sebastopol, CA: O'Reilly Media. ISBN  1-56592-225-5. Alındı 2009-04-16.
  • Robbins, Arnold (2000). Etkili Awk Programlama: Gnu Awk İçin Bir Kullanıcı Kılavuzu (1.0.3 ed.). Bloomington, IN: iUniverse. ISBN  0-595-10034-1. Arşivlendi 12 Nisan 2009'daki orjinalinden. Alındı 2009-04-16.

Ayrıca bakınız

Referanslar

  1. ^ Stutz, Michael (19 Eylül 2006). "GAWK ile başlayın: AWK dilinin temelleri" (PDF). developerWorks. IBM. Alındı 2015-01-29. [AWK] genellikle veriye dayalı bir dil olarak adlandırılır - program ifadeleri, bir dizi program adımı yerine eşleştirilecek ve işlenecek giriş verilerini tanımlar
  2. ^ Andreas J. Pilavakis (1989). UNIX Çalıştayı. Macmillan Uluslararası Yüksek Öğrenim. s. 196.
  3. ^ Arnold Robbins (2015). Etkili Awk Programlama: Evrensel Metin İşleme ve Desen Eşleştirme (4. baskı). O'Reilly Media. s. 560.
  4. ^ a b James W. Livingston (2 Mayıs 1988). "Büyük awk Programı Kuşbeyin Yoktur". Dijital İnceleme. s. 91.
  5. ^ Raymond, Eric S. "Mini Dilleri Uygulama". Unix Programlama Sanatı. Örnek Olay: awk. Arşivlenen orijinal 30 Temmuz 2008. Alındı 11 Mayıs 2010. Awk eylem dili Turing-complete'tir ve dosyaları okuyup yazabilir.
  6. ^ Aho, Alfred V.; Kernighan, Brian W.; Weinberger, Peter J. (1 Eylül 1978). Awk - Bir Kalıp Tarama ve İşleme Dili (İkinci Baskı) (Teknik rapor). Unix Yedinci Baskı Kılavuzu, Cilt 2. Bell Telephone Laboratories, Inc.
  7. ^ a b Aho, Alfred V .; Kernighan, Brian W .; Weinberger, Peter J. (1988). AWK Programlama Dili. Addison-Wesley Yayıncılık Şirketi. ISBN  9780201079814. Alındı 16 Mayıs 2015.
  8. ^ "UNIX Özel: Profs Kernighan ve Brailsford". Bilgisayar hayranı. 30 Eylül 2015.
  9. ^ "Tek UNIX Spesifikasyonu, Sürüm 3, Yardımcı Programlar Arayüz Tablosu". Arşivlenen orijinal 2018-01-05 tarihinde. Alındı 2005-12-18.
  10. ^ "Bölüm 15. Komutlar ve Yardımcı Programlar". Linux Standard Base Core Specification 4.0 (Teknik rapor). Linux Vakfı. 2008.
  11. ^ a b c Robbins, Arnold (Mart 2014). "GNU Projesi ve Ben: GNU AWK ile 27 Yıl" (PDF). skeeve.com. Alındı 4 Ekim 2014.
  12. ^ Dougherty, Dale; Robbins Arnold (1997). sed & awk (2. baskı). Sebastopol, CA: O'Reilly. s. 221. ISBN  1-565-92225-5.
  13. ^ Hamilton, Naomi (30 Mayıs 2008). "Programlama Dillerinin A-Z'si: AWK". Bilgisayar Dünyası. Alındı 2008-12-12.
  14. ^ a b https://www.gnu.org/software/gawk/manual/html_node/Records.html#index-FNR-variable
  15. ^ Kernighan, Brian W. (24-25 Nisan 1991). AWK - C ++ Çevirmeni (PDF). Usenix C ++ Konferansı. Washington DC. s. 217–228.
  16. ^ "FreeBSD'nin BWK awk'yi FreeBSD'nin çekirdeğine aktarmak için iş günlüğü". 16 Mayıs 2005. Arşivlendi 8 Eylül 2013 tarihinde orjinalinden. Alındı 20 Eylül 2006.
  17. ^ gawk-csv dokümantasyon http://gawkextlib.sourceforge.net/csv/gawk-csv.html
  18. ^ James K. Lawless (1 Mayıs 1997). "TAWK Derleyicisini İnceleme". Dr. Dobb's Journal.
  19. ^ Çene SourceForge'da
  20. ^ xgawk Ana Sayfa
  21. ^ GitHub'da QSEAWK

daha fazla okuma

Dış bağlantılar