Bash AWK中的Substr在Ubuntu中返回空行

Bash AWK中的Substr在Ubuntu中返回空行,bash,awk,Bash,Awk,我对这条使用AWK的线路有问题 apt缓存策略fish | awk'/Candidate/{print substr($2,0,1)} 在一台使用Ubuntu18.10的机器上,我得到了预期的结果3,但在另一台使用Ubuntu18.04的机器上,我得到了一行空的代码 在Ubuntu 18.04中: j@minimal:~$apt缓存策略鱼| awk'/Candidate/{print$2}' 2.7.1-3 j@minimal:~$apt缓存策略fish | awk'/Candidate/{p

我对这条使用AWK的线路有问题

apt缓存策略fish | awk'/Candidate/{print substr($2,0,1)}
在一台使用Ubuntu
18.10
的机器上,我得到了预期的结果
3
,但在另一台使用Ubuntu
18.04
的机器上,我得到了一行
空的代码

在Ubuntu 18.04中:

j@minimal:~$apt缓存策略鱼| awk'/Candidate/{print$2}'
2.7.1-3
j@minimal:~$apt缓存策略fish | awk'/Candidate/{print substr($2,0,1)}'
j@minimal:~$ 
在Ubuntu中
18.10

krono@vulcania:~$apt缓存策略鱼| awk'/Candidate/{print$2}'
3.0.2-1~宇宙
krono@vulcania:~$apt缓存策略fish | awk'/Candidate/{print substr($2,0,1)}'
3.
krono@vulcania:~$
为什么在Ubuntu18.04中我得到一个空行而不是
2

定义
substr
,如下所示:

substr(s,m[,n])

返回从位置m开始的最多n个字符的s子字符串,编号从1开始

这意味着,你的脚本是不正确的;字符串中没有零这样的位置。Ubuntu 18.04使用了一个旧版本的mawk,它不能处理
substr
的这种用法(不过在以后的版本中已经修复了,请参阅)作为默认实现。因此,您需要使用:

substr($2,1,1)
定义
substr
,如下所示:

substr(s,m[,n])

返回从位置m开始的最多n个字符的s子字符串,编号从1开始

这意味着,你的脚本是不正确的;字符串中没有零这样的位置。Ubuntu 18.04使用了一个旧版本的mawk,它不能处理
substr
的这种用法(不过在以后的版本中已经修复了,请参阅)作为默认实现。因此,您需要使用:

substr($2,1,1)

在我18.04的时候很好用。我使用的是GNU awk 4.1.4。我没有Ubuntu,但试着在18.04第二段代码中更改一下
substr($0,1,1)
?如果它的索引从1开始,我怀疑apt缓存结果在每个环境中都是不同的。尝试发布中间结果-例如,
apt cache policy fish | awk'/Candidate/'
在我的18.04上运行良好。我使用的是GNU awk 4.1.4。我没有Ubuntu,但试着在18.04第二段代码中更改一下
substr($0,1,1)
?如果它的索引从1开始,我怀疑apt缓存结果在每个环境中都是不同的。尝试发布中间结果-例如
apt cache policy fish | awk'/Candidate/'