2008-10-20 15 views
5

Y at-il un moyen de faire awk (gawk) ignorer ou ignorer les fichiers manquants? C'est-à-dire, des fichiers transmis sur la ligne de commande qui n'existent plus dans le système de fichiers (par exemple des fichiers apparaissant/disparaissant rapidement sous/proc/[1-9] *).Est-ce que awk peut ignorer les fichiers qui n'existent pas, sans race?

Par défaut, un fichier manquant est une erreur fatale :-(

Je voudrais pouvoir faire l'équivalent de quelque chose comme ceci:

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

Un script d'emballage ne peut pas vérifier que les fichiers existent befor awk est exécuté car ils peuvent disparaître entre le moment où ils sont vérifiés et awk puis essaie de les ouvrir, c'est-à-dire, c'est une condition de course pour vérifier-et-puis-ouvrir dans awk, bien que le timing est plus serré)

Répondre

0

Dans les meilleurs traditi ons, je vais répondre à votre question awk avec un programme Perl.

#!/usr/bin/perl -w 

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

(Ce n'est pas awk, mais il est la seule solution sans condition de course.)

1

coller Même une enveloppe perl ou shell autour de votre script awk, je pense qu'il va encore être une condition de course . Par exemple, en utilisant extrait de shell autrement fin Adept:

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

il n'y a rien qui empêche le processus d'aller loin entre le -r et le temps, awk devient le temps d'essayer d'ouvrir le fichier ...

La seule la réponse que je peux penser est d'utiliser LD_PRELOAD pour remplacer l'appel système open pour awk, de sorte que si le fichier est manquant, un descripteur de fichier lu sur/dev/null est ouvert à la place.

Cela pourrait fonctionner ...

1

Eh bien, vous pouvez vérifier avec appel système sur le contenu de ARGV, puis de les traiter via getline.

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

...

transformons argv [2], etc HTH

0

Oh, désolé. Ne tenez pas compte de ma réponse précédente. Voici une autre suggestion:

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

Cat gobe tous les fichiers, manquants et existants aussi bien, l'erreur de chat sera jeté à l'oubli (le fichier manquant est une erreur non fatale pour chat), et le awk wil pouvoir pour traiter le résultat.

1

Il me semble qu'une fonction "MISSING_FILES_ARE_FATAL = 0" fera partie de la prochaine version de gawk. Voir le fichier ChangeLog du code actuel source gawk-stable:

--- --- snip

Ven 22 août 2008 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. 

--- --- snip

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

Hermann

2

GAWK 4 a BEGINFILE dans lequel vous pouvez tester ERRNO et faire un nextfile si ERRNO est pas vide (indiquant que le fichier n'a pas pu être ouvert).