Gibt es zwei Möglichkeiten, AWK-Variablen über die Befehlszeile festzulegen?

Gibt es zwei Möglichkeiten, AWK-Variablen über die Befehlszeile festzulegen?

Mir ist ein awkBeispiel 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 -vOption.

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). -vist beschrieben in derOptionenAbschnitt, der andere Weg ist in derOperandenAbschnitt.

Es besteht ein Unterschied zwischen -vder Ü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 -vOption hinzugefügt. Sie sollte wahrscheinlich aus Gründen der Abwärtskompatibilität funktionieren, aber Sie können dies nicht garantieren. Und wie gesagt, die -vOption ist neuer, daher awkwerden sie möglicherweise nicht von allen Versionen unterstützt.

verwandte Informationen