首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在awk printf中使用变量不起作用?

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

Stack Overflow用户
提问于 2013-04-06 01:43:40
回答 1查看 4.4K关注 0票数 0

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

代码语言:javascript
复制
#!/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文件的内容是

代码语言:javascript
复制
boundary
{
    inlet
    {
        type            fixedValue;
        value           uniform (5 0 0);
    }

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

    ....
} 

我希望输出类似这样的内容

代码语言:javascript
复制
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"/?这里的强报价和弱报价有什么区别?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-06 01:50:41

您清理的代码应该是:

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

备注:

  • 不要玩弄外壳扩展和引用,这真的很让人头疼。用-v.
  • You很好地传递任何外壳变量,需要用逗号分隔参数给printf
  • 始终引用您的外壳变量!
  • 您应该在awk脚本中而不是在shell中执行gsub(/;/,"")

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15840182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档