Wie verwende ich Shell-Variablen in einem awk-Skript?
Fand ich einige Möglichkeiten zum übergeben von externen shell-Variablen zu einer awk
Skript, aber ich bin verwirrt über '
und "
.
Zuerst versuchte ich mit einem shell-Skript:
$ v=123test
$ echo $v
123test
$ echo "$v"
123test
Dann versuchte awk:
$ awk 'BEGIN{print "'$v'"}'
$ 123test
$ awk 'BEGIN{print '"$v"'}'
$ 123
Warum ist der Unterschied?
Schließlich habe ich versucht, dieses:
$ awk 'BEGIN{print " '$v' "}'
$ 123test
$ awk 'BEGIN{print ' "$v" '}'
awk: cmd. line:1: BEGIN{print
awk: cmd. line:1: ^ unexpected newline or end of string
Ich bin verwirrt darüber.
Kommentar zu dem Problem - Öffnen
Ich mag das -v wie unten gezeigt, aber das ist wirklich eine gute übung, darüber nachzudenken, wie die schützen, die Dinge aus der Schale. Arbeiten durch diese, meine erste schneiden Sie umgekehrte Schrägstriche verwenden, über Räume und dollar-Zeichen. Unnötig zu sagen, die Beispiele hier waren auch Wert, meine Zeit.
InformationsquelleAutor der Frage hqjma | 2013-09-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erste shell-Variablen in
awk
kann auf verschiedene Arten erfolgen. Einige sind besser als andere.Dies ist der beste Weg, es zu tun. Es verwendet die
-v
option: (P. S. ein Leerzeichen nach-v
oder es wird weniger tragbar. E. g.,awk -v var=
nichtawk -vvar=
)Diese sollte kompatibel sein mit den meisten
awk
und Variablen ist in derBEGIN
block:Mehrere Variablen
Hier bekommen wir die variable nach der
awk
code. Dies funktioniert gut, solange Sie nicht müssen Sie die variable in derBEGIN
block:Dies funktioniert auch mit mehreren Variablen
awk '{print a,b,$0}' a="$var1" b="$var2" file
Variablen können ebenfalls Hinzugefügt werden, um
awk
mit hier stringDies ist das gleiche wie:
PS, diese Bedrohungen der variable als Datei-input -
Als TrueY schreiben, können Sie die
ENVIRON
druckenEnvironmental Variables
Einstellung einer Variablen vor der Ausführung von AWK, Sie können es ausdrucken, wie hier:
Edit: Als "der andere" schreiben, ist dies nicht verarbeitet backslash. Nicht zu empfehlen.
Können Sie eine variable innerhalb der
awk
code, aber es ist chaotisch und schwer zu Lesen, und alsCharles Duffy
Punkte heraus, diese version kann auch ein Opfer von code-Injektion. Wenn jemand schlechte Sachen, um die variable, wird Sie ausgeführt, die als Teil derawk
code.Wenn Sie wollen ein
awk
dass ändert sich dynamisch mit der Verwendung von Variablen, können Sie es auf diese Weise bot verwenden Sie es NICHT für normale Variablen.Hier ist ein Beispiel von code-Injektion:
Können Sie hinzufügen, viele Befehle zu
awk
diese Weise. Einmal Absturz mit nicht gültigen Befehle.Es ist immer gut, um die doppelten Anführungszeichen Variablen
"$variable"
Wenn nicht, mehrere Zeilen Hinzugefügt werden, wie Sie einen einzigen langen Zeile.
Beispiel:
Anderen Fehler, die du bekommen kannst, ohne Anführungszeichen:
Und mit single-quote, bedeutet es nicht, erweitern Sie den Wert der Variablen:
InformationsquelleAutor der Antwort Jotne
Es scheint, dass die gute alte
ENVIRON
awk built-in hash wird gar nicht erwähnt. Ein Beispiel für die Verwendung:InformationsquelleAutor der Antwort TrueY
Verwenden Sie eine der folgenden, je nachdem wie Sie möchten, die Schrägstriche in der shell-Variablen behandelt (
avar
ist ein awk-variablesvar
ist eine shell-variable):Sehen http://cfajohnson.com/shell/cus-faq-2.html#Q24 für details und andere Optionen. Die erste obige Methode ist fast immer die beste option und hat die offensichtliche Semantik.
InformationsquelleAutor der Antwort Ed Morton
Könnte passieren in der Befehlszeilenoption
-v
mit dem Namen einer Variablen (v
) und einen Wert (=
) der environment-variable ("${v}"
):Oder um es klarer (mit weit weniger
v
s):InformationsquelleAutor der Antwort Johnsyweb
Können Sie nutzen, ARGV:
Beachten Sie, dass, wenn Sie gehen, um weiter in den Körper, werden Sie brauchen, anpassen
ARGC:
InformationsquelleAutor der Antwort Steven Penny
Musste ich das Datum am Anfang der Zeilen einer log-Datei und fertig wie unten:
Kann es umleiten zu einer anderen Datei zu speichern
InformationsquelleAutor der Antwort Sina
Ich gerade geändert @Jotne Antwort für "for-Schleife".
InformationsquelleAutor der Antwort edib