
Mir ist ein awk
Beispiel von O'Reilly (1997) aufgefallen, bei dem eine awk-Variable zugewiesen wurde, indem sie in der Befehlszeile festgelegt wurdenachder Programmtext. Es funktioniert, aber ich kann diese Syntax nicht finden inMann / Info awk. Habe ich es einfach übersehen? Ist es veraltet...? Die einzige Syntax, die ich im Handbuch gesehen habe, ist die -v
Option.
awk '/home/{print foo, bar}' foo="cat" bar="dog" /proc/$$/cmdline
Ausgabe:cat dog
Antwort1
Es ist eigentlich in POSIXawk
(Link zu POSIX 2008, frühere Versionen hatten es glaube ich auch). -v
ist beschrieben in derOptionenAbschnitt, der andere Weg ist in derOperandenAbschnitt.
Es besteht ein Unterschied zwischen -v
der Übergabe der Zuweisungen am Ende mit den Dateinamen:
- Mit
-v
:
Die Anwendung muss sicherstellen, dass das Zuweisungsargument die gleiche Form hat wie ein Zuweisungsoperand. Die angegebene Variablenzuweisung muss erfolgenvor der Ausführung des awk-Programms, einschließlich der mit BEGIN-Mustern verbundenen Aktionen(falls vorhanden). Diese Option kann mehrfach angegeben werden.
- Mit den Dateinamen vermischt:
[...] Jede solche Variablenzuweisung erfolgtunmittelbar vor der Verarbeitung der folgenden Datei, falls vorhanden. Daher soll eine Zuweisung vor dem ersten Dateiargument nach den BEGIN-Aktionen (falls vorhanden) ausgeführt werden, während eine Zuweisung nach dem letzten Dateiargument vor den END-Aktionen (falls vorhanden) erfolgen soll. Wenn keine Dateiargumente vorhanden sind, sollen Zuweisungen vor der Verarbeitung der Standardeingabe ausgeführt werden.
Beispiel:
$ cat input
hello
hello
$ awk -v var=one 'BEGIN{print var} /hello/{print var} END{print var}' \
var=two input var=three input var=four
one
two
two
three
three
four
Antwort2
Dies ist eine alte Methode, Variablen extern in festzulegen awk
. Sie war mehrdeutig (was, wenn Sie einen Dateinamen mit dem Namen hatten foo=cat
), daher wurde in späteren Versionen eine -v
Option hinzugefügt. Sie sollte wahrscheinlich aus Gründen der Abwärtskompatibilität funktionieren, aber Sie können dies nicht garantieren. Und wie gesagt, die -v
Option ist neuer, daher awk
werden sie möglicherweise nicht von allen Versionen unterstützt.