İngilizceFransızcaAlmancaİtalyanPortekizceRusçaİspanyolca

OnWorks favicon'u

mawk - Bulutta Çevrimiçi

Ubuntu Online, Fedora Online, Windows çevrimiçi emülatörü veya MAC OS çevrimiçi emülatörü üzerinden OnWorks ücretsiz barındırma sağlayıcısında mawk çalıştırın

Bu, Ubuntu Online, Fedora Online, Windows çevrimiçi emülatörü veya MAC OS çevrimiçi emülatörü gibi birden fazla ücretsiz çevrimiçi iş istasyonumuzdan birini kullanarak OnWorks ücretsiz barındırma sağlayıcısında çalıştırılabilen komut mawk'tır.

PROGRAM:

ADI


mawk - desen tarama ve metin işleme dili

SİNOPSİS


mawk [-W seçenek] [-F değer] [-v var=değer] [--] 'program metni' [dosya ...]
mawk [-W seçenek] [-F değer] [-v var=değer] [-f program dosyası] [--] [dosya ...]

TANIM


mawk AWK Programlama Dili için bir tercümandır. AWK dili aşağıdakiler için kullanışlıdır:
veri dosyalarının manipülasyonu, metin alma ve işleme ve prototipleme ve
algoritmalarla denemeler. mawk bir yeni awk yani AWK dilini uygular
Aho, Kernighan ve Weinberger'de tanımlandığı gibi, The AWK Programlama Dil, Addison-Wesley
Yayıncılık, 1988. (Bundan böyle AWK kitabı olarak anılacaktır.) mawk Posix'e uygundur
Birkaç özellik içeren AWK dilinin 1003.2 (taslak 11.3) tanımı
AWK kitabında açıklanan ve mawk az sayıda uzantı sağlar.

Bir AWK programı, bir dizi model {eylem} çiftler ve fonksiyon tanımları. Kısa boylu
programlar, kabuktan kaçınmak için genellikle ' ' içine alınmış komut satırına girilir
tercüme. -f seçeneği ile daha uzun programlar bir dosyadan okunabilir. Veri
girdi, komut satırındaki dosya listesinden veya standart girdiden okunur.
liste boş. Giriş, kayıt ayırıcı tarafından belirlenen kayıtlara bölünür.
Değişken, RS. Başlangıçta, RS = "\n" ve kayıtlar satırlarla eş anlamlıdır. Her kayıt
her biri ile karşılaştırıldığında model ve eşleşirse, program metni {eylem} is
idam edildi.

SEÇENEKLER


-F değer alan ayırıcıyı ayarlar, FSe değer.

-f dosya Program metni şuradan okunur: dosya komut satırı yerine. çoklu
-f seçeneklere izin verilir.

-v var=değer atar değer değişken programlamak var.

-- seçeneklerin kesin sonunu gösterir.

Yukarıdaki seçenekler, herhangi bir Posix uyumlu AWK uygulamasıyla kullanılabilecektir ve
uygulamaya özel seçenekler -W. mawk altı sağlar:

-W versiyon mawk sürümünü ve telif hakkını stdout'a yazar ve derlenmiş sınırları
stderr ve 0'dan çıkar.

-W dump, dahili temsilinin listesi gibi bir montajcı yazar.
stdout'a programlayın ve 0'dan çıkın (başarılı derlemede).

-W etkileşimli, stdout'a arabelleğe alınmamış yazmaları ve stdin'den satır arabelleğe alınmış okumaları ayarlar.
stdin'den gelen kayıtlar, değerinden bağımsız olarak satırlardır. RS.

-W exec dosya Program metni şuradan okunur: dosya ve bu son seçenek. üzerinde yararlı
destekleyen sistemler #! yürütülebilir dosya için "sihirli sayı" kuralı
komut.

-W sürat =num boyutunu ayarlar mawk'ın için dahili sprintf arabelleği num bayt. Bundan fazla
bu seçeneğin nadir kullanımı şunları gösterir: mawk yeniden derlenmelidir.

-W posix_space kuvvetleri mawk '\n'yi boşluk olarak görmemek.

kısa formlar -W[vdiesp] tanınır ve bazı sistemlerde -We kaçınılması zorunludur
komut satırı uzunluğu sınırlamaları.

L' AWK DİL


1. program yapı
Bir AWK programı, bir dizi model {eylem} çiftler ve kullanıcı fonksiyon tanımları.

Bir desen olabilir:
BAŞLA
END
ifade
ifade, ifade

Bir, ama ikisi birden değil model {eylem} göz ardı edilebilir. Eğer {eylem} atlandı o
dolaylı olarak {yazdır}. Eğer model atlanır, o zaman örtük olarak eşleştirilir. BAŞLA ve
END desenler bir eylem gerektirir.

İfadeler yeni satırlar, noktalı virgüller veya her ikisi ile sonlandırılır. gibi ifade grupları
eylemler veya döngü gövdeleri, C'deki gibi { ... } aracılığıyla engellenir. Bir bloktaki son ifade
terminatöre ihtiyaç duymaz. Boş satırların anlamı yoktur; boş bir ifade sonlandırılır
noktalı virgül ile. Uzun ifadelere ters eğik çizgi, \ ile devam edilebilir. Bir ifade olabilir
virgül, sol ayraç, &&, ||, sonrasında ters eğik çizgi olmadan kırılabilir do, başka, doğru
bir parantez if, süre or için ifadesi ve bir fonksiyonun sağ parantezi
tanım. Bir yorum # ile başlar ve sonuna kadar uzanır, ancak satırın sonunu içermez.

Aşağıdaki ifadeler, blokların içindeki program akışını kontrol eder.

if ( İfade ) ifade

if ( İfade ) ifade başka ifade

süre ( İfade ) ifade

do ifade süre ( İfade )

için ( opt_expr ; opt_expr ; opt_expr ) ifade

için ( var in dizi ) ifade

devam etmek

kırılma

2. Veri tipleri, Dönüştürme ve karşılaştırma
Sayısal ve dize olmak üzere iki temel veri türü vardır. Sayısal sabitler tamsayı gibi olabilir
-2, 1.08 gibi ondalık sayı veya -1.1e4 veya .28E-3 gibi bilimsel gösterimde. tüm sayılar
dahili olarak temsil edilir ve tüm hesaplamalar kayan nokta aritmetiğinde yapılır. İçin böylece
örneğin, 0.2e2 == 20 ifadesi doğrudur ve doğru, 1.0 olarak temsil edilir.

Dize sabitleri çift tırnak içine alınır.

"Bu, sonunda yeni satır bulunan bir dizedir.\n"

Dizeler, yeni satırdan kaçarak (\) bir satır boyunca devam ettirilebilir. Aşağıdaki kaçış
diziler tanınır.

\\ \
\" "
\a uyarı, ascii 7
\b geri al, ascii 8
\t sekmesi, ascii 9
\n yeni satır, ascii 10
\v dikey sekme, ascii 11
\f biçim besleme, ascii 12
\r satır başı, ascii 13
\ddd ascii ddd için 1, 2 veya 3 sekizlik basamak
\xhh ascii hh için 1 veya 2 onaltılık basamak

Diğer herhangi bir \c karakterinden kaçarsanız, \c elde edersiniz, yani, mawk kaçışı görmezden gelir.

Gerçekten üç temel veri türü vardır; üçüncü numara ve dizi her ikisi de olan
sayısal değer ve aynı anda bir dize değeri. Kullanıcı tanımlı değişkenler geliyor
ilk başvurulduğunda ve başlatıldığında varlığı boş, bir sayı ve dize değeri
0 sayısal değerine ve "" dize değerine sahip olan. Önemsiz sayı ve dizeyle yazılmış veriler
girdiden gelir ve genellikle alanlarda saklanır. (bkz. bölüm 4).

Bir ifadenin türü, bağlamına ve otomatik tür dönüştürmesine göre belirlenir.
gerekirse oluşur. Örneğin, ifadeleri değerlendirmek için

y = x + 2 ; z = x "merhaba"

y değişkeninde saklanan değer sayısal olarak yazılacaktır. x sayısal değilse, okunan değer
from x, 2'ye eklenmeden ve y'de saklanmadan önce sayısala dönüştürülür. depolanan değer
z değişkeninde dizge yazılacak ve eğer öyleyse x'in değeri dizgeye dönüştürülecek
gerekli ve "merhaba" ile birleştirilmiş. (Elbette, x'de saklanan değer ve tür,
herhangi bir dönüştürme tarafından değiştirilmemiştir.) Bir dize ifadesi, onun kullanılarak sayısala dönüştürülür.
olduğu gibi en uzun sayısal önek At(3). Sayısal bir ifade dizeye dönüştürülür
Değiştirilmesi İfade ile sprintf(CONVFMT, İfade), Meğer ki İfade ana bilgisayarda temsil edilebilir
makine tam bir tamsayı olarak daha sonra dönüştürülür sprintf("%NS", İfade). Sprintf() bir
işlevselliğini çoğaltan AWK yerleşik sprintf(3), ve CONVFMT yerleşik
sayıdan dizgeye dahili dönüşüm için kullanılan ve "%.6g" olarak başlatılan değişken.
Açık tip dönüşümler zorlanabilir, İfade "" dizedir ve İfade+0 sayısaldır.

Değerlendirmek, İfade1 tekrar İfade2, her iki işlenen de sayısal veya sayı ve dize ise
karşılaştırma sayısaldır; her iki işlenen de dize ise karşılaştırma dizedir; Eğer biri
işlenen dizedir, dize olmayan işlenen dönüştürülür ve karşılaştırma dizedir. NS
sonuç sayısal, 1 veya 0'dır.

Boole bağlamlarında, örneğin, if ( İfade ) ifade, bir dize ifadesi, eğer doğruysa
ve yalnızca boş dize "" değilse; sayısal değerler ancak ve ancak sayısal olarak değilse
sıfır.

3. Düzenli ifade
AWK dilinde, kayıtlar, alanlar ve dizeler genellikle bir düzenli
ifade. Normal ifadeler eğik çizgi içine alınır ve

İfade ~ /r/

ise 1 olarak değerlendirilen bir AWK ifadesidir. İfade "maçlar" r, bu bir alt dize anlamına gelir
İfade tarafından tanımlanan dizeler kümesindedir r. Eşleşme olmadığında ifade 0 olarak değerlendirilir;
~ yerine "eşleşmeyen" işleci, !~, anlamı tersine çevirir. desen-eylem olarak
çiftler

/r/ { aksiyon } ve $0 ~ /r/ { aksiyon }

aynıdır ve eşleşen her giriş kaydı için r, aksiyon Idam edildi. Aslında, /r/
($0 ~ /r/) sağda olduğu durumlar dışında herhangi bir yerde
bir eşleşme operatörünün tarafı veya bir
normal ifade argümanı.

AWK, olduğu gibi genişletilmiş düzenli ifadeler kullanır yumurta(1). normal ifade
meta karakterler, yani normal ifadelerde özel anlamı olanlar

^ $ . [ ] | ( ) * + ?

Normal ifadeler, karakterlerden aşağıdaki gibi oluşturulur:

c herhangi bir meta karakter olmayanla eşleşir c.

\c kullanılan aynı kaçış dizileriyle tanımlanan bir karakterle eşleşir.
dize sabitleri veya değişmez karakter c Eğer \c kaçış değil
sıra.

. herhangi bir karakterle eşleşir (yeni satır dahil).

^ bir dizgenin ön tarafıyla eşleşir.

$ bir dizgenin arkasıyla eşleşir.

[c1c2c3...], c1c2c3... sınıfındaki herhangi bir karakterle eşleşir. bir aralık
karakterler bir sınıf içinde c1-c2 olarak gösterilir [...].

[^c1c2c3...] c1c2c3 sınıfında olmayan herhangi bir karakterle eşleşir...

Normal ifadeler, diğer normal ifadelerden aşağıdaki gibi oluşturulur:

r1r2 maçları r1 hemen ardından r2 (birleştirme).

r1 | r2 maçları r1 veya r2 (alternatif).

r* maçlar r sıfır veya daha fazla kez tekrarlandı.

r+ maçlar r bir veya daha fazla kez tekrarlanır.

r? maçlar r sıfır veya bir kez.

(r) maçlar r, gruplama sağlar.

Operatörlerin artan önceliği, dönüşümlü, sıralı ve tekli (*, + veya
?).

Örneğin,

/^[_a-zA-Z][_a-zA-Z0-9]*$/ ve
/^[-+]?([0-9]+\.?|\.[0-9])[0-9]*([eE][-+]?[0-9]+)?$/

sırasıyla AWK tanımlayıcıları ve AWK sayısal sabitleri ile eşleştirilir. Bunu not et . zorunda
ondalık nokta olarak tanınmak için kaçınılmalıdır ve metakarakterler özel değildir
karakter sınıfları içinde.

~ veya !~ operatörlerinin sağ tarafında herhangi bir ifade kullanılabilir veya bir
normal bir ifade bekleyen yerleşik. Gerekirse dizeye dönüştürülür ve
sonra normal bir ifade olarak yorumlanır. Örneğin,

BAŞLA { tanımlayıcı = "[_a-zA-Z][_a-zA-Z0-9]*" }

$0 ~ "^" tanımlayıcı

bir AWK tanımlayıcısı ile başlayan tüm satırları yazdırır.

mawk boş dizeyle eşleşen // boş normal ifadesini tanır ve dolayısıyla
her karakterin önünde, arkasında ve arasında herhangi bir dize ile eşleştirilir. Örneğin,

yankı abc | mawk { gsub(//, "X"); Yazdır }
XaXbXcX

4. Kayıtlar ve alanları
Kayıtlar birer birer okunur ve alan değişken $0. rekor
ayrılmak alanları içinde depolanan $1, $2, ..., $NF. Yerleşik değişken NF ayarlanır
alan sayısına ve NR ve FNR 1 artırılır. Yukarıdaki alanlar $NF için ayarlandı
"".

atama $0 alanlara neden olur ve NF yeniden hesaplanacak. atama NF veya
alan nedenleri $0 birleştirilerek yeniden yapılandırılması $i'ler ile ayrılmış OFS.
Şundan büyük dizine sahip bir alana atama NF, artışlar NF ve nedenleri $0 olduğu
yeniden inşa edildi.

Alanlarda depolanan veri girişi, alanın tamamı sayısal forma sahip olmadıkça ve ardından
tür, sayı ve dizedir. Örneğin,

yankı 24 24E |
mawk '{ print($1>100, $1>"100", $2>100, $2>"100") }'
0 1 1 1

$0 ve $2 dize ve $1 sayı ve dizedir. İlk karşılaştırma sayısaldır,
ikincisi dize, üçüncüsü dizedir (100, "100"e dönüştürülür) ve sonuncusu dizedir.

5. İfadeler ve operatörler
İfade sözdizimi C'ye benzer. Birincil ifadeler sayısal sabitlerdir, dize
sabitler, değişkenler, alanlar, diziler ve işlev çağrıları. Bir değişkenin tanımlayıcısı,
dizi veya işlev, bir dizi harf, rakam ve alt çizgi olabilir;
bir rakamla başlayın. Değişkenler bildirilmez; ilk başvurulduğunda var olurlar ve
başlatıldı boş.

Artan sırayla aşağıdaki operatörlerle yeni ifadeler oluşturulur:
öncelik.

atama = += -= *= /= %= ^=
şartlı ? :
mantıksal or ||
mantıksal ve &&
dizi üyelik in
uygun ~ !~
ilişkisel < > <= >= == !=
birbirine bağlama (açık operatör yok)
eklemek ops + -
mul ops * /%
birli + -
mantıksal değil !
üstalma ^
inc ve Aralık ++ -- (hem gönderi hem de ön)
alan $

Atama, koşullu ve üslü ilişkilendirme sağdan sola; diğer operatörler
soldan sağa ilişkilendirin. Herhangi bir ifade parantez içine alınabilir.

6. Diziler
Awk, tek boyutlu diziler sağlar. Dizi elemanları şu şekilde ifade edilir: dizi[İfade]. İfade
dahili olarak dize türüne dönüştürülür, bu nedenle örneğin A[1] ve A["1"] aynıdır
eleman ve gerçek dizin "1". Dizeler tarafından indekslenen dizilere ilişkisel denir
diziler. Başlangıçta bir dizi boştur; öğeler ilk erişildiğinde bulunur. İfade,
İfade in dizi 1 olarak değerlendirilirse dizi[İfade] var, yoksa 0'a.

bir formu var için bir dizinin her bir dizini üzerinde dönen ifade.

için ( var in dizi ) ifade

setleri var her bir indekse dizi ve yürütür ifade. sipariş ki var enine
endeksleri dizi Tanımlanmadı.

İfade, silmek dizi[İfade], nedenler dizi[İfade] var olmamak. mawk destekler
uzantı, silmek dizi, tüm öğelerini siler dizi.

Çok boyutlu diziler, yerleşik değişken kullanılarak birleştirme ile sentezlenir
ALT BÖLÜM. dizi[İfade1,İfade2] eşdeğerdir dizi[İfade1 ALT BÖLÜM İfade2]. için test
çok boyutlu öğe, parantez içinde bir dizin kullanır, örneğin

eğer ( (i, j) in A ) yazdır A[i, j]

7. Yerleşik değişkenler
Aşağıdaki değişkenler yerleşiktir ve program yürütülmeden önce başlatılır.

ARGC komut satırı argümanlarının sayısı.

ARGV komut satırı argümanları dizisi, 0..ARGC-1.

CONVFMT sayıların dizgeye dahili dönüşümü için format, başlangıçta = "%.6g".

ÇEVRE ortam değişkenleri tarafından indekslenen dizi. Bir ortam dizisi, var=değer
olarak saklanır ÇEVRE[var] = değer.

DOSYA ADI geçerli girdi dosyasının adı.

FNR şu anki kayıt numarası DOSYA ADI.

FS kayıtları düzenli ifade olarak alanlara böler.

NF Geçerli kayıttaki alan sayısı.

NR toplam giriş akışındaki mevcut kayıt numarası.

OFMT sayıları yazdırmak için format; başlangıçta = "%.6g".

OFS çıktıdaki alanlar arasına eklenir, başlangıçta = " ".

ORS çıktıdaki her kaydı, başlangıçta = "\n" olarak sonlandırır.

UZUNLUK yerleşik işleve yapılan son çağrı tarafından ayarlanan uzunluk, eşleşme().

RS giriş kayıt ayırıcı, başlangıçta = "\n".

BAŞLAT için son çağrı tarafından belirlenen dizin eşleşme().

ALT BÖLÜM başlangıçta = "\034" olmak üzere birden çok dizi abonesi oluşturmak için kullanılır.

8. Gömme fonksiyonlar
Dize işlevleri

gsub(r,s,t) gsub(r, s)
Genel ikame, düzenli ifadenin her eşleşmesi r değişkende t is
dize ile değiştirildi s. Değiştirilenlerin sayısı döndürülür. Eğer t is
atlanmış, $0 kullanıldı. Değiştirme dizesinde bir & s ile değiştirilir
eşleşen alt dize t. \& ve \\ literal & ve \'yı sırasıyla
değiştirme dizesi.

dizin (NS)
If t bir alt dizesidir s, daha sonra konum t başlar döndürülür, aksi halde
0 döndürülür. ilk karakter s 1 konumundadır.

uzunluk (s)
Dizenin uzunluğunu döndürür s.

kibrit(s,r)
Normal ifadenin ilk en uzun eşleşmesinin dizinini döndürür r in
dizi s. Eşleşme yoksa 0 döndürür. Yan etki olarak, BAŞLAT ayarlandı
geri dönüş değeri. UZUNLUK eşleşmenin uzunluğuna veya eşleşme yoksa -1'e ayarlanır.
Boş dize eşleşirse, UZUNLUK 0 olarak ayarlanır ve eğer 1 döndürülürse
maç önde ve uzunluk(s) Maç şu anda ise +1 döndürülür.
arka.

bölmek(s,A,r) bölmek(s, bir)
dizi s düzenli ifade ile alanlara bölünür r ve alanlar
diziye yüklendi A. Alan sayısı döndürülür. 11. bölüme bakın
daha fazla ayrıntı için aşağıda. Eğer r atlanmıştır, FS kullanıldı.

sprintf (biçim, ifade listesi)
Oluşturulan bir dize döndürür expr listesi göre biçim. Bakın
printf() açıklaması aşağıdadır.

alt(r,s,t) alt(r, s)
Tek ikame, en fazla bir ikame dışında gsub() ile aynı.

substr(günah) alt dizi(si)
dizenin alt dizesini döndürür s, dizinden başlayarak i, uzunluk n. Eğer n
atlanırsa, son eki s, Başlayan i Iade edildi.

daha düşük(s)
Bir kopyasını döndürür s tüm büyük harf karakterleri küçük harfe dönüştürülmüştür.

topak(s)
Bir kopyasını döndürür s tüm küçük harf karakterleri büyük harfe dönüştürülmüştür.

Aritmetik fonksiyonlar

atan2 (y,x) Arktan y/x -pi ve pi arasında.

cos (x) Kosinüs fonksiyonu, x radyan cinsinden.

tecrübe(x) Üstel fonksiyon.

int(x) İadeler x sıfıra doğru kesildi.

günlüğü (x) Doğal logaritma.

Rand() Sıfır ile bir arasında rastgele bir sayı döndürür.

günah(x) Sinüs fonksiyonu, x radyan cinsinden.

kare(x) karekökünü döndürür x.

srand(İfade) srand()
Aşağıdaki durumlarda saati kullanarak rasgele sayı üretecini tohumlar: İfade atlanır ve
önceki tohumun değerini döndürür. mawk rastgele sayıyı tohumlar
başlangıçta saatten jeneratör, böylece gerçekten aramaya gerek yok
srand(). Srand(İfade) sözde rastgele dizileri tekrarlamak için kullanışlıdır.

9. Giriş ve çıktı
İki çıktı ifadesi vardır, baskı ve printf.

baskı yazıyor $0 ORS standart çıktıya.

baskı İfade1, İfade2, ..., İfaden
yazıyor İfade1 OFS İfade2 OFS ... İfaden ORS standart çıktıya. sayısal
ifadeler ile dizeye dönüştürülür OFMT.

printf biçim, expr listesi
printf C kitaplığı işlevinin standart çıktıya yazılmasını çoğaltır. NS
tam ANSI C format özellikleri %c dönüşümleriyle tanınır,
%d, %e, %E, %f, %g, %G, %i, %o, %s, %u, %x, %X ve %% ve dönüştürme
niteleyiciler h ve l.

Yazdırılacak veya yazdırılacak bağımsız değişken listesi isteğe bağlı olarak parantez içine alınabilir. Yazdır
kullanarak sayıları biçimlendirir OFMT veya tam sayılar için "%d". sayısal bir argümanla "%c"
karşılık gelen 8 bit karakteri, bir dize argümanıyla yazdırır, ilkini yazdırır
dizenin karakteri. print ve printf çıktısı bir dosyaya veya
ekleyerek komut > dosya, >> dosya veya | komuta print deyiminin sonuna kadar.
Yönlendirme açılır dosya or komuta yalnızca bir kez, sonraki yönlendirmeler zaten
açık akış. Kongre tarafından, mawk dosya adını ilişkilendirir "/dev/stderr" hangi stderr ile
print ve printf'in stderr'e yönlendirilmesine izin verir. mawk ayrıca "-" ortakları ve
stdin ve stdout ile "/dev/stdout", bu akışların işlevlere geçirilmesine izin verir.

giriş işlevi hat almak aşağıdaki varyasyonlara sahiptir.

hat almak
içine okur $0, alanları günceller, NF, NR ve FNR.

hat almak dosya
içine okur $0 itibaren dosya, alanları günceller ve NF.

hat almak var
sonraki kaydı içine okur var, güncellemeler NR ve FNR.

hat almak var < dosya
sonraki kaydını okur dosya içine var.

komuta | hat almak
borulardan bir rekor komuta içine $0 ve alanları günceller ve NF.

komuta | hat almak var
borulardan bir rekor komuta içine var.

Getline, dosya sonunda 0, hata durumunda -1, aksi takdirde 1 döndürür.

Boruların sonundaki komutlar /bin/sh tarafından yürütülür.

Bu fonksiyon kapat(İfade) ilişkili dosyayı veya boruyu kapatır İfade. Kapat, eğer 0 döndürür
İfade açık bir dosyaysa, çıkış durumu İfade borulu bir komuttur ve aksi takdirde -1'dir. Kapat
bir dosyayı veya komutu yeniden okumak için kullanılır, çıkış borusunun diğer ucunun bittiğinden emin olun
veya dosya kaynaklarını koruyun.

Bu fonksiyon floş(İfade) ile ilişkili çıktı dosyasını veya boruyu temizler İfade. floş
eğer 0 döndürür İfade açık bir çıkış akışıdır, else -1. Argümansız floş floşlar
standart. Boş bir argümanla ("") Flush, tüm açık çıktıları temizler.

Bu fonksiyon sistem(İfade) kullanır / Bin / sh yürütmek İfade ve çıkış durumunu döndürür
komuta İfade. Yapılan değişiklikler ÇEVRE dizi ile yürütülen komutlara iletilmez
sistem veya borular.

10 kullanıcı tanımlı fonksiyonlar
Kullanıcı tanımlı bir işlevin sözdizimi şöyledir:

işlev isim ( args ) { ifadeleri }

İşlev gövdesi bir dönüş ifadesi içerebilir

dönüş opt_expr

İade beyanı gerekli değildir. İşlev çağrıları iç içe veya özyinelemeli olabilir. Fonksiyonlar
değere göre iletilen ifadeler ve başvuruya göre dizilerdir. Ekstra argümanlar yerel olarak hizmet eder
değişkenler ve başlatıldı boş. Örneğin, csplit(s, bir) her karakteri koyar s
diziye A ve uzunluğunu döndürür s.

fonksiyon csplit(s, A, n, i)
{
n = uzunluk(lar)
for( i = 1 ; i <= n ; i++ ) A[i] = substr(s, i, 1)
dönüş n
}

Geçirilen argümanlar ve yerel değişkenler arasına fazladan boşluk koymak gelenekseldir.
Fonksiyonlara tanımlanmadan önce başvurulabilir, ancak fonksiyon adı ve '('
birleştirme ile karışıklığı önlemek için argümanlar dokunmalıdır.

11 Bölme Teller, kayıtlar ve Dosyaları
Awk programları, dizeleri split() ile dizilere bölmek için aynı algoritmayı kullanır ve kayıtları
üzerindeki alanlara FS. mawk dosyaları kayıtlara bölmek için temelde aynı algoritmayı kullanır
on RS.

Bölmek(ifade,A,eylül) aşağıdaki gibi çalışır:

(1) Eğer Eylül atlanır, değiştirilir FS. Eylül bir ifade olabilir veya
Düzenli ifade. Dize olmayan türden bir ifadeyse,
dizeye dönüştürülür.

(2) Eğer Eylül = " " (tek boşluk), ardından önden kesilir ve
sırtı İfade, ve Eylül olur . mawk tanımlar düzenli olarak
ifade /[ \t\n]+/. Aksi halde Eylül düzenli bir ifade olarak kabul edilir,
1 uzunluğundaki bir dize için meta karakterlerin yok sayılması dışında, örn.
split(x, A, "*") ve split(x, A, /\*/) aynıdır.

(3) Eğer İfade dize değil, dizeye dönüştürülür. Eğer İfade o zaman boş mu
string "", split() 0 döndürür ve A boş ayarlanır. Aksi takdirde, tüm olmayan
örtüşen, boş olmayan ve en uzun eşleşmeler Eylül in İfadeayrı İfade içine
yüklenen alanlar A. Alanlar A[1], A[2], ...,
A[n] ve split(), alan sayısı olan n değerini döndürür.
maç artı bir. Yerleştirilen veriler A sayısal görünen, yazılan sayıdır ve
dize.

Kayıtları alanlara bölmek, parçaların içine yüklenmesi dışında aynı şekilde çalışır. $1, $2, ...,
$NF. Eğer $0 boş, NF 0'a ayarlandı ve hepsi $i ile "".

mawk dosyaları aynı algoritmaya göre kayıtlara böler, ancak küçük bir farkla
RS gerçekten bir ayırıcı yerine bir sonlandırıcıdır. (ORS gerçekten de bir sonlandırıcıdır).

örneğin, eğer FS = ":+" ve $0 = "a::b:" , ardından NF = 3 ve $1 = "a", $2 = "b" ve $3 =
"", ancak "a::b:" bir girdi dosyasının içeriğiyse ve RS = ":+", o zaman
iki kayıt "a" ve "b".

RS = " " özel değil.

If FS = "", sonra mawk rekoru bireysel karakterlere böler ve benzer şekilde,
bölmek(s, bir,"") tek tek karakterleri yerleştirir s içine A.

12 Çok çizgili kayıtlar
Dan beri mawk yorumlayıp RS normal bir ifade olarak, çok satırlı kayıtlar kolaydır. Ayar RS
= "\n\n+", bir veya daha fazla boş satırı ayrı kayıt yapar. Eğer FS = " " (varsayılan),
sonra tek yeni satırlar, kurallara göre yukarıda, boşluk olur ve tek yeni satırlar
alan ayırıcılar

Örneğin, bir dosya "ab\nc\n\n" ise, RS = "\n\n+" ve FS = " ", o zaman
"a", "b" ve "c" alanlı bir "ab\nc" kaydı. Değiştirme FS = "\n", verir
iki alan "ab" ve "c"; değiştirme FS = "", ile aynı olan bir alan verir
kayıt.

Boşluk veya sekme içeren satırların boş olarak değerlendirilmesini istiyorsanız, RS = "\n([ \t]*\n)+".
Diğer awks ile uyumluluk için, ayar RS = "", boş satırlarla aynı etkiye sahiptir
dosyaların ön ve arka yüzlerinden sıyrılır ve kayıtlar sanki RS =
"\n\n+". Posix, "\n"nin her zaman kayıtları ayırmasını gerektirir. RS = "" ne olursa olsun
değeri FS. mawk "\n" olarak tanımlandığı için bu kuralı desteklemiyor
gereksiz kılar.

Çoğu zaman değiştiğinde RS çok satırlı kayıtlar için ayrıca değiştirmek isteyeceksiniz
ORS "\n\n" olarak ayarlayın, böylece çıktıda kayıt aralığı korunur.

13 program infaz
Bu bölüm, program yürütme sırasını açıklar. Öncelikle ARGC toplam olarak ayarlanır
programın yürütme aşamasına iletilen komut satırı argümanlarının sayısı. ARGV[0] is
AWK yorumlayıcısının adını ayarlayın ve ARGV[1] ... ARGV[ARGC-1] kalan tutar
Seçenekler ve program kaynağı hariç komut satırı bağımsız değişkenleri. örneğin ile

mawk -f prog v=1 A t=merhaba B

ARGC = 5 ile ARGV[0] = "mawk", ARGV[1] = "v=1", ARGV[2] = "A", ARGV[3] = "t=merhaba" ve
ARGV[4] = "B".

Sonraki, her BAŞLA blok sırayla yürütülür. Program tamamen şunlardan oluşuyorsa BAŞLA
bloklar, ardından yürütme sona erer, aksi takdirde bir giriş akışı açılır ve yürütme devam eder.
If ARGC 1'e eşittir, giriş akışı stdin'e ayarlanır, aksi takdirde komut satırı argümanları
ARGV[1] ... ARGV[ARGC-1] bir dosya argümanı için incelenir.

Komut satırı argümanları üç gruba ayrılır: dosya argümanları, atama argümanları
ve boş dizeler "". Bir ödevin formu vardır var=dizi. Ne zaman ARGV[i] incelendi
olası bir dosya argümanı olarak, boşsa atlanır; bu bir ödev ise
argüman, atama var gerçekleşir ve i sonraki argümana atlar; Başka ARGV[i]
giriş için açılır. Açılmazsa, yürütme çıkış kodu 2 ile sonlandırılır.
komut satırı argümanı bir dosya argümanıdır, ardından girdi stdin'den gelir. bir BAŞLA
eylem girişi açar. "-" dosya bağımsız değişkeni olarak stdin'i belirtir.

Bir giriş akışı açıldıktan sonra, her giriş kaydı her birine karşı test edilir. modelve eğer öyleyse
eşleşmeler, ilgili aksiyon Idam edildi. Bir ifade deseni, şu durumda eşleşir:
boolean true (bölüm 2'nin sonuna bakın). A BAŞLA desen, herhangi bir giriş yapılmadan önce eşleşir
okundu ve bir END tüm girdiler okunduktan sonra desen eşleşir. Bir aralık deseni,
İfade1,İfade2, maç arasındaki her kaydı eşleştirir İfade1 ve maç İfade2
kapsayıcı.

Giriş akışında dosya sonu oluştuğunda, kalan komut satırı argümanları
dosya argümanı için incelenir ve varsa açılır, aksi takdirde END model is
uyumlu olarak kabul edildi ve hepsi END eylemler yürütülür.

Örnekte, v=1 ataması, BAŞLA eylemler yürütülür ve
v'ye yerleştirilen veriler, yazılan sayı ve dizedir. Giriş daha sonra A dosyasından okunur.
A dosyasının t, "merhaba" dizesine ayarlanır ve B giriş için açılır. B dosyasının sonunda,
the END eylemler yürütülür.

Program akışı model {eylem} seviyesi ile değiştirilebilir.

sonraki
çıkış opt_expr

ifadeler. A sonraki ifadesi, bir sonraki giriş kaydının okunmasına ve model testine neden olur
ilkiyle yeniden başlamak model {eylem} programda eşleştirin. Bir çıkış açıklama nedenleri
derhal yürütülmesi END eylemler veya program sonlandırma yoksa veya
çıkış bir meydana gelir END eylem. NS opt_expr olmadığı sürece programın çıkış değerini ayarlar.
daha sonra geçersiz kılındı çıkış veya sonraki hata.

ÖRNEKLER


1. kediyi taklit et.

{ Yazdır }

2. wc'yi taklit et.

{ karakter += uzunluk($0) + 1 # için bir tane ekleyin \n
kelimeler += NF
}

END{ NR, kelimeler, karakterler yazdır }

3. benzersiz "gerçek kelimelerin" sayısını sayın.

BEGIN {FS = "[^A-Za-z]+" }

{ for(i = 1 ; i <= NF ; i++) kelime[$i] = "" }

END { kelimeyi sil[""]
için (kelime içinde) cnt++
yazdır cnt
}

4. Her kaydın ikinci alanını birinci alana göre toplayın.

$1 ~ /kredi|kazanç/ { toplam += $2 }
$1 ~ /borç|zarar/ { toplam -= $2 }

SON { toplamı yazdır }

5. bir dosyayı dizge olarak karşılaştırarak sıralayın

{ line[NR] = $0 "" } # karşılaştırma türünden emin olun
# bazı satırların sayısal görünmesi durumunda

END { isort(satır, NR)
for(i = 1 ; i <= NR ; i++) satırı yazdır[i]
}

#insertion A türü[1..n]
fonksiyon isort(A, n, i, j, beklet)
{
for( i = 2 ; ben <= n ; i++)
{
beklet = A[j = i]
while ( A[j-1] > beklet )
{ J-- ; A[j+1] = A[j] }
A[j] = bekle
}
# sentinel A[0] = "" gerekirse oluşturulacak
}

UYUMLULUK KONULAR


AWK dilinin Posix 1003.2(taslak 11.3) tanımı, AWK'da açıklandığı gibi AWK'dır.
SystemVR4 nawk'ta görünen birkaç uzantıya sahip kitap. Uzantılar şunlardır:

Yeni işlevler: toupper() ve tolower().

Yeni değişkenler: ENVIRON[] ve CONVFMT.

printf() ve sprintf() için ANSI C dönüştürme özellikleri.

Yeni komut seçenekleri: -v var=değer, çoklu -f seçenekleri ve uygulama seçenekleri
-W için argümanlar olarak.

Posix AWK, bir seferde dosyalar üzerinde çalışmaya yöneliktir. RS "\n" den değiştirilebilir
başka bir tek karaktere, ancak bunun için herhangi bir kullanım bulmak zor - yok
AWK kitabındaki örnekler. Kongre tarafından, RS = "", bir veya daha fazla boş satırı ayırır
kayıtları, çok satırlı kayıtlara izin verir. Ne zaman RS = "", "\n" her zaman bir alan ayırıcıdır
içindeki değerden bağımsız olarak FS.

mawkÖte yandan, izin verir RS düzenli bir ifade olsun. içinde "\n" göründüğünde
kayıtlar, boşluk olarak kabul edilir ve FS her zaman alanları belirler.

Satırı bir zaman paradigmasında kaldırmak, bazı programları daha basit hale getirebilir ve çoğu zaman iyileştirebilir
verim. Örneğin, yukarıdan örnek 3'ü yeniden yapmak,

BEGIN { RS = "[^A-Za-z]+" }

{ kelime[ $0 ] = "" }

END { kelimeyi sil[ "" ]
için (kelime içinde) cnt++
yazdır cnt
}

her kelimeyi bir kayıt haline getirerek benzersiz kelime sayısını sayar. Orta boyutlu dosyalarda,
mawk basitleştirilmiş iç döngü nedeniyle iki kat daha hızlı yürütülür.

Aşağıdaki program, bir C program dosyasındaki her bir yorumu tek bir boşlukla değiştirir,

BAŞLA {
RS = "/\*([^*]|\*+[^/*])*\*+/"
# yorum kayıt ayırıcıdır
ORS = " "
getline tutun
}

{ baskı bekletme ; bekletme = 0 $ }

END { printf "%s" , basılı tutun }

Son kaydı bir boşlukla sonlandırmaktan kaçınmak için bir kaydın arabelleğe alınması gerekir.

İle mawk, aşağıdakilerin tümü eşdeğerdir,

x ~ /a\+b/ x ~ "a\+b" x ~ "a\\+b"

Dizeler, bir kez dize ve bir kez normal ifade olarak olmak üzere iki kez taranır. Üzerinde
dizi taraması, mawk AWK kitabı savunurken, kaçış olmayan karakterlerde kaçışı yok sayar
\c olarak tanınmak c bu da meta-karakterlerin çift kaçışını gerektirir.
Teller. Posix, programları pasif olarak zorlayan davranışı tanımlamayı açıkça reddeder.
daha taşınabilir ancak daha az okunabilir, çift kullanmak için çeşitli awks altında çalışması gerekir.
kaçış.

Posix AWK, dizelerdeki "/dev/std{out,err}" veya \x hex kaçış dizilerini tanımıyor.
ANSI C'den farklı olarak, mawk \x'ten sonraki basamak sayısını geçerli sayı olarak iki ile sınırlar
uygulama yalnızca 8 bit karakterleri destekler. yerleşik floş ilk olarak bir ortaya çıktı
en son (1993) AT&T awk netlib'e yayınlandı ve posix standardının bir parçası değil.
ile toplu silme silmek dizi posix standardının bir parçası değildir.

Posix, davranışını açıkça terk eder. FS = "" tanımsız ve bölmeden bahseder
olası bir yorum olarak karakterlere kaydedin, ancak şu anda bu kullanım
uygulamalar arasında taşınabilir.

Son olarak, işte nasıl mawk AWK kitabında tartışılmayan istisnai durumları ele alır veya
Posix taslağı. Awks arasında tutarlılık varsaymak güvenli değildir ve bir sonrakine geçmek güvenlidir
Bölüm.

substr(s, i, n) kapalının kesişimindeki s karakterlerini döndürür
aralık [1, uzunluk(lar)] ve yarı açık aralık [i, i+n). Bu ne zaman
kesişim boş, boş dize döndürülür; so substr("ABC", 1, 0) = ""
ve substr("ABC", -4, 6) = "A".

Boş dize de dahil olmak üzere her dize, öndeki boş dizeyle eşleşir, bu nedenle,
s ~ // ve s ~ "", eşleşme(ler, //) ve eşleşme(ler, "") olduğu gibi her zaman 1'dir. Son iki
set UZUNLUK 0 için.

indeks(ler, t) her zaman eşleşme(ler, t1) ile aynıdır, burada t1 ile t aynıdır
meta karakterler kaçtı. Bu nedenle, eşleşmeyle tutarlılık, dizin(ler, "") gerektirir
her zaman 1 döndürür. Ayrıca koşul, index(s,t) != 0 ise ve yalnızca t bir alt dize ise
of s, index("","") = 1 gerektirir.

getline, dosyanın sonuyla karşılaşırsa, getline var, var'ı değiştirmeden bırakır. Benzer şekilde,
girişte END hareketler, $0, alanlar ve NF değerlerini değiştirmeden
son kayıt.

onworks.net hizmetlerini kullanarak mawk'ı çevrimiçi kullanın


Ad


Ad

En yeni Linux ve Windows çevrimiçi programları