Shell-Variablen in awk
kann auf verschiedene Arten erfolgen. Einige sind besser als andere. Dies sollte die meisten von ihnen abdecken. Wenn Sie einen Kommentar haben, hinterlassen Sie bitte unten. v1.5
Verwenden -v
(Der beste Weg, am tragbarsten)
Verwenden Sie die -v
Option: (PS verwenden ein Leerzeichen nach -v
oder es wird weniger portabel sein. ZB awk -v var=
nicht awk -vvar=
)
variable="line one\nline two"
awk -v var="$variable" 'BEGIN {print var}'
line one
line two
Dies sollte mit den meisten kompatibel sein awk
, und die Variable ist auch im BEGIN
Block verfügbar :
Wenn Sie mehrere Variablen haben:
awk -v a="$var1" -v b="$var2" 'BEGIN {print a,b}'
Warnung . Wie Ed Morton schreibt, werden Escape-Sequenzen so interpretiert, dass sie \t
real werden tab
und nicht, \t
wenn Sie danach suchen. Kann durch Verwendung ENVIRON[]
oder Zugriff über gelöst werdenARGV[]
PS Wenn Sie drei vertikale Balken als Trennzeichen mögen |||
, können diese nicht maskiert werden. Verwenden Sie sie daher-F"[|][|][|]"
Beispiel zum Abrufen von Daten von einem Programm- / Funktions-Gasthaus an awk
(hier wird das Datum verwendet)
awk -v time="$(date +"%F %H:%M" -d '-1 minute')" 'BEGIN {print time}'
Variable nach Codeblock
Hier erhalten wir die Variable nach dem awk
Code. Dies funktioniert einwandfrei, solange Sie die Variable im BEGIN
Block nicht benötigen :
variable="line one\nline two"
echo "input data" | awk '{print var}' var="${variable}"
or
awk '{print var}' var="${variable}" file
- Hinzufügen mehrerer Variablen:
awk '{print a,b,$0}' a="$var1" b="$var2" file
- Auf diese Weise können wir auch
FS
für jede Datei ein anderes Feldtrennzeichen festlegen .
awk 'some code' FS=',' file1.txt FS=';' file2.ext
- Variable nach dem Codeblock funktioniert nicht für den
BEGIN
Block:
echo "input data" | awk 'BEGIN {print var}' var="${variable}"
Here-String
Eine Variable kann auch zur awk
Verwendung einer Here-Zeichenfolge aus Shells hinzugefügt werden , die sie unterstützen (einschließlich Bash):
awk '{print $0}' <<< "$variable"
test
Dies ist das gleiche wie:
printf '%s' "$variable" | awk '{print $0}'
PS Dies behandelt die Variable als Dateieingabe.
ENVIRON
Eingang
Während TrueY schreibt, können Sie ENVIRON
mit Umgebungsvariablen drucken . Wenn Sie eine Variable festlegen, bevor Sie AWK ausführen, können Sie sie wie folgt ausdrucken:
X=MyVar
awk 'BEGIN{print ENVIRON["X"],ENVIRON["SHELL"]}'
MyVar /bin/bash
ARGV
Eingang
Wie Steven Penny schreibt, können Sie verwenden ARGV
, um die Daten in awk zu bringen:
v="my data"
awk 'BEGIN {print ARGV[1]}' "$v"
my data
Um die Daten in den Code selbst zu übertragen, nicht nur den BEGIN:
v="my data"
echo "test" | awk 'BEGIN{var=ARGV[1];ARGV[1]=""} {print var, $0}' "$v"
my data test
Variable innerhalb des Codes: USE WITH CAUTION
Sie können eine Variable im awk
Code verwenden, diese ist jedoch unübersichtlich und schwer zu lesen. Wie bereits erwähnt Charles Duffy
, ist diese Version möglicherweise auch Opfer einer Code-Injektion. Wenn jemand der Variablen schlechtes Material hinzufügt, wird es als Teil des awk
Codes ausgeführt.
Dies funktioniert durch Extrahieren der Variablen innerhalb des Codes, sodass sie ein Teil davon wird.
Wenn Sie eine awk
erstellen möchten, die sich bei Verwendung von Variablen dynamisch ändert, können Sie dies auf diese Weise tun, aber NICHT für normale Variablen verwenden.
variable="line one\nline two"
awk 'BEGIN {print "'"$variable"'"}'
line one
line two
Hier ist ein Beispiel für die Code-Injection:
variable='line one\nline two" ; for (i=1;i<=1000;++i) print i"'
awk 'BEGIN {print "'"$variable"'"}'
line one
line two
1
2
3
.
.
1000
Sie können auf awk
diese Weise viele Befehle hinzufügen . Lassen Sie es sogar mit ungültigen Befehlen abstürzen.
Zusatzinformation:
Verwendung von doppelten Anführungszeichen
Es ist immer gut, die Variable in doppelte Anführungszeichen zu setzen. "$variable"
Wenn nicht, werden mehrere Zeilen als lange einzelne Zeile hinzugefügt.
Beispiel:
var="Line one
This is line two"
echo $var
Line one This is line two
echo "$var"
Line one
This is line two
Andere Fehler, die Sie ohne doppeltes Anführungszeichen erhalten können:
variable="line one\nline two"
awk -v var=$variable 'BEGIN {print var}'
awk: cmd. line:1: one\nline
awk: cmd. line:1: ^ backslash not last character on line
awk: cmd. line:1: one\nline
awk: cmd. line:1: ^ syntax error
Bei einfachen Anführungszeichen wird der Wert der Variablen nicht erweitert:
awk -v var='$variable' 'BEGIN {print var}'
$variable
Weitere Informationen zu AWK und Variablen
Lesen Sie diese FAQ .