awk可以跳过不存在的文件,无种族?

时间:2008-10-20 00:21:32

标签: error-handling awk race-condition gawk

有没有办法让 awk (gawk)忽略或跳过丢失的文件?也就是说,文件系统中不再存在的命令行传递的文件(例如/ proc / [1-9] *下快速出现/消失的文件)。

默认情况下,丢失的文件是致命错误: - (

我希望能够做到这样的事情:

BEGIN { MISSING_FILES_ARE_FATAL = 0 }  # <- Wishful thinking!
      { count++ }
END   { print count }

包装器脚本无法检查awk运行时是否存在文件,因为它们在检查和awk之间可能会消失,然后尝试打开它们,即它是竞争条件。 (这也是在awk中检查然后打开的竞争条件,虽然时间越来越紧张)

6 个答案:

答案 0 :(得分:2)

GAWK 4有BEGINFILE,如果ERRNO不为空(表示无法打开文件),您可以在其中测试nextfile并执行ERRNO

答案 1 :(得分:1)

即使在你的awk脚本周围粘贴了一个perl或shell包装器,我认为仍然存在竞争条件。例如,使用ADEpt的其他精细shell代码段:

[ -r "$filename" ] && awk -f ... $filename

没有什么能阻止进程在-r和awk试图打开文件的时间之间消失......

我能想到的唯一答案是使用LD_PRELOAD替换awk的系统开放调用,这样如果文件丢失,则会打开/ dev / null上的读文件描述符。

那可能有用......

答案 2 :(得分:1)

您可以查看ARGV内容的系统调用,然后通过getline处理它们。

 if (system("test -r " ARGV[1]) == 0)
   while ( (getline aline < ARGV[1]) >0 )
     # process ARGV[1] via `aline` instead of $0

...

然后处理ARGV [2]等 HTH

答案 3 :(得分:1)

在我看来,“MISSING_FILES_ARE_FATAL = 0”功能将成为下一个gawk版本的一部分。请参阅当前gawk-stable源代码的ChangeLog文件:

---剪辑---

2008年8月22日星期五14:43:49 Arnold D. Robbins

* io.c (nextfile): Users Strong In The Ways Of The Source can use
non-existant files on the command line without it being a fatal error.

---剪辑---

http://cvs.savannah.gnu.org/viewvc/gawk-stable/ChangeLog?revision=1.87&root=gawk&view=markup

赫尔曼

答案 4 :(得分:0)

在最好的传统中,我会用Perl程序回答你的awk问题。

#!/usr/bin/perl -w

for my $file (@ARGV) {
    open my $fh, $file or next;
    while(<$fh>) {
        ...do your thing here...
    }
}

(这不是awk,但它是没有竞争条件的唯一解决方案。)

答案 5 :(得分:0)

哦,抱歉。无视我以前的回答。这是另一个建议:

cat /proc/[1-9]* 2>/dev/null | awk ....

Cat将吞噬所有文件,丢失和现有相似,cat的错误将被遗忘(遗失的文件是cat的非致命错误),awk将能够处理结果。