[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: awk



Hans-Georg Bork <hgb@hgbhome.net> wrote:
> Und was passiert innerhalb awk wenn BEGIN/END dort nicht steht (s.o.)?
> Das war meine Frage ...

awk ist in erster Linie ein Textparser. Eingabe von awk sind Records,
per Default ist ein Record eine Zeile. Jeder Eingabe-Record wird gegen
jeden Pattern im awk-Script verglichen und bei einem Match wird der zum
Pattern gehoerende Code ausgefuehrt.
Der Pattern im awk-Script '{ foo }' ist ein catch-all-Pattern, d.h. der
matched auf jeden Record, i.e. auf jede Zeile. Du koenntest ersatzweise
auch '/.*/ { foo }' oder '/^.*$/ { foo }' schreiben, da wird das Pattern
besser sichtbar.
Wenn Deine Eingabe leer ist (wie /dev/null oder 'echo -n ""'), gibt es
keinen Text, keine Textzeile und insbesondere keinen Record. Deshalb
wird bei einer leeren Eingabe auch kein zu irgendeinem Pattern
gehoerender Code ausgefuehrt - es gibt schliesslich nichts zu matchen.

Es gibt zwei spezielle Pattern BEGIN und END. Die Ausfuehrung des zu
diesen Pattern gehoerenden Codes ist nicht an eine Eingabe gebunden,
sondern an den Start bzw. das Ende von awk. Der Code dieser Pattern wird
daher immer und unabhaengig von der Struktur der Eingabe ausgefuehrt.

Unsinn war im uebrigen die Aussage, awk wuerde bei einer leeren Eingabe
garnicht erst starten. Das erschliesst sich auch leicht durch einfaches
Nachdenken und sogar ohne Wissen um die Existenz von BEGIN und END: um
ueberhaupt festzustellen, dass eine Eingabe leer ist, muss Code
ausgefuehrt werden. Damit Code ueberhaupt ausgefuehrt werden kann, der
feststellt, dass die Eingabe leer ist, muss awk aber starten.


regards
   Mario
-- 
User sind wie ideale Gase - sie verteilen sich gleichmaessig ueber alle Platten



Reply to: