awk
Zmienne
Szukaj…
Przypisanie zmiennych wiersza poleceń
Aby przypisać zmienne z wiersza poleceń, można użyć opcji -v :
$ awk -v myvar="hello" 'BEGIN {print myvar}'
hello
Zauważ, że wokół znaku równości nie ma spacji.
Pozwala to na użycie zmiennych powłoki:
$ shell_var="hello"
$ awk -v myvar="$shell_var" 'BEGIN {print myvar}'
hello
Pozwala to również ustawić wbudowane zmienne sterujące awk :
Zobacz przykład z FS (separator pól):
$ cat file
1,2;3,4
$ awk -v FS="," '{print $2}' file
2;3
$ awk -v FS=";" '{print $2}' file
3,4
Lub z OFS (separator pól wyjściowych):
$ echo "2 3" | awk -v OFS="--" '{print $1, $2}'
2--3
$ echo "2 3" | awk -v OFS="+" '{print $1, $2}'
2+3
Przekazywanie parametrów do programu za pomocą opcji -v
Opcji -v po której następuje przypisanie postaci zmienna = wartość, można użyć do przekazania parametrów do programu awk . Ilustruje to poniższy program kar , którego zadaniem jest pisanie odliczania razy zdanie „Nie będę rozmawiał w klasie”. na standardowe wyjście. W poniższym przykładzie użyto wartości 100, która jest bardzo popularna wśród nauczycieli:
awk -v count=100 'BEGIN {
for(i = 1; i <= count; ++i) {
print("I shall not talk in class.")
}
exit
}'
Możliwe jest przekazanie wielu parametrów przy wielokrotnym użyciu flagi -v :
awk -v count=100 -v "sentence=I shall not talk in class." 'BEGIN {
for(i = 1; i <= count; ++i) {
print(sentence)
}
exit
}'
Nie ma wbudowanej obsługi parametrów tablicy lub listy, które należy obsługiwać ręcznie. Klasyczne podejście do przekazywania parametru lista jest do łączenia z listy za pomocą separatora, popularne wybory są : , | lub , . Funkcja podziału pozwala następnie odzyskać listę jako tablicę awk :
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
}'
Dane wyjściowe tego programu awk to
list: 1: a
list: 2: b
list: 3: c
list: 4: d
list: 5: e
list: 6: f
Czasami wygodniej jest odzyskać elementy listy jako klucze tablicy awk , ponieważ umożliwia to łatwą weryfikację członkostwa. Na przykład następujący program wypisuje każdy wiersz, którego pierwsze słowo nie należy do stałej listy wyjątków:
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
Dane wyjściowe tego programu to
pineapple Do you like pineapple?
Jako ostatni przykład pokazujemy, jak zawinąć program karania w skrypt powłoki, ponieważ ilustruje to, w jaki sposób skrypt powłoki przekazuje parametry do pomocniczego skryptu awk :
#!/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
}'
Zmienne lokalne
Język awk nie obsługuje bezpośrednio zmiennych lokalnych dla funkcji. Łatwo je jednak emulować, dodając dodatkowe argumenty do funkcji. Tradycyjnie poprzedza się te zmienne znakiem _ aby wskazać, że nie są to rzeczywiste parametry.
Ilustrujemy tę technikę definicją funkcji single_quote która dodaje pojedyncze cudzysłowy wokół łańcucha:
# 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);
}
Prostsze podejście do używania sprintf("'%s'", text) prowadzi do praktycznych problemów, ponieważ skrypty awk są zwykle przekazywane jako argumenty pojedynczego cudzysłowu do programu awk .
Argumenty przydziału
Argumenty przypisania pojawiają się na końcu wywołania awk , w tym samym obszarze co zmienne pliku, zarówno przypisania -v , jak i przypisania argumentów muszą pasować do następującego wyrażenia regularnego. (przy założeniu ustawień regionalnych POSIX)
^[[:alpha:]_][[:alnum:]_]*=
W poniższym przykładzie założono plik file zawierający: 1 2 3 (biały spacjami)
$ awk '{$1=$1}1' file OFS=, file OFS=- file
1 2 3
1,2,3
1-2-3