2010-12-23 21 views
8

ich dies nur versucht haben, aus meinem Shell-Skript und das Ergebnis wurde als nichtVerwenden bash Variable aus AWK

bestimmt
REF=SEARCH_TEXT 
echo "some text" | awk '/$REF/{print $2}' 

Es ist nicht das finden $ REF auch mit Text enthielt es

vorschlagen!

+0

mögliche Duplikate von [Übergabe einer Shell-Skript-Variable an einen awk-Befehl] (http://superuser.com/questions/203819/passing-a-shell-script-variable-into-an-awk-command) – ephemient

Antwort

15

Sie Frage lautet wirklich schlecht ...

Wie auch immer, ich glaube, Sie wollen diese:

REF=SEARCH_TEXT 
echo "some text" | awk "/$REF/{print \$2}" 

Hinweis Das entweichende von $2 und die doppelten Anführungszeichen.

oder dies:

REF=SEARCH_TEXT 
echo "some text" | awk "/$REF/"'{print $2}' 

Notiere die vernünftige Nutzung doppelte und einfache Anführungszeichen und kein Entkommen auf $2.

Sie haben Shell-Erweiterung zu verwenden, da sonst wäre es ein Shell-Variable umfassen exportieren und aus der Umgebung mit awk mit - die Overkill in dieser Situation ist:

export REF=SEARCH_TEXT 
echo "some text" | awk '{if (match($0, ENVIRON["REF"])) print $2}' 

Ich denke, awk tut unterstützt keine Variablen in /.../ guards. Bitte korrigieren Sie mich, wenn ich falsch liege.

+0

$ 2 funktioniert gut mit und ohne die \. Die Frage ist über $ REF, die von awk nicht ausgegeben wird. thx – vehomzzz

+0

@Fritschy: Für viele Menschen, die das Internet nutzen, ist Englisch nicht ihre Muttersprache; Manche Leute benutzen Google, um ihre Frage zu übersetzen. ;-) –

+0

vehomzzz, wenn ich doppelte Anführungszeichen benutze - was ich in Roder vorgeschlagen habe, damit die Shell '$ REF' korrekt expandiert, musst du' $ 2' entkommen lassen - beende die Shell daran, sie zu erweitern. –

36

Statt zitieren Spiele in der Shell die -v Option, um den Shell-Variable als awk-Variable übergeben:

awk -v ref="$REF" 'match($0, ref) {print $2}' 

Wenn $REF nur Text und keine regulärer Ausdruck, verwenden Sie die index() Funktion statt von match().

+0

Interessant, Glenn. Danke für das Teilen. –

+5

+1 - '-v' ist der richtige Weg, dies zu tun. –

+0

Können Sie mich bitte beraten, wie das in meinem Fall zu tun? links = 1; rechts = 4; grep ETM21CH01EPU3Z -A1 SLf_454.fna | Schwanz -n 1 | awk '{print substr ($ 0,1,4)}' funktioniert und gibt GTTG aus, aber die Version mit Variablen nicht, danke: left = 1; rechts = 4; grep ETM21CH01EPU3Z -A1 SLf_454.fna | Schwanz -n 1 | awk -v l = "$ links" r = "$ rechts" '{drucke substr ($ 0, l, r)}' awk: cmd. line: 1: fatal: kann die Datei '{print substr ($ 0, l, r)}} zum Lesen nicht öffnen – Perlnika

1

In gawk haben Sie die ENVIRON-Array, z. awk 'END{print ENVIRON["REF"]}' /dev/null wird Ihre Variable drucken, wenn Sie export es aus der Shell zu Unterprozesse ausgegeben haben.

+0

Das funktioniert auch (und die Variable muss nicht exportiert werden, wenn Sie' REF = Wert awk '...' ') eingeben. Aber ich würde den '-v' Schalter als allgemeine Lösung empfehlen. – dubiousjim