【问题标题】:AWK passing variablesAWK 传递变量
【发布时间】:2018-07-20 12:31:46
【问题描述】:

我可以在下面的 awk 命令中以变量的形式给出 value(32) 而不是直接硬编码 32 吗?

df -h | head -1|awk '{printf "%s%32s",$1,$2}'

我试过awk -v var=32,但它不起作用。

谁能推荐我。

【问题讨论】:

  • its not working 是您可以给出的最糟糕的失败描述之一,通常会引起阅读它的每个人的呻吟。永远不要只说it's not working - 告诉我们它在什么方面不起作用。语法错误,错误输出,无输出,核心转储,还有什么?并准确地向我们展示你运行失败的脚本,不要只显示它的开始 - 我们不知道你在初始化之后对 var 做了什么,所以我们无法告诉你哪里出错了。
  • 他没有使用 shell 变量,并且他正在做正确的事情将 shell 值传递给 awk 脚本,问题在于他使用该变量所做的任何事情,他还没有向我们展示该代码.我怀疑问题是如何在 printf 格式化字符串中使用 awk 变量,而不是如何使用 shell 变量。

标签: shell unix awk


【解决方案1】:
awk -v var=32 '{printf "%s%*s\n", $1, var, $2}'

【讨论】:

  • 非常感谢莫顿,。它在 Linux 中工作,但在 Solaris 上尝试时相同,我收到错误。我可以知道原因吗?
  • Solaris 上的默认 awk 是旧的、损坏的 awk(又名“oawk”),绝对不能使用,因为它已经过时且损坏了。在 Solaris 上使用 /usr/xpg4/bin/awk 而不是默认的(在 /bin 或 /usr/bin 中,我不记得了),因为这是最接近现代 POSIX awk 的。不要试图使用 New AWK aka nawk,因为它只是与“oawk”相关的“新”。 nawk 本身非常老旧,缺乏 POSIX 功能。
【解决方案2】:
awk -v var=32 '{printf "%s%"var"s", $1,$2}'

注意:Ed Morton 的解决方案更简洁,因为它不使用 AWK 字符串连接,而是直接使用 printf 格式

同时,如果您想摆脱您的head,那么您可以将所有内容组合为:

$ df -h | awk -v var=32 '{printf "%s%"var"s", $1,$2; exit}'

【讨论】:

    【解决方案3】:

    如果您已将数字存储在环境变量中(例如:FIELD_WIDTH),则可以替代 Ed Morton 给出的答案。在这种情况下,

    df -h | head -1|awk '{printf "%s%" ENVIRON["FIELD_WIDTH"] "s",$1,$2}'
    

    会做的。

    更新:

    你也应该去掉head:

    df -h | awk 'NR==1 {printf "%s%" ENVIRON["FIELD_WIDTH"] "s",$1,$2}'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-28
      • 1970-01-01
      • 1970-01-01
      • 2018-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多