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,因此我仍在寻找该版本的解决方案。
答案 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