2008-10-20 2 views
5

Есть ли способ сделать awk (gawk) игнорировать или пропускать файлы? То есть файлы передаются в командной строке, которые больше не существуют в файловой системе (например, быстро появляются/исчезают файлы в/proc/[1-9] *).Может ли awk пропускать файлы, которые не существуют, без гонок?

По умолчанию, отсутствующий файл является фатальной ошибкой :-(

Я хотел бы быть в состоянии сделать эквивалент чего-то вроде этого:

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

Сценарий обертка не может проверить, что файлы существуют befor awk, так как они могут исчезать между временем их проверки и awk затем пытается открыть их, т. е. это состояние гонки. (Это также условие гонки, чтобы проверить и затем открыть в awk, хотя время более жесткое)

ответ

0

В лучших традициях я отвечу на ваш вопрос awk с помощью программы Perl.

#!/usr/bin/perl -w 

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

(Это не AWK, но это единственное решение без условия гонки.)

1

Даже торчащий PERL или оболочек обертки вокруг вашего AWK сценария, я думаю, что все еще будет состояние гонки , Например, используя в противном случае тонкой оболочки фрагмент адепта:

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

нет ничего предотвратить процесс от уезжаю между -r и времени AWK получает вокруг к попытке открыть файл ...

только Ответ: Я могу думать о том, чтобы использовать LD_PRELOAD для замены открытого вызова системы на awk, так что если файл отсутствует, вместо этого открывается дескриптор файла чтения в/dev/null.

Это может работать ...

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], и т.д. НТН

0

Ой, извините. Не обращайте внимания на мой предыдущий ответ. Вот еще одно предложение:

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

Cat сожрет все файлы, отсутствующие и существующие, так, ошибка кошки будет сброшена в Лету (отсутствующий файл не является фатальной ошибкой для кошки), и AWK Виль быть в состоянии для обработки результата.

1

Мне кажется, что функция «MISSING_FILES_ARE_FATAL = 0» станет частью следующего выпуска gawk. Смотрите файл ChangeLog текущего поглазеть стабильный исходный код:

--- надрез ---

Пт Авг 22 14:43:49 2008 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

Герман

2

GAWK 4 имеет BEGINFILE, в котором вы можете проверить ERRNO и сделать nextfile если ERRNO не пусто (что файл не может быть открыт).

Смежные вопросы