AWK: Textfilterung per Skript


* Einführung * Installation * Paketmanager * Grundlagen * Shells * Entwicklung * KDE * Skriptsprachen * AWK * PHP * Perl * Apache * Veranstaltungen * Schulungen * Bücher * Netzwerk * OpenOffice * OpenSource * Samba

AWK


© <a href="http://www.fotolia.de/p/29003">Ljupco Smokovski</a> - FOTOLIA
Home
AWK-Skripte kompilieren
Einführung
Mit freundlicher Unterstützung von:

Linux-Kurse und Seminare Linux Kurse
Veranstalter des
Linux-Tag
am Bodensee
2007 und 2008

Kontakt
Haftung
Impressum
Problem Hilfe Startseite


AWK-Skripte kompilieren


Installation

Der AWK ist eigentlich eine interpretative Sprache, und das ist auch gut so. Schließlich will man mit dem AWK gerne ad-hoc schnell ein Problem lösen; häufig sogar direkt in der Kommandozeile, also ohne das Skript zu speichern. Aber manchmal wuchert so ein Skript, wird größer und größer und damit vielleicht auch langsamer und schon sind wir bei einem guten Grund angelangt, das Skript zu übersetzen. Aber kaum auf irgendeiner Webseite oder in einschlägiger Literatur zu AWK wird erwähnt, dass es ein leistungsfähiges Programm zum Kompilieren von AWK-Skripten gibt. Der Australier Andrew Sumner hat einen Compiler geschrieben, der ein AWK-Skript in die Programmiersprache C übersetzt. Dabei kann man sowohl nur den Quellcode als auch direkt eine ausführbare Datei erzeugen.

 Im Folgenden zeigen wir, was man tun muss, um mit AWKA auf einem Unix- bzw. Linux-Rechner zu arbeiten:

  1. Die neusten Quellen besorgen. Man findet sie bei Sourceforge im AWKA Home unter Downloads.
  2. Speicher der neuesten Version, in unserem Fall awka-0.7.5.tar.gz, in einem Arbeitsverzeichnis.
  3. Entpacken der Quellen mit
    tar xvzf awka-0.7.5.tar.gz
  4. Wechseln in das dabei entstandene Unterverezichnis awka-version:
    cd awka-version
  5. Ab nun sollte man am besten als Root arbeiten.
  6. ./configure
  7. make
  8. make install
  9. (optional) make test
    Dabei werden verschiedene Eigenschaften von awka getestet, d.h. das die Kompilierung und Installation richtig funktioniert hat.
Install kopiert das ausführbare Programm 'awka' in /usr/local/bin und die dazugehörigen Libraries in /usr/local/lib, das zugehörige h-File (libawka.h) befindet sich in /usr/local/include.

Anmerkung: In der Shell sollte die Umgebungsvariable für den Library-Pfad so gesetzt sein, dass /usr/local/lib enthalten ist, also z.B. in .bashrc folgende Zeile aufnehmen:
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

Arbeitsweise von AWKA


Die Arbeitsweise von AWKA wollen wir uns an einem kleinen Beispiel anschauen. Das folgende Skript druckt von der 9. bis zur 16. Zeile alle Zeilen einer Datei aus:
{
zaehler += 1
if ( (zaehler >= 9 ) && (zaehler <= 16) ) {
print $0
}
}

Wenn obiges Skript in zeilen.awk gespeichert ist, kann man es mit folgendem Aufruf in C übersetzen:
awka -f zeilen.awk

Im xterm erhält man dann folgende Ausgabe:
/* This file generated by AWKA */

#include <libawka.h>
#include <setjmp.h>

int _split_req = 0, _split_max = INT_MAX;

extern int _dol0_used;
extern char _dol0_only;
extern char _env_used;
extern int _max_base_gc, _max_fn_gc;
extern struct awka_fn_struct *_awkafn;
jmp_buf context;
a_VAR *zaehler_awk = NULL;

struct gvar_struct *_gvar;

a_VAR **_lvar;
a_VAR *_litd0_awka=NULL, *_litd1_awka=NULL, *_litd2_awka=NULL;
void MAIN();

void
MAIN()
{
  int i, _curfile;
  if (*(awka_gets(a_bivar[a_FILENAME])) == '\0')
    awka_strcpy(a_bivar[a_FILENAME], "");
  i = setjmp(context);
  while (awka_getline(a_TEMP, awka_dol0(0), awka_gets(a_bivar[a_FILENAME]), FALSE, TRUE)->dval > 0 && awka_setNF())
  {
    awka_setd(zaehler_awk) += 1;
    if ((zaehler_awk->dval >= 9) && zaehler_awk->dval <= 16)
    {
      awka_print(NULL, 0, 0, awka_arg1(a_TEMP, awka_dol0(0)));
    }
    nextrec:;
  }
}

int
main(int argc, char *argv[])
{
  _max_base_gc = 2;
  _max_fn_gc = 2;

  awka_varinit(zaehler_awk);

  awka_varinit(_litd0_awka); awka_setd(_litd0_awka) = 1;
  awka_varinit(_litd1_awka); awka_setd(_litd1_awka) = 9;
  awka_varinit(_litd2_awka); awka_setd(_litd2_awka) = 16;

  if (!_lvar) {
    malloc( &_lvar, 4 * sizeof(a_VAR *) );
    _lvar[0] = _litd0_awka;
    _lvar[1] = _litd1_awka;
    _lvar[2] = _litd2_awka;
    _lvar[3] = NULL;
  }

  malloc( &_gvar, 2 * sizeof(struct gvar_struct) );
  awka_initgvar(0, "zaehler_awk", zaehler_awk);
  _gvar[1].name = NULL;
  _gvar[1].var  = NULL;

  malloc( &_awkafn, 1 * sizeof(struct awka_fn_struct) );
  _awkafn[0].name = NULL;
  _awkafn[0].fn   = NULL;

  awka_init(argc, argv, "0.7.5", "12 July 2001");

  _dol0_used = 1;
  _dol0_only = 1;

  MAIN();

  free(_litd0_awka);
  free(_litd1_awka);
  free(_litd2_awka);

  awka_exit(0);
}


Ein ausführbares Programm erhält man, indem man die -X-Option hinzufügt, also
awka -X -f zeilen.awk
Der ausführbare Code befindet sich dann in awka.out. Folgender Aufruf schreibt den Code in "zeilen":
awka -X -f zeilen.awk -o zeilen
Den C-Quellcode findet man unter "zeilen.c"


© Copyright 2007 - 2010, Bernd Klein mit freundlicher Unterstützung von Bodenseo, Linux-Kurse und Schulungen,
Foto linke Seite (Mann mit Strick und Colt): Foto: © Ljupco Smokovski, fotolia 984022