有没有办法让 awk (gawk)忽略或跳过丢失的文件?也就是说,文件系统中不再存在的命令行传递的文件(例如/ proc / [1-9] *下快速出现/消失的文件)。
默认情况下,丢失的文件是致命错误: - (
我希望能够做到这样的事情:
BEGIN { MISSING_FILES_ARE_FATAL = 0 } # <- Wishful thinking!
{ count++ }
END { print count }
包装器脚本无法检查awk运行时是否存在文件,因为它们在检查和awk之间可能会消失,然后尝试打开它们,即它是竞争条件。 (这也是在awk中检查然后打开的竞争条件,虽然时间越来越紧张)
答案 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将能够处理结果。