2017-11-01 6 views
0

Ich versuche, den folgenden Befehl zu verwenden:Wie verwendet man Variablen in diesem awk Befehl?

awk '/dev-api2\.company-private/{p=NR} p && NR==p+2 && /^HostName/{ 
$0="HostName 1.1.1.1"; p=0} 1' ~/.ssh/config > $$.tmp && mv $$.tmp ~/.ssh/config 

von this SO question genommen.

Nun möchte Ich mag die folgenden ersetzen:

dev-api2 with $shn 
1.1.1.1 with $privateip 

Aber jetzt, wenn ich den awk-Befehl ausführen tut es nichts.

Dies sind die Werte der Variablen:

shn=dev-api2 
privateip=3.3.3.3 

Antwort

2

Sie müssen eine dynamische Regex verwenden statt einer wörtlichen:

awk -v shn="$shn" -v privateip="$privateip" ' 
    $0 ~ shn "\\.company-private" { p = NR } 
    p && NR == p + 2 && /^HostName/ { $0 = "HostName " privateip; p = 0 } 1' 

Statt /regex/ verwenden $0 ~ "string". Der String wird in einen regulären Ausdruck ausgewertet und umgesetzt werden, so müssen Sie \\.

-1

Verwenden Sie \ "zu entkommen verdoppeln:

awk "/dev-api2\.company-private/{p=NR} p && NR==p+2 && /^HostName/{ 
$0=\"HostName 1.1.1.1\"; p=0} 1" ~/.ssh/config > $$.tmp && mv $$.tmp 
~/.ssh/config 
+1

nie um ein Skript in UNIX verwenden doppelte Anführungszeichen Es öffnet sich Ihr ganzes Skript. Die Shell für die Interpretation, die sie fragil macht und ihre Ausgabe von der Umgebung abhängig ist, in der sie ausgeführt wird. Wenn Sie einen Befehl 'cmd' haben, der ein Skript als Argument akzeptiert und eine Shell-Variable darin expandieren soll t scheinen sogar hier so idk zu tun, was du versucht hast passieren zu lassen), dann schreibst du es als 'cmd 'foo' '$ var' 'bar'', nicht' cmd 'foo $ {var} bar" 'Aber das würdest du nie mit einem awk-Skript machen. –

Verwandte Themen