0

新手来了 我正在尝试使用 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 变量?

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

4

1 回答 1

3

您清理的代码应该是:

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 扩展并引用它是一个真正令人头疼的问题。用 .很好地传入任何 shell 变量-v

  • 您需要用逗号分隔printf.

  • 总是引用你的 shell 变量!

  • 您应该在脚本gsub(/;/,"")内部而不是.awktr -d ";"

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

于 2013-04-05T17:50:40.767 回答