awk(和 gawk):当 N 个输入文件中的 1 个不可读时如何避免致命错误

Oli*_*lac 4 awk

测试用例:(使用非 root 用户,因为 root 会忽略 000 权限...)

#in a clean directory:
[ -f file_1 ] && chmod 600 file_? # for repeat tests...
for i in file_1 file_2 file_3; do
    printf 'A\nB\n' > "$i" 
    # we need at least 1 char : awk/gawk silently skips empty files...
done
chmod 000 file_2
awk '(FNR==1) { print FILENAME }' file_? 
  # tried with : regular (old unixes) awk on AIX. and gawk on Linux.
  # the fatal "permission denied" on file_2 stops [g]awk.
Run Code Online (Sandbox Code Playgroud)

有没有办法捕获该致命错误并继续处理下一个文件?

(否则我觉得这很令人担忧:对一堆文件使用 awk 并不能保证处理所有文件,因为如果其中任何一个文件不可读,它将致命地退出)

如果可以的话请:回答

  • 对于常规 awk,
  • 和傻瓜
  • 还有其他相关的 awk 版本吗?(诺克?等)

Ste*_*itt 9

与 GAWK 一起:

\n
gawk \'BEGINFILE { if (ERRNO) nextfile } (FNR==1) { print FILENAME }\' file_?\n
Run Code Online (Sandbox Code Playgroud)\n

BEGINFILE块中,ERRNO如果文件打开成功,则为空nextfile,可用于跳到下一个并避免因错误而退出。

\n

我不认为\xe2\x80\x99t 认为 AWK 的其他实现支持这一点。

\n

可移植的是,您可以迭代所有参数,检查它们是否指向不可读的文件,如果是,则在 AWK 开始处理它们之前将它们从参数中删除;GAWK 手册有一个示例实现。然而,这是很危险的,因为使用此循环检查的文件可能在 AWK 开始处理它之前变得不可读(反之亦然)。

\n