新手在这里。我正在尝试使用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"/
?这里强引用和弱引用有什么区别?
答案 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 ";"
。
然而,它可能不是最好的方法,但我不能说因为没有提供上下文。