【问题标题】:How to use variables in this awk command?如何在这个 awk 命令中使用变量?
【发布时间】:2017-11-01 20:14:16
【问题描述】:

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

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

【问题讨论】:

    标签: variables awk


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      使用\":

      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
      

      【讨论】:

      • 永远不要在 UNIX 中的脚本周围使用双引号。它将整个脚本打开到 shell 以进行解释,这使得它变得脆弱,并且它的输出取决于你运行它的环境。如果您有一个命令 cmd 将脚本作为参数,并且您希望在其中扩展一个 shell 变量(您似乎在这里甚至没有这样做,所以 idk 是您想要实现的),那么您;d 将其写为 cmd 'foo'"$var"'bar',而不是 cmd "foo${var}bar",但你永远不会使用 awk 脚本。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-28
      • 1970-01-01
      • 1970-01-01
      • 2016-01-14
      • 2019-01-17
      • 2014-04-29
      • 1970-01-01
      相关资源
      最近更新 更多