awk不分配变量并使用$ 0代替

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了awk不分配变量并使用$ 0代替相关的知识,希望对你有一定的参考价值。

我正在使用以下/bin/sh代码来解析apt show的输出并仅打印与第二个模式匹配的包的名称,但它不起作用。相反,它在prints中输出模式本身,好像变量pac从未被分配,而是在所有情况下使用$0

apt show vim peazip 2> /dev/null | 
  awk '
    /^Package:/ {
      pac = substr($0, 10);
      print "found name "$pac;
    }
    /APT-Sources: /var/lib/dpkg/status/ {
      print "bingo "$pac;
    }
  '

输出:(在Ubuntu上gawk)

found name Package: vim
found name Package: peazip:i386
bingo APT-Sources: /var/lib/dpkg/status

我究竟做错了什么?

答案

awk是C类的,因为你不使用$来获取变量的值:

$ awk 'BEGIN { x=42; print x }'
42

我认为awk中的$是一个运算符,它获取$后面的表达式所标识的字段数的值。例如,第二个字段是$2,最后一个字段是$NF,其中NF是一个变量,其值是当前记录中的字段数。

现在,为什么$pac表现得像$0

awk,在数字上下文中,像这样处理任意字符串:取字符串,在第一个非数字字符处截断它;如果截断结果为空字符串,则将字符串数字处理为零。

$ echo "foo bar" | awk '{x="2cats"; print $x}'
bar

pac的值不是以数字开头,因此数字值为零,然后你应用$“operator”来获取$0或整个字符串

$ echo "foo bar" | awk '{x="no-cats"; print $x}'
foo bar
另一答案

awk在变量名前面不需要$ :)你的代码应该是这样的:

apt show vim peazip 2> /dev/null | 
  awk '
    /^Package:/ {
      pac = substr($0, 10);
      print "found name "pac;
    }
    /APT-Sources: /var/lib/dpkg/status/ {
      print "bingo "pac;
    }
  '

以上是关于awk不分配变量并使用$ 0代替的主要内容,如果未能解决你的问题,请参考以下文章

将AWK结果分配给变量[重复]

将shell命令的输出分配给变量[重复]

将变量分配给 cut -f 字段

在 awk 中删除一个变量

js书写规范

期望脚本:获取 bash 命令的输出并设置变量