2008-10-20 11 views
5

Gibt es eine Möglichkeit awk (gawk) zu machen, fehlende Dateien zu ignorieren oder zu überspringen? Das heißt, Dateien, die in der Befehlszeile übergeben werden, die nicht mehr im Dateisystem vorhanden sind (z. B. schnell erscheinende/verschwindende Dateien unter/proc/[1-9] *).Kann awk Dateien überspringen, die es nicht gibt, rennfrei?

standardmäßig eine fehlende Datei ist ein fataler Fehler :-(

würde ich in der Lage sein mag das Äquivalent von so etwas zu tun:

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

Ein Wrapper-Skript kann nicht überprüfen, ob Dateien existieren, bevor awk ausgeführt wird, da sie zwischen dem Zeitpunkt, an dem sie überprüft werden, verschwinden und awk dann versuchen, sie zu öffnen, dh es ist eine Race-Bedingung. (Es ist auch eine Race-Bedingung zum check-and-then-open innerhalb von awk, obwohl das Timing ist enger)

Antwort

0

In den besten von traditi Ich werde deine awk-Frage mit einem Perl-Programm beantworten.

#!/usr/bin/perl -w 

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

(Es ist nicht awk, aber es ist die einzige Lösung, ohne Race-Bedingung.)

1

Selbst ein Perl oder Shell-Wrapper um Ihre awk Skript kleben, ich glaube es noch geht um eine Race-Bedingung sein . Zum Beispiel, da sonst der Verwendung von Adept feinen Schale Schnipsel:

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

gibt es nichts, den Prozess von weggeht zwischen dem -r und der Zeit awk verhindert wird um zu versuchen, die Datei zu öffnen ...

die einzige Antwort Ich kann daran denken, LD_PRELOAD zu verwenden, um den offenen Systemaufruf für awk zu ersetzen, so dass, wenn die Datei fehlt, stattdessen ein gelesener Dateideskriptor auf/dev/null geöffnet wird.

die funktionieren könnte ...

1

Nun können Sie über den Inhalt von ARGV mit Systemaufruf überprüfen und sie dann über getline verarbeiten.

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

...

Dann ARGV verarbeiten [2], etc HTH

0

Oh, sorry. Missachte meine vorherige Antwort. Hier ist ein weiterer Vorschlag:

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

Katze wird alle Dateien verschlingen, fehlt und bestehende gleich, Katzen Fehler in Vergessenheit abgeladen werden (die fehlende Datei ist nicht schwerwiegender Fehler für Katze) und die awk wil der Lage sein, um das Ergebnis zu verarbeiten.

1

Es sieht für mich aus, dass eine "MISSING_FILES_ARE_FATAL = 0" -Funktion Teil der nächsten Gawk-Version sein wird. Siehe die ChangeLog-Datei der aktuellen gaffen stabile Quellcode:

--- schnipp ---

Fr 22. August 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. 

--- schnipp ---

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

Hermann

2

GAWK 4 hat BEGINFILE, in dem Sie für ERRNO testen und tun, ein nextfile wenn ERRNO nicht leer ist (zeigt an, dass die Datei nicht geöffnet werden konnte).

Verwandte Themen