awk
Variablen
Suche…
Zuweisung von Befehlszeilenvariablen
Um Variablen von der Kommandozeile aus zuzuweisen, kann -v verwendet werden:
$ awk -v myvar="hello" 'BEGIN {print myvar}'
hello
Beachten Sie, dass um das Gleichheitszeichen keine Leerzeichen stehen.
Dies erlaubt die Verwendung von Shell-Variablen:
$ shell_var="hello"
$ awk -v myvar="$shell_var" 'BEGIN {print myvar}'
hello
Außerdem können Sie integrierte Variablen festlegen, die awk steuern:
Siehe ein Beispiel mit FS (Feldtrennzeichen):
$ cat file
1,2;3,4
$ awk -v FS="," '{print $2}' file
2;3
$ awk -v FS=";" '{print $2}' file
3,4
Oder mit OFS (Ausgabefeldtrennzeichen):
$ echo "2 3" | awk -v OFS="--" '{print $1, $2}'
2--3
$ echo "2 3" | awk -v OFS="+" '{print $1, $2}'
2+3
Parameter mit der Option -v an ein Programm übergeben
Mit der Option -v gefolgt von einer Zuweisung der Formvariable = value können Parameter an ein awk- Programm übergeben werden. Dies wird durch das folgende Bestrafungsprogramm veranschaulicht, dessen Aufgabe darin besteht, Count- mal den Satz "Ich spreche nicht im Unterricht" auf die Standardausgabe zu schreiben. Im folgenden Beispiel wird der Wert 100 verwendet, der bei Lehrern sehr beliebt ist:
awk -v count=100 'BEGIN {
for(i = 1; i <= count; ++i) {
print("I shall not talk in class.")
}
exit
}'
Bei wiederholter Verwendung des Flag -v mehrere Parameter übergeben -v :
awk -v count=100 -v "sentence=I shall not talk in class." 'BEGIN {
for(i = 1; i <= count; ++i) {
print(sentence)
}
exit
}'
Es gibt keine integrierte Unterstützung für Array- oder Listenparameter. Diese müssen manuell gehandhabt werden. Ein klassischer Ansatz eine Liste Parameter zu übergeben ist , die Liste mit einem Trennzeichen, beliebte Wahl zu verketten ist : , | oder , . Die Split- Funktion ermöglicht es dann, die Liste als awk- Array wiederherzustellen:
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
}'
Die Ausgabe dieses awk- Programms ist
list: 1: a
list: 2: b
list: 3: c
list: 4: d
list: 5: e
list: 6: f
Manchmal ist es praktischer, Listenelemente als Schlüssel eines awk- Arrays wiederherzustellen, da dies eine einfache Überprüfung der Mitgliedschaft ermöglicht. Das folgende Programm druckt beispielsweise jede Zeile, deren erstes Wort nicht zu einer festen Liste von Ausnahmen gehört:
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
Die Ausgabe dieses Programms ist
pineapple Do you like pineapple?
Als letztes Beispiel zeigen wir, wie das Bestrafungsprogramm in ein Shell-Skript eingebunden wird, da dies veranschaulicht, wie ein Shell-Skript Parameter an ein zusätzliches awk- Skript übermittelt:
#!/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 Variablen
Die Sprache awk unterstützt keine lokalen Variablen direkt für Funktionen. Es ist jedoch leicht, sie durch Hinzufügen zusätzlicher Argumente zu Funktionen zu emulieren. Es ist üblich, diesen Variablen ein _ um anzuzeigen, dass es sich nicht um tatsächliche Parameter handelt.
Wir veranschaulichen diese Technik mit der Definition einer single_quote Funktion, die einen String in Anführungszeichen setzt:
# 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);
}
Die einfachere Vorgehensweise bei der Verwendung von sprintf("'%s'", text) führt zu praktischen Problemen, da awk- Skripts normalerweise als Argumente mit einfachen Anführungszeichen an das awk- Programm übergeben werden.
Zuweisungsargumente
Zuweisungsargumente werden am Ende eines awk Aufrufs in demselben Bereich wie Dateivariablen angezeigt. Sowohl -v Zuweisungen als auch Argumentzuweisungen müssen dem folgenden regulären Ausdruck entsprechen. (vorausgesetzt, ein POSIX-Gebietsschema)
^[[:alpha:]_][[:alnum:]_]*=
Im folgenden Beispiel wird davon ausgegangen , eine Datei - file folgendes enthalten: 1 2 3 (Leerraum getrennt sind )
$ awk '{$1=$1}1' file OFS=, file OFS=- file
1 2 3
1,2,3
1-2-3