如何抑制(g)awk兼容性警告?

时间:2013-05-25 13:35:43

标签: awk gawk

我想对gawk标准使用一些awk扩展名,例如mktime()。同时,我想使用选项--lint=fatal,因为我宁愿让进程失败而不是静默生成可能不正确的数据。但是,有些事我不明白:

$ gawk --lint=fatal 'BEGIN { foo = mktime("2013 01 01 12 00 00"); }' 
gawk: cmd. line:1: fatal: `mktime' is a gawk extension

指定选项--posix--traditional,因此gawk扩展名应该存在。一旦我降低了严格性(--lint=warning),脚本就可以了。为了使用严格的检查,我必须告诉gawk这样的东西我知道我正在使用你的扩展函数集并且我不再与原始awk兼容规范,我很好。我该怎么做?

2 个答案:

答案 0 :(得分:2)

这不能从awk本身完成。来自man gawk版本4.1。0,2013年5月9日:

  

- 棉绒[=值]

     

提供有关对其他AWK实现可疑或不可移植的构造的警告。带有可选参数   致命的                 lint警告成为致命错误。这可能是激烈的,但它的使用肯定会鼓励发展   更干净的AWK pro-                 克。使用invalid的可选参数,仅发出关于实际上无效的事物的警告。 (这是   没有充分                 已实施。)

您可以编写一个简单的包装器脚本来解析stderr并仅显示您想要查看的警告。

答案 1 :(得分:0)

我正在用这个包装纸包装鹰嘴豆

#! /bin/bash
AWK="/usr/bin/gawk --lint"
exec 3>&1
set -o pipefail
$AWK "$@" 2>&1 1>&3 | { grep -v 'is a gawk extension$' || test $? = 1; }

文件描述符3成为标准输出的副本。运行gawk时,其stdout进入复制的文件描述符(即stdout)。 gawk的stderr转到stdout并通过管道到达grep,然后grep输出发送回stderr。

如果gawk失败,由于pipefail选项,脚本将退出并显示错误代码。如果grep无法产生输出(即,它会滤除所有警告),则脚本仍会成功。对于其他grep错误,脚本会失败。

将包装器另存为PATH中gawkawk的位置,并确保该目录出现在PATH中/usr/bin之前。

现在您有了一个聪明的awk,它只警告您关心的问题。