Sök…


Kommandoradvariabel tilldelning

För att tilldela variabler från kommandoraden kan -v användas:

$ awk -v myvar="hello" 'BEGIN {print myvar}'
hello

Observera att det inte finns några mellanslag runt lika skylten.

Detta gör det möjligt att använda skalvariabler:

$ shell_var="hello"
$ awk -v myvar="$shell_var" 'BEGIN {print myvar}'
hello

Detta gör det också möjligt att ställa in inbyggda variabler som styr awk :

Se ett exempel med FS (fältavskiljare):

$ cat file
1,2;3,4
$ awk -v FS="," '{print $2}' file
2;3
$ awk -v FS=";" '{print $2}' file
3,4

Eller med OFS (utgångsfältavskiljare):

$ echo "2 3" | awk -v OFS="--" '{print $1, $2}'
2--3
$ echo "2 3" | awk -v OFS="+" '{print $1, $2}'
2+3

Att överföra parametrar till ett program med alternativet -v

Alternativet -v följt av en tilldelning av formvariabeln = värde kan användas för att skicka parametrar till ett awk- program. Detta illustreras av straffprogrammet nedan, vars uppgift är att skriva räkningen gånger meningen ”Jag ska inte prata i klassen.” på standardutgång. Följande exempel använder värdet 100, vilket är mycket populärt bland lärare:

awk -v count=100 'BEGIN {
  for(i = 1; i <= count; ++i) {
    print("I shall not talk in class.")
  }
  exit
}'

Det är möjligt att skicka flera parametrar med upprepad användning av -v flaggan:

awk -v count=100 -v "sentence=I shall not talk in class." 'BEGIN {
  for(i = 1; i <= count; ++i) {
    print(sentence)
  }
  exit
}'

Det finns inget inbyggt stöd för array- eller listparametrar, dessa måste hanteras manuellt. En klassisk metod för att passera en listparameter är att sammanfoga listan med en avgränsare, populära val är : | eller , Delningsfunktionen gör det möjligt att återställa listan som en awk- array:

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
}'

Utmatningen från detta awk- program är

list: 1: a
list: 2: b
list: 3: c
list: 4: d
list: 5: e
list: 6: f

Ibland är det mer bekvämt att återställa listobjekt som nycklar i en awk- array, eftersom detta möjliggör enkel verifiering av medlemskap. Till exempel skriver följande program ut varje rad vars första ord inte tillhör en fast lista med undantag:

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

Utgången från detta program är

pineapple Do you like pineapple?

Som ett sista exempel visar vi hur man kan lasta in straffprogrammet i ett skalskript, eftersom detta illustrerar hur ett skalskript överför parametrar till ett extra awk- skript:

#!/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
}'

Lokala variabler

Awk- språket stöder inte direkt variabler som är lokala för funktioner. Det är dock lätt att emulera dem genom att lägga till extra argument till funktioner. Det är traditionellt att prefixera dessa variabler med en _ att indikera att de inte är faktiska parametrar.

Vi illustrerar denna teknik med definitionen av en single_quote funktion som lägger till enstaka citat runt en sträng:

# 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);
}

Det enklare tillvägagångssättet att använda sprintf("'%s'", text) leder till praktiska problem eftersom awk- skript vanligtvis skickas som enda citerade argument till awk- programmet.

Uppdragsargument

Tilldelningsargument visas i slutet av en awk kallelse, i samma område som filvariabler, både -v tilldelningar och argumenttilldelningar måste matcha följande reguljära uttryck. (antar en POSIX-språk)

^[[:alpha:]_][[:alnum:]_]*=

Följande exempel förutsätter en fil file som innehåller följande: 1 2 3 (vita rymden separerade)

$ 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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow