为什么在awk printf中使用变量不起作用?

时间:2013-04-05 17:43:40

标签: shell awk

新手在这里。我正在尝试使用awk打印一些信息。所以我写了一个shell脚本

#!/bin/bash

turbVar="U"
bcName="outlet"
str="$turbVar $bcName b.c. = "
# method-1
awk -v RS='}' '/'$bcName'/ { printf "%20s = %s\n" $str $4; exit;}' BCFile  | tr -d ";"
# method-2
awk -v RS='}' -v var1=$bcName '$0 ~ var1 { printf "%20s = %s\n" $str $4; exit;}' BCFile  | tr -d ";"

BCFile文件内容为

boundary
{
    inlet
    {
        type            fixedValue;
        value           uniform (5 0 0);
    }

    outlet
    {
        type            inletOutlet;
        inletValue      $internalField;
        value           $internalField;
    }

    ....
} 

我希望输出类似

的内容
U outlet b.c. = inletOutlet

可悲的是,这不起作用。它抱怨awk: (FILENAME=0/U FNR=4) fatal: not enough arguments to satisfy format string %20s = %s

为什么我不能在awk printf中使用$ str变量?

第二个问题,哪种方法更好?使用'/'$bcName'/或使用-v var1=$bcName '$0 ~ var1 ?,为什么我无法直接使用'/$bcName/'/"$bcName"/?这里强引用和弱引用有什么区别?

1 个答案:

答案 0 :(得分:2)

您清理的代码应为:

awk -v RS="}" -v v1="$bcName" -v s="$str" '$0~v1{gsub(/;/,"");printf "%s%s\n",s,$4;exit}' 
U outlet b.c. = inletOutlet

注意:

  • 不要玩shell扩展并引用它真的很头疼。使用-v很好地传入任何shell变量。

  • 您需要用逗号分隔printf的参数。

  • 总是引用你的shell变量!

  • 您应该在gsub(/;/,"")脚本中执行awk而不是tr -d ";"

然而,它可能不是最好的方法,但我不能说因为没有提供上下文。