awk不分配变量并使用$ 0代替
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了awk不分配变量并使用$ 0代替相关的知识,希望对你有一定的参考价值。
我正在使用以下/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上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代替的主要内容,如果未能解决你的问题,请参考以下文章