Sinopsis (Synopsis)
awk [ -F fs ] [ -v var=değer ] [ 'prog' | -f progdosyası ] [ dosya ... ]
Açıklama (Description)
Awk, literal olarak prog içinde veya -f progdosyası olarak belirtilen bir veya daha fazla dosyada belirtilen bir kalıp kümesiyle eşleşen satırlar için her girdi dosyasını tarar. Her kalıpla ilişkili olarak, bir dosyanın satırı kalıpla eşleştiğinde gerçekleştirilecek bir eylem bulunabilir. Her satır, her kalıp-eylem ifadesinin kalıp kısmıyla eşleştirilir; eşleşen her kalıp için ilişkili eylem gerçekleştirilir. dosya adı olarak “-” standart girişi temsil eder. var=değer biçimindeki herhangi bir dosya, bir dosya adı olarak değil, bir atama olarak kabul edilir ve bir dosya adı olsaydı açılacağı anda yürütülür. -v seçeneğini takip eden var=değer, prog yürütülmeden önce yapılacak bir atamadır; herhangi bir sayıda -v seçeneği bulunabilir. -F fs seçeneği, girdi alanı ayırıcısını fs düzenli ifadesi olarak tanımlar.
Bir girdi satırı normalde boşluklarla veya FS düzenli ifadesiyle ayrılmış alanlardan oluşur. Alanlar $1, $2, ... ile gösterilirken, $0 tüm satırı temsil eder. FS boşsa, girdi satırı karakter başına bir alan olacak şekilde bölünür.
Bir kalıp-eylem ifadesi şu biçime sahiptir:
kalıp { eylem }
Eksik bir { eylem } satırı yazdırmak anlamına gelir; eksik bir kalıp ise her zaman eşleşir. Kalıp-eylem ifadeleri satır sonları veya noktalı virgüllerle ayrılır.
Bir eylem, ifadelerin bir dizisidir. Bir ifade aşağıdakilerden biri olabilir:
if( expression ) statement [ else statement ] while( expression ) statement for( expression ; expression ; expression ) statement for( var in array ) statement do statement while( expression ) break continue { [ statement ... ] } expression # yaygın olarak var = expression print [ expression-list ] [ > expression ] printf format [ , expression-list ] [ > expression ] return [ expression ] next # bu girdi satırındaki kalan kalıpları atla nextfile # bu dosyanın geri kalanını atla, sonrakini aç, en baştan başla delete array[ expression ]# bir dizi öğesini sil delete array # dizinin tüm öğelerini sil exit [ expression ] # hemen çık; durum kodu expression değeridir
İfadeler noktalı virgüller, satır sonları veya sağ süslü parantezlerle sonlandırılır. Boş bir expression-list, $0 anlamına gelir. Dize sabitleri çift tırnak " " içine alınır ve içindeki olağan C kaçış dizileri tanınır. İfadeler uygun şekilde dize veya sayısal değerler alır ve + - * / % ^ (üs alma) ve birleştirme (boşlukla gösterilir) operatörleri kullanılarak oluşturulur. ! ++ -- += -= *= /= %= ^= > >= < <= == != ?: operatörleri de ifadelerde kullanılabilir. Değişkenler skalerler, dizi öğeleri (x[i] ile gösterilir) veya alanlar olabilir. Değişkenler boş dizeye sıfırlanır. Dizi indisleri sayısal olmak zorunda olmayıp herhangi bir dize olabilir; bu, bir tür ilişkisel bellek (associative memory) biçimine izin verir. [i,j,k] gibi çoklu indisler kabul edilir; bileşenler, SUBSEP değeriyle ayrılmış olarak birleştirilir.
print ifadesi, argümanlarını standart çıktıya (veya > dosya veya >> dosya mevcutsa bir dosyaya ya da | cmd mevcutsa bir boruya) yazdırır, bunlar mevcut çıktı alanı ayırıcısı ile ayrılır ve çıktı kayıt ayırıcısı ile sonlandırılır. dosya ve cmd literal isimler veya parantez içindeki ifadeler olabilir; farklı ifadelerdeki aynı dize değerleri aynı açık dosyayı gösterir. printf ifadesi, ifade listesini biçime göre biçimlendirir (bkz. printf(3)). Yerleşik fonksiyon close(expr), expr dosyasını veya borusunu kapatır. Yerleşik fonksiyon fflush(expr), expr dosyası veya borusu için arabelleğe alınmış tüm çıktıları boşaltır (flush).
atan2, cos, exp, log, sin ve sqrt matematiksel fonksiyonları yerleşiktir. Diğer yerleşik fonksiyonlar şunlardır:
length dize olarak alınan argümanının uzunluğunu, bir dizi argümanı için dizideki öğelerin sayısını veya argüman yoksa $0'ın uzunluğunu döndürür. rand [0,1) aralığında rastgele sayı döndürür. srand rand için tohum (seed) değerini ayarlar ve önceki tohum değerini döndürür. int bir tam sayı değerine kırpar. substr(s, m [, n]) s dizisinin 1'den başlanarak sayılan m konumundan başlayan n karakterlik alt dizesini döndürür. n yoksa, dizinin geri kalanını kullanır. index(s, t) t dizisinin s içinde göründüğü konumu döndürür, yoksa 0 döndürür. match(s, r) r düzenli ifadesinin s içinde göründüğü konumu döndürür, yoksa 0 döndürür. RSTART ve RLENGTH değişkenleri, eşleşen dizenin konumuna ve uzunluğuna ayarlanır. split(s, a [, fs]) s dizisini a[1], a[2], ..., a[n] dizi öğelerine böler ve n değerini döndürür. Bölme işlemi fs düzenli ifadesiyle veya fs verilmemişse FS alan ayırıcısıyla yapılır. Alan ayırıcı olarak boş bir dize, dizeyi karakter başına bir dizi öğesi olacak şekilde böler. sub(r, t [, s]) s dizisindeki r düzenli ifadesinin ilk oluşumunun yerine t koyar. s verilmemişse $0 kullanılır. gsub(r, t [, s]) düzenli ifadenin tüm oluşumlarının değiştirilmesi dışında sub ile aynıdır; sub ve gsub yapılan değişikliklerin sayısını döndürür. sprintf(fmt, expr, ...) expr ... ifadelerinin fmt printf(3) biçimine göre biçimlendirilmesiyle elde edilen dizeyi döndürür. system(cmd) cmd komutunu yürütür ve çıkış durumunu döndürür. Bu, hata durumunda -1, normal bir çıkışta cmd'nin çıkış durumu, sinyalle sonlandırılmada 256 + sig (burada sig sonlandıran sinyalin numarasıdır) veya bir bellek dökümü (core dump) varsa 512 + sig olacaktır. tolower(str) str dizisinin tüm büyük harfli karakterlerinin karşılık gelen küçük harfli eşdeğerlerine dönüştürülmüş bir kopyasını döndürür. toupper(str) str dizisinin tüm küçük harfli karakterlerinin karşılık gelen büyük harfli eşdeğerlerine dönüştürülmüş bir kopyasını döndürür.
``function'' getline, $0 değerini mevcut girdi dosyasından bir sonraki girdi kaydına ayarlar; getline < dosya, $0 değerini dosya içinden bir sonraki kayda ayarlar. getline x bunun yerine x değişkenini ayarlar. Son olarak, cmd | getline, cmd çıktısını getline içine yönlendirir; getline'ın her çağrısı cmd'den gelen bir sonraki çıktı satırını döndürür. Tüm durumlarda getline, başarılı bir girdi için 1, dosya sonu için 0 ve hata için -1 döndürür.
Kalıplar, düzenli ifadelerin ve ilişkisel ifadelerin (! || && ile) isteğe bağlı Boolean kombinasyonlarıdır. Düzenli ifadeler re_format(7) içinde tanımlandığı gibidir. Bir kalıptaki izole düzenli ifadeler tüm satıra uygulanır. Düzenli ifadeler, ~ ve !~ operatörleri kullanılarak ilişkisel ifadelerde de yer alabilir. /re/ sabit bir düzenli ifadedir; bir kalıptaki izole bir düzenli ifadenin konumu hariç, herhangi bir dize (sabit veya değişken) düzenli ifade olarak kullanılabilir.
Bir kalıp, virgülle ayrılmış iki kalıptan oluşabilir; bu durumda eylem, ilk kalıbın oluşumundan ikincinin oluşumuna kadar olan tüm satırlar için gerçekleştirilir.
İlişkisel bir ifade aşağıdakilerden biridir:
expression matchop regular-expression expression relop expression expression in array-name (expr,expr,...) in array-name
burada relop, C'deki altı ilişkisel operatörden herhangi biridir ve matchop, ~ (eşleşir) veya !~ (eşleşmez) operatörlerinden biridir. Koşul ifadesi aritmetik bir ifade, ilişkisel bir ifade veya bunların bir Boolean kombinasyonudur.
BEGIN ve END özel kalıpları, ilk girdi satırı okunmadan önce ve son satır okunduktan sonra kontrolü ele geçirmek için kullanılabilir. BEGIN ve END diğer kalıplarla birleşmez. Bir programda birden çok kez görünebilirler ve awk tarafından okundukları sırayla yürütülürler.
Özel anlamları olan değişken adları:
ARGC argüman sayısı, atanabilir. ARGV argüman dizisi, atanabilir; null olmayan üyeler dosya adı olarak alınır. CONVFMT sayıları dönüştürürken kullanılan dönüştürme biçimi (varsayılan %.6g). ENVIRON ortam değişkenleri dizisi; indisler isimlerdir. FILENAME mevcut girdi dosyasının adı. FNR mevcut dosyadaki mevcut kaydın sıra numarası. FS alanları ayırmak için kullanılan düzenli ifade; -Ffs seçeneği ile de ayarlanabilir. NF mevcut kayıttaki alan sayısı. NR mevcut kaydın sıra numarası. OFMT sayılar için çıktı biçimi (varsayılan %.6g). OFS çıktı alanı ayırıcısı (varsayılan boşluk). ORS çıktı kayıt ayırıcısı (varsayılan satır sonu). RLENGTH match tarafından eşleşen bir dizenin uzunluğu. RS girdi kayıt ayırıcısı (varsayılan satır sonu). Boşsa, boş satırlar kayıtları ayırır. Birden fazla karakter uzunluğundaysa RS bir düzenli ifade olarak kabul edilir ve kayıtlar ifademizle eşleşen metinle ayrılır. RSTART match tarafından eşleşen bir dizenin başlangıç konumu. SUBSEP çoklu indisleri ayırır (varsayılan 034).
Fonksiyonlar (bir kalıp-eylem ifadesi konumunda) şu şekilde tanımlanabilir:
function foo(a, b, c) { ...; return x }
Parametreler skaler ise değerine göre (by value), dizi adı ise referansına göre (by reference) geçirilir; fonksiyonlar özyinelemeli (recursive) olarak çağrılabilir. Parametreler fonksiyona yereldir; diğer tüm değişkenler küreseldir. Bu nedenle, fonksiyon tanımında fazladan parametreler sağlanarak yerel değişkenler oluşturulabilir.
Ortam Değişkenleri (Environment Variables)
POSIXLY_CORRECT ortamda ayarlanmışsa awk, ardışık ters eğik çizgiler ve ampersanlar açısından sub ve gsub için POSIX kurallarını izler.
Örnekler (Examples)
length($0) > 72
72 karakterden uzun satırları yazdırır.
{ print $2, $1 }
İlk iki alanı ters sırada yazdırır.
BEGIN { FS = ",[ \t]*|[ \t]+" }
{ print $2, $1 }
Aynısı, girdi alanları virgül ve/veya boşluklar ve sekmelerle ayrılmış olarak.
{ s += $1 }
END { print "toplam", s, " ortalama", s/NR }
İlk sütunu toplar, toplamı ve ortalamayı yazdırır.
/start/, /stop/
start/stop çiftleri arasındaki tüm satırları yazdırır.
BEGIN { # echo(1) komutunu simüle eder
for (i = 1; i < ARGC; i++) printf "%s ", ARGV[i]
printf "\n"
exit }
Ayrıca Bakınız (See Also)
grep(1), lex(1), sed(1)
A. V. Aho, B. W. Kernighan, P. J. Weinberger, The AWK Programming Language, Addison-Wesley, 1988. ISBN 0-201-07981-X.
Hatalar (Bugs)
Sayılar ve dizeler arasında açık dönüşümler yoktur. Bir ifadenin sayı olarak ele alınmasını zorlamak için ona 0 ekleyin; dize olarak ele alınmasını zorlamak için ona "" birleştirin.
Fonksiyonlardaki değişkenler için kapsam kuralları bir karmaşadır; sözdizimi ise daha kötüdür.
Yalnızca sekiz bitlik karakter kümeleri doğru şekilde işlenir.
2020-11-24 AWK(1)