bash - 为什么运行CentOS上可以运行的awk脚本,在Ubuntu上无法运行?

分享于 

5分钟阅读

ubuntu

  繁體

问题:

为什么CentOS上的简单的脚本不能在Ubuntu上运行?


[nsaunders@rolly awk]$ 


[nsaunders@rolly awk]$ awk -f loop.awk numbers.txt 


1 2 3 


1 2 3 4 5 6 7 


1 2 3 4 5 6 7 8 9 10 11 12 


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 



[nsaunders@rolly awk]$ 


[nsaunders@rolly awk]$ cat loop.awk 


func printlist(n) {


 for(i=1;i<=n;i++) {


 printf("%d ",i)


 }


 printf("n")


}



{printlist($1)}



[nsaunders@rolly awk]$ 


[nsaunders@rolly awk]$ cat numbers.txt 


3


7


12


15


16


31



[nsaunders@rolly awk]$ 



我得到:


awk: loop.awk: line 11: function printlist never defined


awk: loop.awk: line 11: function printlist never defined



Ubuntu上的awk版本:


mawk 1.3.4 20200120


Copyright 2008-2019,2020, Thomas E. Dickey


Copyright 1991-1996,2014, Michael D. Brennan



random-funcs: srandom/random


regex-funcs: internal


compiled limits:


sprintf buffer 8192


maximum-integer 2147483647



在CentOS机器上:


[nsaunders@rolly ~]$ 


[nsaunders@rolly ~]$ awk -W version


GNU Awk 4.2.1, API: 2.0 (GNU MPFR 3.1.6-p2, GNU MP 6.1.2)


Copyright (C) 1989, 1991-2018 Free Software Foundation.



This program is free software; you can redistribute it and/or modify


it under the terms of the GNU General Public License as published by


the Free Software Foundation; either version 3 of the License, or


(at your option) any later version.



This program is distributed in the hope that it will be useful,


but WITHOUT ANY WARRANTY; without even the implied warranty of


MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the


GNU General Public License for more details.



You should have received a copy of the GNU General Public License


along with this program. If not, see http://www.gnu.org/licenses/.


[nsaunders@rolly ~]$ 




答案1:

GNU Awk User'sGuide所述

在许多awk实现中,包括gawk,关键字function可以缩写为func,但是,POSIX只指定function关键字。

错误可能是因为,awk在Ubuntu系统上的实现是mawk,或者(例如POSIXLY_CORRECT环境变量)影响了gawk的行为。

Ubuntu使用mawk作为默认的awk,据我所知,所有当前支持的版本都默认使用gawk ,如果通过mawk packaqge管理系统安装了update-alternatives,就应该能够查询默认值。


update-alternatives --query awk



sudo update-alternatives --config awk




答案2:

在同一系统上可能有多个实现,gawk (GNU Awk )有许多不在mawk中的功能,

某些AWK实现不支持使用func作为function的缩写,为了解决这个问题,最好的方法是将func更改为function,更改后,你的脚本可以支持mawkgawk


gawk -f loop.awk numbers.txt



你可以使用update-alternativesawk解析为gawk

如果您愿意,可以在AWK脚本的顶部添加一个shebang行,标记脚本可执行文件(chmod + x loop.awk),则可以指定它应该使用哪种awk:


#!/usr/bin/awk -f



func printlist(n) {


 for(i=1;i<=n;i++) {


 printf("%d ",i)


 }


 printf("n")


}



{printlist($1)}



然后,使用命令运行脚本:


./loop.awk numbers.txt



则其他脚本保持不变。


Ubuntu  BASH  Centos  AWK  
相关文章