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

时间:2018-03-29 13:31:25

标签: awk

我正在使用以下/bin/sh代码来解析apt show的输出,并仅打印与第二个模式匹配的包的名称,但它不起作用。相反,它会在print中输出模式本身,就像从未分配变量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

我做错了什么?

2 个答案:

答案 0 :(得分:2)

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的值不以数字开头,因此数字值为零,然后您应用$"运算符"获取$0或整个字符串

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

答案 1 :(得分:0)

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;
    }
  '