awk-测试打印是否成功

时间:2018-10-26 14:05:11

标签: function awk printing status

print中的awk语句可能无法成功的原因有几个:没有写指定文件的权限,文件不存在,awk无法创建它,等等。如何测试awk print语句的成功?我尝试了以下方法:

$ cat printError.awk
BEGIN {
    if (! (print("Hello") > "/this/doesnt/exist")) {
        print "Could not print"
    }
}

但是它会带来语法错误,我认为是因为print是语句而不是函数。

$ awk -f printError.awk 
awk: printError.awk:2:  if (! (print("Hello") > "/this/doesnt/exist")) {
awk: printError.awk:2:         ^ syntax error
awk: printError.awk:2:  if (! (print("Hello") > "/this/doesnt/exist")) {
awk: printError.awk:2:                                               ^ syntax error
awk: printError.awk:2:  if (! (print("Hello") > "/this/doesnt/exist")) {
awk: printError.awk:2:                                                 ^ syntax error

编辑: 我找到了适用于gawk 4.2+的解决方案,但是我正在使用的环境只有4.0,因此我仍在寻找该版本的解决方案。

1 个答案:

答案 0 :(得分:4)

对于gawk 4.2,答案在这里:https://www.gnu.org/software/gawk/manual/html_node/Nonfatal.html。但是,似乎PROCINFO [“ NONFATAL”]在较早的版本中不存在。

  

5.10启用非致命输出

     

本节介绍了gawk特有的功能。

     

在标准awk中,将带有print或printf的输出输出到不存在的文件中,或者   其他一些I / O错误(例如,填满磁盘)是致命错误。

     

$ gawk'BEGIN {print“ hi”>“ / no / such / file”}'错误→gawk:cmd。   行:1:致命:无法重定向到`/ no / such / file'(无错误→这样的文件   或目录)

     

gawk可以检测到已发生错误,从而允许   您可能会从错误中恢复,或者至少打印错误   您退出之前选择的消息。您可以选择以下两种方法之一   方式:

For all output files, by assigning any value to PROCINFO["NONFATAL"].
On a per-file basis, by assigning any value to PROCINFO[filename, "NONFATAL"]. Here, filename is the name of the file to which you wish
     

输出是非致命的。

     

启用非致命输出后,必须在之后检查ERRNO   每个相关的print或printf语句以查看是否有问题   错误。将ERRNO初始化为零也是一个好主意   尝试输出

使用以下awk程序:

$ cat nonFatal.awk 
BEGIN {
    PROCINFO["NONFATAL"] = 1
    ERRNO = 0
    print "hi" > "/no/such/file"
    if (ERRNO) {
        print("Output failed:", ERRNO) > "/dev/stderr"
        exit 1
    }
}

该错误在gawk 4.0和4.1中仍然是致命的

$ gawk -f nonFatal.awk 
gawk: nonFatal.awk:4: fatal: can't redirect to `/no/such/file' (No such file or directory)

但是在gawk 4.2.1中它可以工作(我将gawk 4.2.1编译为gawk-4.2.1):

$ ./gawk-4.2.1 -f /var/tmp/nonFatal.awk 
Output failed: No such file or directory