Antwort
Eine Shell-Variable ist genau das: eine Shell Variable . Wenn Sie daraus eine awk -Variable machen möchten, benötigen Sie eine Syntax wie:
awk -v x="$x" "$2 == x {print $1}" infile oder
awk "$2 == x {print $1}" x="$x" infile  Diese leiden jedoch unter einem Problem: Escape-Sequenzen werden in ihnen erweitert (und mit GNU awk 4.2 oder höher,  wenn $x mit @/ beginnt und mit / wird als regexp-Variablentyp behandelt ). 
 Wenn die Shell-Variable beispielsweise die beiden Zeichen  backslash  und  enthält n  enthält die awk-Variable am Ende das Zeichen  newline  (und bei gawk 4.2+, wenn sie @/foo/ enthält, enthält die awk-Variable Enthält foo und ist vom Typ regexp). 
Ein anderer Ansatz (der jedoch ein POSIX awk oder nawk erfordert ( im Gegensatz zum ursprünglichen awk, wie es immer noch auf einigen ungeraden Unices zu finden ist)) werden Umgebungsvariablen verwendet:
Ein anderer Ansatz (immer noch mit neueren awks) besteht darin, das ARGV-Array in awk zu verwenden:
awk "BEGIN {x = ARGV[1]; delete ARGV[1]} $2 == x {print $1}" "$x" infile Kommentare
-  Soweit ich weiß, ist ARGVtatsächlich eine POSIX-Funktion, ' s nur ingawkanders definiert.
-  @ChrisDown Ja, sowohl ARGVals auchENVIRONsind POSIX, aber nicht im Original-Awk. Tut mir leid, wenn ich ' darüber nicht klar war. Wie unterscheidet es sich ingawk?
-  gawkenthält nicht erkannte Optionen inARGV, während POSIXawknicht ' t.
-  @ChrisDown, ich denke, Sie ' bezieht sich auf den Fall, in dem awk mit -faufgerufen wird, wie inawk -f script.awk arg1 arg2..., wo GNU awk nicht ' benötigt kein--, um das Ende der Optionen zu markieren, wenn arg1 mit einem-beginnt, dies aber ist Keine gültige Option in dieser bestimmten Version vonawk. Aber das ' ist für diese Angelegenheit nicht relevant, und ich würde mich definitiv nicht auf dieses Verhalten verlassen (ich würde trotzdem das--einschließen).
Antwort
 In awk direkt müssen Sie sie zuerst als awk -Variablen importieren. 
x=3 awk -v foo="$x" "$2=foo{print $1}" infile