awk
Variabelen
Zoeken…
Toewijzing van opdrachtregelvariabelen
Om variabelen toe te wijzen vanaf de opdrachtregel, kan -v worden gebruikt:
$ awk -v myvar="hello" 'BEGIN {print myvar}'
hello
Merk op dat er geen spaties zijn rond het gelijkteken.
Hiermee kunnen shell-variabelen worden gebruikt:
$ shell_var="hello"
$ awk -v myvar="$shell_var" 'BEGIN {print myvar}'
hello
Dit maakt het ook mogelijk om ingebouwde variabelen in te stellen die awk regelen:
Zie een voorbeeld met FS (veldscheidingsteken):
$ cat file
1,2;3,4
$ awk -v FS="," '{print $2}' file
2;3
$ awk -v FS=";" '{print $2}' file
3,4
Of met OFS (scheiding van het uitvoerveld):
$ echo "2 3" | awk -v OFS="--" '{print $1, $2}'
2--3
$ echo "2 3" | awk -v OFS="+" '{print $1, $2}'
2+3
Parameters doorgeven aan een programma met de optie -v
De optie -v gevolgd door een toewijzing van de vormvariabele = waarde kan worden gebruikt om parameters door te geven aan een awk- programma. Dit wordt geïllustreerd door de straf programma hieronder, wiens taak het is om te schrijven telling keer de zin “Ik zal niet praten in de klas.” op standaarduitvoer. In het volgende voorbeeld wordt de waarde 100 gebruikt, die erg populair is onder leraren:
awk -v count=100 'BEGIN {
for(i = 1; i <= count; ++i) {
print("I shall not talk in class.")
}
exit
}'
Het is mogelijk om meerdere parameters door te geven met herhaald gebruik van de vlag -v :
awk -v count=100 -v "sentence=I shall not talk in class." 'BEGIN {
for(i = 1; i <= count; ++i) {
print(sentence)
}
exit
}'
Er is geen ingebouwde ondersteuning voor array- of lijstparameters, deze moeten handmatig worden verwerkt. Een klassieke benadering van een lijst parameter voorbij is om de lijst samen te voegen met behulp van een begrenzer, populaire keuzes zijn : , | of , . Met de splitfunctie kan de lijst vervolgens als een awk- array worden hersteld:
awk -v 'serialised_list=a:b:c:d:e:f' 'BEGIN {
list_sz = split(serialised_list, list, ":")
for(i = 1; i <= list_sz; ++i) {
printf("list: %d: %s\n", i, list[i])
}
exit
}'
De output van dit awk- programma is
list: 1: a
list: 2: b
list: 3: c
list: 4: d
list: 5: e
list: 6: f
Soms is het handiger om lijstitems als sleutels van een awk- array te herstellen, omdat dit eenvoudige lidmaatschapsverificatie mogelijk maakt. Het volgende programma drukt bijvoorbeeld elke regel af waarvan het eerste woord niet tot een vaste lijst met uitzonderingen behoort:
awk -v 'serialised_exception_list=apple:pear:cherry' 'BEGIN {
_list_sz = split(serialised_exception_list, _list, ":")
for(i = 1; i <= _list_sz; ++i) {
exception[_list[i]]
}
}
! ($1 in exception) { print }' <<EOF
apple Apples are yummy, I like them.
pineapple Do you like pineapple?
EOF
De output van dit programma is
pineapple Do you like pineapple?
Als laatste voorbeeld laten we zien hoe het strafprogramma in een shellscript kan worden ingepakt, omdat dit illustreert hoe een shellscript parameters overbrengt naar een hulpwekscript :
#!/bin/sh
usage()
{
cat <<EOF
Usage: punishment [-c COUNT][-s SENTENCE]
Prepare your punishments for you
EOF
}
punishment_count='100'
punishment_sentence='I shall not talk in class.'
while getopts "c:hs:" OPTION; do
case "${OPTION}" in
c) punishment_count="${OPTARG}";;
s) punishment_sentence="${OPTARG}";;
h) usage; exit 0;;
*) usage; exit 64;;
esac
done
awk -v "count=${punishment_count}" -v "sentence=${punishment_sentence}" 'BEGIN {
for(i = 1; i <= count; ++i) {
print(sentence)
}
exit
}'
Lokale variabelen
De awk- taal ondersteunt niet rechtstreeks lokale variabelen voor functies. Het is echter eenvoudig om ze te emuleren door extra argumenten aan functies toe te voegen. Het is gebruikelijk om deze variabelen _ te laten gaan door een _ om aan te geven dat het geen echte parameters zijn.
We illustreren deze techniek met de definitie van een single_quote functie die enkele aanhalingstekens rond een string toevoegt:
# single_quote(TEXT)
# Return a string made of TEXT surrounded by single quotes
function single_quote(text, _quote) {
_quote = sprintf("%c", 39)
return sprintf("%s%s%s", _quote, text, _quote);
}
De eenvoudigere benadering van het gebruik van sprintf("'%s'", text) leidt tot praktische problemen omdat awk- scripts meestal als enkele aanhalingstekens worden doorgegeven aan het awk- programma.
Opdrachtargumenten
Toewijzingsargumenten verschijnen aan het einde van een awk aanroep, in hetzelfde gebied als bestandsvariabelen, zowel -v toewijzingen als argumenttoewijzingen moeten overeenkomen met de volgende reguliere expressie. (uitgaande van een POSIX-landinstelling)
^[[:alpha:]_][[:alnum:]_]*=
Het volgende voorbeeld wordt uitgegaan van een bestand file gemaakt waarin de volgende: 1 2 3 (spaties gescheiden)
$ awk '{$1=$1}1' file OFS=, file OFS=- file
1 2 3
1,2,3
1-2-3