awk不';t赋值变量并使用$0

awk不';t赋值变量并使用$0,awk,Awk,我正在使用下面的/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:

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


我做错了什么?

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不要求变量名前面有
$
:)您的代码应该如下所示:

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类似于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

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

不要将$放在变量名()前面。尝试使用不带
$
符号的pac变量不要将$放在变量名()前面。尝试使用不带
$
符号的pac变量