awk
Les variables
Recherche…
Affectation de variable de ligne de commande
Pour attribuer des variables à partir de la ligne de commande, vous pouvez utiliser -v :
$ awk -v myvar="hello" 'BEGIN {print myvar}'
hello
Notez qu'il n'y a pas d'espaces autour du signe égal.
Cela permet d'utiliser des variables shell:
$ shell_var="hello"
$ awk -v myvar="$shell_var" 'BEGIN {print myvar}'
hello
En outre, cela permet de définir des variables intégrées qui contrôlent awk :
Voir un exemple avec FS (séparateur de champs):
$ cat file
1,2;3,4
$ awk -v FS="," '{print $2}' file
2;3
$ awk -v FS=";" '{print $2}' file
3,4
Ou avec OFS (séparateur de champs de sortie):
$ echo "2 3" | awk -v OFS="--" '{print $1, $2}'
2--3
$ echo "2 3" | awk -v OFS="+" '{print $1, $2}'
2+3
Passer des paramètres à un programme en utilisant l'option -v
L'option -v suivie d'une affectation de la forme variable = valeur peut être utilisée pour transmettre des paramètres à un programme awk . Ceci est illustré par le programme de punition ci-dessous, dont le travail consiste à écrire le nombre de fois la phrase «Je ne parlerai pas en classe» sur la sortie standard. L'exemple suivant utilise la valeur 100, qui est très populaire parmi les enseignants:
awk -v count=100 'BEGIN {
for(i = 1; i <= count; ++i) {
print("I shall not talk in class.")
}
exit
}'
Il est possible de passer plusieurs paramètres avec l'utilisation répétée de l' -v :
awk -v count=100 -v "sentence=I shall not talk in class." 'BEGIN {
for(i = 1; i <= count; ++i) {
print(sentence)
}
exit
}'
Il n'y a pas de prise en charge intégrée des paramètres de tableau ou de liste, ceux-ci doivent être gérés manuellement. Une approche classique pour passer un paramètre de liste est de concaténer la liste en utilisant un séparateur, les choix populaires sont : , | ou , . La fonction split permet alors de récupérer la liste sous forme de tableau 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
}'
La sortie de ce programme awk est
list: 1: a
list: 2: b
list: 3: c
list: 4: d
list: 5: e
list: 6: f
Parfois, il est plus pratique de récupérer des éléments de liste en tant que clés d'un tableau awk , car cela permet une vérification facile de l'adhésion. Par exemple, le programme suivant imprime chaque ligne dont le premier mot n'appartient pas à une liste fixe d'exceptions:
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
La sortie de ce programme est
pineapple Do you like pineapple?
Comme dernier exemple, nous montrons comment envelopper le programme de punition dans un script shell, car cela illustre comment un script shell transmet des paramètres à un script awk auxiliaire:
#!/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
}'
Variables locales
Le langage awk ne supporte pas directement les variables locales aux fonctions. Il est cependant facile de les émuler en ajoutant des arguments supplémentaires aux fonctions. Il est traditionnel de préfixer ces variables par un _ pour indiquer qu'elles ne sont pas des paramètres réels.
Nous illustrons cette technique avec la définition d'une fonction single_quote qui ajoute des guillemets simples autour d'une chaîne:
# 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);
}
L'approche plus simple consistant à utiliser sprintf("'%s'", text) pose des problèmes pratiques car les scripts awk sont généralement transmis sous forme d'arguments entre guillemets simples au programme awk .
Arguments d'affectation
Les arguments d'affectation apparaissent à la fin d'une invocation awk , dans la même zone que les variables de fichier, les affectations -v et -v doivent correspondre à l'expression régulière suivante. (en supposant une locale POSIX)
^[[:alpha:]_][[:alnum:]_]*=
L'exemple suivant suppose un fichier file contenant ce qui suit: 1 2 3 (espace blanc séparé)
$ awk '{$1=$1}1' file OFS=, file OFS=- file
1 2 3
1,2,3
1-2-3