AWK - AWK

AWK
paradigma Komut dosyası oluşturma , prosedürel , veri odaklı
Tarafından tasarlandı Alfred Aho , Peter Weinberger ve Brian Kernighan
İlk ortaya çıktı 1977 ; 44 yıl önce ( 1977 )
kararlı sürüm
IEEE Std 1003.1-2008 (POSIX) / 1985
Yazma disiplini Yok; dizileri, tam sayıları ve kayan noktalı sayıları işleyebilir; düzenli ifadeler
işletim sistemi Çapraz platform
Başlıca 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
Etkilenen
Tcl , AMPL , Perl , Korn Shell ( ksh93 , dtksh , tksh ), Lua

AWK ( awk ), metin işleme için tasarlanmış alana özgü bir dildir ve genellikle bir veri çıkarma ve raporlama aracı olarak kullanılır . Gibi sed ve grep , bu bir olan filtre ve en standart bir özelliktir Unix-benzeri işletim sistemleri .

AWK dil bir olan veri tabanlı kodlama dili eylem kümesi oluşan karşı alınması gereken akışları ya bir parçası olarak dosyalar üzerinde doğrudan işletilen veya kullanılmış - metinsel verilerin boru hattının - Böyle biçimlendirilmiş üreten olarak, ayıklanması veya metin dönüştürme amacıyla raporlar. Dil, veri türü dizesini , ilişkisel dizileri (yani, anahtar dizeleri tarafından indekslenen diziler) ve düzenli ifadeleri kapsamlı bir şekilde kullanır . AWK sınırlı bir uygulama alanına sahip olsa ve özellikle tek satırlı programları desteklemek için tasarlanmış olsa da , dil Turing-complete'dir ve AWK'nın ilk Bell Labs kullanıcıları bile genellikle iyi yapılandırılmış büyük AWK programları yazdı.

AWK, 1970'lerde Bell Laboratuarlarında oluşturuldu ve adı yazarlarının soyadından türetildi : Alfred Aho , Peter Weinberger ve Brian Kernighan . Kısaltma, AWK Programlama Dili'nin kapağındaki kuş auk ile aynı şekilde telaffuz edilir . Olarak tüm küçük harflerle yazıldığında, AWK programlama dilinde yazılmış komut dosyalarını çalıştıran Unix veya Plan 9 programını ifade eder . awk

Tarih

AWK ilk olarak 1977'de Alfred Aho ( egrep'in yazarı ), Peter J. Weinberger (küçük ilişkisel veritabanları üzerinde çalışan) ve Brian Kernighan tarafından geliştirildi ; adını kendi baş harflerinden alır. Kernighan'a göre, AWK'nın hedeflerinden biri hem sayıları hem de dizileri kolayca değiştirebilecek bir araca sahip olmaktı. AWK ayrıca Marc Rochkind'in girdi verilerindeki kalıpları aramak için kullanılan programlama dilinden ilham aldı ve yacc kullanılarak uygulandı .

Sürüm 7 Unix'te görünen ilk araçlardan biri olarak AWK , standart bir Unix ortamında kullanılabilen tek komut dosyası dili olan Bourne kabuğunun yanı sıra bir Unix ardışık düzenine hesaplama özellikleri ekledi . Tek UNIX Spesifikasyonunun zorunlu yardımcı programlarından biridir ve Linux Standard Base spesifikasyonu tarafından gereklidir .

AWK, 1985-88'de önemli ölçüde revize edildi ve genişletildi, bu da Paul Rubin , Jay Fenlason ve Richard Stallman tarafından yazılan ve 1988'de piyasaya sürülen GNU AWK uygulamasıyla sonuçlandı. Linux paketleri. GNU AWK tarafından sadece muhafaza edilmiştir Arnold Robbins 1994 yılından bu yana Brian Kernighan 'ın nawk (Yeni AWK) kaynak ilk 1993 unpublicized ve kamuya 1990'ların sonlarından beri piyasaya çıktı; birçok BSD sistemi bunu GPL lisansından kaçınmak için kullanır.

AWK'dan önce sed (1974) geldi. Her ikisi de metin işleme için tasarlanmıştır. Hat odaklı, veri odaklı paradigmayı paylaşırlar ve örtük ana döngü ve mevcut hat değişkenleri nedeniyle özellikle tek satırlı programlar yazmaya uygundurlar . Erken AWK programlarının gücü ve özlülüğü – özellikle tek satırları kolaylaştıran örtük değişkenlerden kaynaklanan güçlü düzenli ifade işleme ve kısalık – o sırada AWK'nın sınırlamaları ile birlikte Perl dili (1987) için önemli ilham kaynaklarıydı . 1990'larda Perl, Unix metin işleme dillerinin nişinde AWK ile rekabet ederek çok popüler oldu.

AWK programlarının yapısı

POSIX awk.pdf

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

—  Alfred V. Aho

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

condition { action }
condition { action }
...

burada koşul tipik olarak bir ifadedir ve eylem bir dizi komuttur. Giriş, kayıtlara bölünür, burada varsayılan olarak kayıtlar yeni satır karakterleriyle ayrılır, böylece giriş satırlara bölünür. Program, her kaydı sırayla koşulların her birine karşı test eder ve doğru olan her ifade için eylemi yürütür . Ya koşul ya da eylem atlanabilir. 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.

Gibi basit bir AWK ifadesi, ilave olarak foo == 1veya /^foo/, durum olabilir BEGINya ENDönce ya tüm kayıtlar sonrasında yürütülecek eylemi neden okuma veya olmuştur pattern1, pattern2 maçları bu rekor ile başlayan kayıtların aralığını maçları pattern1 yukarı ve maçları söz konusu kaydı içeren pattern2 tekrar karşı maç için denemeden önce ÖRNEK1 gelecek hatlarında.

AWK ifadeleri, normal aritmetik ve mantıksal işleçlere ek olarak, bir dizgeyle normal bir ifadeyi~ eşleştiren yaklaşık işareti operatörünü içerir . Kullanışlı sözdizimsel şeker olarak , /regexp/ tilde operatörünü kullanmadan geçerli kayıtla eşleşmeler; Bu sözdizimi türemiştir sed sırayla dan miras, ed editörü, nerede arama yapmak için kullanılır. Normal ifadeler için sınırlayıcı olarak eğik çizgi kullanma sözdizimi daha sonra Perl ve ECMAScript tarafından benimsendi ve şimdi yaygın. Tilde operatörü Perl tarafından da benimsenmiştir. /

Komutlar

AWK komutları, yukarıdaki örneklerde eylem yerine geçen ifadelerdir . AWK komutları, işlev çağrılarını, değişken atamalarını, hesaplamaları veya bunların herhangi bir kombinasyonunu içerebilir. AWK, birçok işlev için yerleşik destek içerir; çok daha fazlası AWK'nın çeşitli tatları tarafından sağlanmaktadır. Ayrıca, bazı tatlar , daha fazla işlev de sağlayabilen dinamik olarak bağlantılı kitaplıkların dahil edilmesini destekler .

baskı komutu

Baskı komutu çıktısı metin için kullanılır. Çıktı metni her zaman, varsayılan değeri yeni bir satır olan çıktı kayıt ayırıcısı (ORS) adı verilen önceden tanımlanmış bir dize ile sonlandırılır. Bu komutun en basit şekli şudur:

print
Bu, geçerli kaydın içeriğini görüntüler. AWK'da kayıtlar alanlara ayrılır ve bunlar ayrı olarak görüntülenebilir:
print $1
Geçerli kaydın ilk alanını görüntüler
print $1, $3
Geçerli kaydın birinci ve üçüncü alanlarını, varsayılan değeri tek bir boşluk karakteri olan çıkış alanı ayırıcısı (OFS) olarak adlandırılan önceden tanımlanmış bir dizeyle ayırarak görüntüler.

Bu alanlar ( $X ) değişkenlere benzerlik gösterebilse de ($ sembolü Perl'deki değişkenleri belirtir ), bunlar aslında mevcut kaydın alanlarını ifade eder. Özel bir durum, $0 , tüm kaydı ifade eder. Aslında, " print" ve " print $0" komutları işlevsellik açısından aynıdır.

Baskı komutu ayrıca hesaplamalar ve / veya işlev çağrılarının sonuçlarını görüntüleyebilirsiniz:

/regex_pattern/ {
    # Actions to perform in the event the record (line) matches the above regex_pattern
    print 3+2
    print foobar(3)
    print foobar(variable)
    print sin(3-2)
}

Çıktı bir dosyaya gönderilebilir:

/regex_pattern/ {
    # Actions to perform in the event the record (line) matches the above regex_pattern
    print "expression" > "file name"
}

veya bir boru aracılığıyla :

/regex_pattern/ {
    # Actions to perform in the event the record (line) matches the above regex_pattern
    print "expression" | "command"
}

Yerleşik değişkenler

Awk'nin yerleşik değişkenleri şu alan değişkenlerini içerir: $1, $2, $3 ve benzeri ($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: Kayıt Sayısı. Tüm veri dosyalarından o ana kadar okunan giriş kayıtlarının mevcut sayısını tutar. Sıfırdan başlar, ancak hiçbir zaman otomatik olarak sıfıra sıfırlanmaz.
  • FNR: Dosya Kayıt Sayısı. Geçerli dosyada o ana kadar okunan giriş kayıtlarının sayısının geçerli sayısını tutar . Bu değişken, her yeni dosya başlatıldığında otomatik olarak sıfırlanır.
  • NF: Alan Sayısı. Geçerli giriş kaydındaki alan sayısını içerir. Giriş kaydındaki son alan $NF ile, sondan 2. alan $(NF-1), 3.-sondan alan $(NF-2) vb. ile belirlenebilir.
  • FILENAME: Geçerli girdi dosyasının adını içerir.
  • FS: Alan Ayırıcı. Giriş 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 karakterlerini içerir. Alan ayırıcısını değiştirmek için FS başka bir karaktere yeniden atanabilir.
  • RS: Kayıt Ayırıcı. Mevcut "kayıt ayırıcı" karakterini saklar. Varsayılan olarak bir giriş satırı giriş kaydı olduğundan, varsayılan kayıt ayırıcı karakter bir "yeni satır"dır.
  • OFS: Çıkış Alanı Ayırıcı. Awk bunları yazdırdığında alanları ayıran "çıkış alanı ayırıcısını" depolar. Varsayılan, bir "boşluk" karakteridir.
  • ORS: Çıkış Kayıt Ayırıcı. Awk bunları yazdırdığında çıktı kayıtlarını ayıran "çıktı kaydı ayırıcısını" saklar. Varsayılan "yeni satır" karakteridir.
  • OFMT: Çıkış formatı. Sayısal çıktının biçimini saklar. Varsayılan biçim "%.6g"'dir.

Değişkenler ve sözdizimi

Değişken adları, dil anahtar sözcükleri dışında [A-Za-z0-9_] karakterlerinden herhangi birini kullanabilir. + - * / operatörleri sırasıyla toplama, çıkarma, çarpma ve bölmeyi temsil eder. Dize birleştirme için , iki değişkeni (veya dize sabitlerini) yan yana yerleştirmeniz yeterlidir. Dize sabitleri söz konusuysa, aralarında boşluk kullanmak isteğe bağlıdır, ancak birbirine bitişik iki değişken adı arasında boşluk gerekir. Çift tırnak, dize sabitlerini sınırlar . İfadelerin noktalı virgülle bitmesi gerekmez. Son olarak, bir satırda ilk karakter olarak # kullanılarak programlara yorum eklenebilir .

Kullanıcı tanımlı fonksiyonlar

C'ye benzer bir biçimde , işlev tanımları anahtar sözcük function, işlev adı, bağımsız değişken adları ve işlev gövdesinden oluşur. İşte bir fonksiyon örneği.

function add_three (number) {
    return number + 3
}

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

(pattern)
{
   print add_three(36)     # Outputs '''39'''
}

İşlevler, yerel kapsamda olan değişkenlere sahip 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. Parametrelerin nerede bittiğini ve yerel değişkenlerin nerede başladığını belirtmek için argüman listesine yerel değişkenlerden önce bir miktar boşluk eklemek gelenekseldir .

Örnekler

Selam Dünya

İşte AWK'da yazılmış geleneksel " Merhaba dünya " programı:

BEGIN { print "Hello, world!" }

Burada açık bir exitifadeye gerek olmadığına dikkat edin; tek kalıp olduğundan BEGIN, hiçbir komut satırı bağımsız değişkeni işlenmez.

80 karakterden uzun satırları yazdır

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

length($0) > 80

kelimeleri say

Girişteki kelimeleri sayın ve satır, kelime ve karakter sayısını yazdırın ( wc gibi ):

{
    words += NF
    chars += length + 1 # add one to account for the newline character at the end of each record (line)
}
END { print NR, words, chars }

Programın ilk satırı için bir kalıp olmadığından, her girdi satırı varsayılan olarak eşleşir, bu nedenle her satır için artış eylemleri yürütülür. Bunun words += NFkısaltması olduğuna dikkat edin words = words + NF.

Son sözü topla

{ s += $NF }
END { print s + 0 }

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

Girişin sonunda END deseni eşleşir, bu nedenle s yazdırılır. Bununla birlikte, hiç girdi satırı olmadığı için, bu durumda s öğesine hiçbir değer atanmamıştır , varsayılan olarak boş bir dize olacaktır. Bir değişkene sıfır eklemek, onu bir dizgeden sayısal bir değere zorlamak için kullanılan bir AWK deyimidir. (Boş bir dizgeyi birleştirmek, bir sayıdan bir dizgeye zorlamak içindir, örneğin s "" . Not, dizgeleri birleştirmek için bir operatör yoktur, sadece bitişik yerleştirilirler.) Zorlama ile program boş bir girdiye "0" yazdırır. , onsuz 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\n", NR, $0 }

Eylem ifadesi, numaralandırılmış her satırı yazdırır. printf işlevi, standart C printf'i taklit eder ve yukarıda açıklanan print komutuna benzer şekilde çalışır. Bununla birlikte, eşleştirilecek model şu şekilde çalışır: NR , kayıtların sayısıdır, tipik olarak giriş satırlarıdır, AWK'nın şimdiye kadar okuduğu, yani ilk giriş satırı için 1'den başlayan mevcut satır numarasıdır. % Olan modülo operatörü. NR % 4 == 1 , girişin 1., 5., 9. vb. satırları için doğrudur. Benzer şekilde, NR % 4 == 3 , girişin 3., 7., 11. vb. satırları için doğrudur. Aralık modeli, ilk parça 1. satırda eşleşene kadar yanlıştır ve daha sonra ikinci parçanın 3. satırda ne zaman eşleştiği de dahil olmak üzere doğru kalır. Ardından, ilk parça 5. satırda tekrar eşleşene kadar yanlış kalır.

Böylece program satır 1,2,3 yazdırır, satır 4'ü atlar ve ardından 5,6,7 vb. Her satır için satır numarasını (6 karakter genişliğinde bir alana) ve ardından satır içeriğini yazdırır. Örneğin, bu girdide yürütüldüğünde:

Rome
Florence
Milan
Naples
Turin
Venice

Önceki program yazdırır:

     1 Rome
     2 Florence
     3 Milan
     5 Turin
     6 Venice

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

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

 /^--cut here--$/, 0

^--cut here--$ normal ifadesiyle eşleşen ilk satırdan , yani yalnızca "--cut here--" ifadesini içeren bir satırdan sonuna kadar girdi satırlarını yazdırır .

Kelime frekanslarını hesapla

İlişkisel dizileri kullanarak kelime sıklığı :

BEGIN {
    FS="[^a-zA-Z]+"
}
{
    for (i=1; i<=NF; i++)
        words[tolower($i)]++
}
END {
    for (i in words)
        print i, words[i]
}

BEGIN bloğu, alan ayırıcıyı 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, önce küçük harfe dönüştürülen kelimenin görünme sayısına bir tane ekleriz. Son olarak END bloğunda kelimeleri frekanslarıyla yazdırıyoruz. Çizgi

for (i in words)

i'yi dizinin her bir alt indisine ayarlayarak, sözcükler dizisi içinden geçen bir döngü oluşturur . Bu, dizideki her değerden böyle bir döngünün geçtiği çoğu dilden farklıdır . Döngü böylece her bir kelimeyi ve ardından frekans sayımını yazdırır. kitap yayınlandıktan sonra yapılan Tek Gerçek awk'a (aşağıya bakınız) bir ektir. tolower

Komut satırından eşleştirme kalıbı

Bu program birkaç şekilde temsil edilebilir. İlki , her şeyi yapan bir kabuk betiği oluşturmak için Bourne kabuğunu kullanır . Bu yöntemlerden en kısa olanıdır:

#!/bin/sh

pattern="$1"
shift
awk '/'"$pattern"'/ { print FILENAME ":" $0 }' "$@"

$patternAwk komut kabuk değişkeni genişletmek böylece tek tırnak ile korunan ancak düzgün boşluk içeren desenleri işlemek için çift tırnak koymak gerekmektedir değildir. Her zamanki gibi tek başına bir kalıp, tüm satırın ( $0) eşleşip eşleşmediğini kontrol eder. FILENAMEgeçerli dosya adını içerir. awk'nin açık bir birleştirme operatörü yoktur; iki bitişik dize onları birleştirir. $0orijinal 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/sh

export pattern="$1"
shift
awk '$0 ~ ENVIRON["pattern"] { print FILENAME ":" $0 }' "$@"

Bu, ENVIRONkitap yayınlandıktan sonra One True awk'nin daha yeni bir sürümünde tanıtılan bir diziyi kullanan bir kabuk betiğidir . indisi, ENVIRONbir ortam değişkeninin adıdır; sonucu, değişkenin değeridir. Bu gibi getenv çeşitli standart kütüphaneler ve işlev POSIX . Kabuk betiği pattern, ilk argümanı içeren bir ortam değişkeni yapar , ardından bu argümanı bırakır ve her dosyada desen için awk araması yapar.

~sol işleneninin sağ işleneniyle eşleşip eşleşmediğini kontrol eder; !~onun tersidir. Normal ifadenin yalnızca bir dize olduğunu ve değişkenlerde saklanabileceğini unutmayın.

Sonraki yol, 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/sh

pattern="$1"
shift
awk '$0 ~ pattern { print FILENAME ":" $0 }' "pattern=$pattern" "$@"

Veya -v var=value komut satırı seçeneğini kullanabilirsiniz (örneğin awk -v pattern="$pattern" ... ).

Son olarak, bu, bir kabuğun 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) saf awk ile yazılmıştır, ancak biraz uzundur:

BEGIN {
    pattern = ARGV[1]
    for (i = 1; i < ARGC; i++) # remove first argument
        ARGV[i] = ARGV[i + 1]
    ARGC--
    if (ARGC == 1) { # the pattern was the only thing, so force read from standard input (used by book)
        ARGC = 2
        ARGV[1] = "-"
    }
}
$0 ~ pattern { print FILENAME ":" $0 }

BEGINİlk bağımsız değişken çıkarmak için değil, aynı zamanda daha sonra bir dosya adı olarak yorumlanmasının önlenmesi için sadece gerekli olan BEGINblok uçlarına. ARGC, argüman sayısının her zaman ≥1 olması garanti edilir, tıpkı ARGV[0]betiği çalıştıran komutun adı gibi , çoğunlukla da dizedir "awk". Ayrıca ARGV[ARGC]bunun boş dize olduğuna dikkat edin , "". #satırın sonuna kadar genişleyen bir yorum başlatır.

ifBloğu not edin . awk yalnızca komutu çalıştırmadan önce standart girdiden okuması gerekip gerekmediğini kontrol eder. Bunun anlamı şudur ki

awk 'prog'

sadece çalışır, çünkü dosya adı olmadığı gerçeği progçalıştırılmadan önce kontrol edilir ! ARGCArgüman olmaması için açıkça 1'e ayarlarsanız , awk daha fazla girdi dosyası olmadığını hissettiğinden çıkar. Bu nedenle, özel dosya adı ile standart girdiden okumak için açıkça söylemeniz gerekir -.

Bağımsız AWK komut dosyaları

Unix benzeri işletim sistemlerinde, Shebang sözdizimi kullanılarak bağımsız AWK komut dosyaları oluşturulabilir .

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

#!/usr/bin/awk -f
{ print $0 }

Şununla çağrılabilir: ./print.awk <filename>

-fŞu argümanı sed kullanılan aynı bayrak gelen AWK programı, okuma dosyası olduğunu AWK söyler. Genellikle tek satırlar için kullanıldıklarından, bu programların her ikisi de varsayılan olarak ayrı bir dosya yerine komut satırı argümanı olarak verilen bir programı yürütür.

Sürümler ve uygulamalar

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

1985'te yazarları, en önemlisi kullanıcı tanımlı işlevler ekleyerek dili genişletmeye başladı. Dil , 1988'de yayınlanan AWK Programlama Dili kitabında açıklanmıştır ve uygulanması UNIX System V sürümlerinde kullanıma sunulmuştur . Uyumsuz eski sürümle karıştırılmaması için bu sürüme bazen "yeni awk" veya nawk adı verildi . Bu uygulama 1996 yılında ücretsiz yazılım lisansı altında yayınlandı ve halen Brian Kernighan tarafından sürdürülüyor (aşağıdaki harici bağlantılara bakın).

AWK'yı C'ye dönüştüren UNIX/32V gibi eski Unix sürümleri dahil awkccedildi. Kernighan, awk'yi C++'a dönüştürmek için bir program yazdı; durumu bilinmiyor.

  • Nawk olarak da bilinen BWK awk , Brian Kernighan'ın sürümüne atıfta bulunur . Terimin, dili orijinal olarak tanımlayan kitapla birlikte kullanılması ve Kernighan'ın AWK'nın orijinal yazarlarından biri olması nedeniyle "Tek Gerçek AWK" olarak adlandırılmıştır. FreeBSD, bu sürüme one-true-awk olarak atıfta bulunur . Ayrıca sahip Bu sürüm gibi kitapta değil özellikleri tolowerve ENVIRONyukarıda açıklanmıştır; ayrıntılar için kaynak arşivdeki FIXES dosyasına bakın. Bu sürüm örneğin Android , FreeBSD , NetBSD , OpenBSD , macOS ve illumos tarafından kullanılır . Brian Kernighan ve Arnold Robbins, nawk için bir kaynak deposuna ana katkıda bulunanlardır : github .com /onetrueawk /awk .
  • gawk ( GNU awk) başka bir özgür yazılım uygulamasıdır ve uluslararasılaştırma, yerelleştirme ve TCP/IP ağ oluşturma konusunda ciddi ilerleme kaydeden tek uygulamadır . Orijinal uygulama ücretsiz olarak kullanıma sunulmadan önce yazılmıştır. Kendi hata ayıklayıcısını içerir ve profil oluşturucusu , 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şletmesini sağlar. Bazı Linux dağıtımları , varsayılan AWK uygulamaları olarak gawk'ı içerir .
    • gawk-csv . CSV uzantısı gawk'da giriş ve çıkış CSV biçimindeki verileri işlemek için olanaklar sağlar.
  • mawk , Mike Brennan tarafından bir bayt kodu yorumlayıcısına dayanan çok hızlı bir AWK uygulamasıdır .
  • libmawk , uygulamaların birden çok paralel awk yorumlayıcı örneğini gömmesine izin veren bir mawk çatalıdır.
  • awka (ön ucu mawk programının üzerine yazılır ), AWK komut dosyalarının C koduna başka bir çevirmenidir. Statik olarak derlendiğinde, yazarın libawka.a'sı da dahil olmak üzere, ortaya çıkan yürütülebilir dosyalar önemli ölçüde hızlandırılır ve yazarın testlerine göre, diğer AWK, Perl veya Tcl sürümleriyle çok iyi karşılaştırılır . Küçük betikler 160–170 kB'lik programlara dönüşecek.
  • tawk (Thompson AWK) , daha önce Thompson Automation Software tarafından satılan (faaliyetlerini durduran) Solaris , DOS , OS/2 ve Windows için bir AWK derleyicisidir .
  • Jawk , SourceForge'da barındırılan Java'da AWK uygulamak için bir projedir . AWK komut dosyalarındaki Java özelliklerine erişim sağlamak için dile uzantılar eklenir (yani, Java iş parçacıkları, yuvalar, koleksiyonlar, vb.).
  • xgawk bir çatal gawk'da uzanır gawk dinamik olarak yüklenebilen kütüphaneler ile. XMLgawk uzantısı, resmi GNU Awk 4.1.0 sürümüne entegre edilmiştir.
  • QSEAWK , C ve C++ için gömme uygulama programlama arabirimi (API) sağlayan QSE kitaplığında bulunan yerleşik bir AWK yorumlayıcı uygulamasıdır .
  • libfawk , C ile yazılmış çok küçük, yalnızca işlevli, yeniden girişli, 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 çok küçük bir uygulamadır.
  • Michael Parker tarafından CLAWK , Common Lisp'te aynı yazarın düzenli ifade kitaplığına dayalı bir AWK uygulaması sağlar .

Kitabın

  • Ah, Alfred V. ; Kernighan, Brian W. ; Weinberger, Peter J. (1988-01-01). AWK Programlama Dili . New York, NY: Addison-Wesley . ISBN'si 0-201-07981-X. 2017-01-22 alındı .
  • Robbins, Arnold (2001-05-15). Etkili awk Programlama (3. baskı). Sivastopol, CA: O'Reilly Medya . ISBN'si 0-596-00070-7. 2009-04-16 alındı .
  • Dougherty, Dale ; Robbins, Arnold (1997-03-01). sed & awk (2. baskı). Sivastopol, CA: O'Reilly Medya. ISBN'si 1-56592-225-5. 2009-04-16 alındı .
  • Robbins, Arnold (2000). Etkili Awk Programlama: Gnu Awk için Kullanıcı Kılavuzu (1.0.3 ed.). Bloomington, IN: iEvren . ISBN'si 0-595-10034-1. 12 Nisan 2009 tarihinde kaynağından arşivlendi . 2009-04-16 alındı .

Ayrıca bakınız

Referanslar

daha fazla okuma

Dış bağlantılar