AWK中的Substr在Ubuntu中返回空行

kro*_*ynx 1 bash awk

我在使用AWK的这条线时遇到问题

apt-cache policy fish | awk '/Candidate/ {print substr($2, 0, 1)}'
Run Code Online (Sandbox Code Playgroud)

在使用Ubuntu的计算机上,18.10我得到了3预期的结果,但是在使用Ubuntu的另一台计算机上,18.04我得到了empty一条代码。

在Ubuntu 18.04中:

j@minimal:~$ apt-cache policy fish | awk '/Candidate/ {print $2}'
2.7.1-3
j@minimal:~$ apt-cache policy fish | awk '/Candidate/ {print substr($2, 0, 1)}'

j@minimal:~$ 
Run Code Online (Sandbox Code Playgroud)

在Ubuntu中 18.10

krono@vulcania:~$ apt-cache policy fish | awk '/Candidate/ {print $2}'
3.0.2-1~cosmic
krono@vulcania:~$ apt-cache policy fish | awk '/Candidate/ {print substr($2, 0, 1)}'
3
krono@vulcania:~$
Run Code Online (Sandbox Code Playgroud)

为什么在Ubuntu 18.04中我得到一个空行而不是2

ogu*_*ail 5

POSIX awk规范定义substr如下:

substr(s,m [,n])

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

这意味着您的脚本不正确;字符串中不存在零位置。Ubuntu 18.04使用了旧版本的mawk,它不能处理这种用法substr(尽管在其他版本中已修复,请参见mawk changelog#20090726)作为默认实现。因此,您需要使用:

substr($2,1,1)
Run Code Online (Sandbox Code Playgroud)