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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow