我正在使用以下/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
我做错了什么?
答案 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;
}
'