如何在这个awk命令中使用变量?

时间:2017-11-01 12:02:34

标签: variables awk

我正在尝试使用以下命令:

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

取自this SO question

现在我想替换以下内容:

dev-api2 with $shn
1.1.1.1 with $privateip

但是现在当我运行awk命令时它什么也没做。

这些是变量的值:

shn=dev-api2
privateip=3.3.3.3

2 个答案:

答案 0 :(得分:2)

您需要使用动态正则表达式而不是文字正则表达式:

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

而不是/regex/,请使用$0 ~ "string"。该字符串将被评估并转换为正则表达式,因此您需要双重转义\\.

答案 1 :(得分:-1)

使用\“:

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