Gawk/Beispiele

Aus Foxwiki

AWK ist eine Programmiersprache um Textdateien zu ändern.

Einführung

  • AWK kann man aufrufen durch
    • awk-Kommando in der Shell-Konsole
    • In Shell- oder in awk-Scripte
  • awk wartet auf Daten von Eingabeströmen aus Dateien oder aus der Standardeingabe
  • awk arbeitet Zeile für Zeile bis zum Dateiende

Syntax & Aufbau

Die allgemeine Syntax lautet:

$ awk 'Programm' Datei
oder
$ awk -f Programmdatei Datei

Der Aufbau eines awk-Programms:

  1. Optionaler Anfang(BEGIN), der einmalig ausgeführt wird
  2. Hauptprogramm aus Anweisungen, das für jede Eingabezeile erneut ausgeführt wird
  3. Optionales Ende(END), der einmalig ausgeführt wird

Eine Anweisung wiederum:

  1. hat ein optionales Muster
  2. gefolgt von einem Kommandoblock in geschweiften Klammern
/Muster/  {Kommando;
           Kommando;
           ...
          }

Ein Beispiel:

BEGIN{ 
      print "Zählen von Eingabezeilen";      
      zaehler=0;
     }

{ zaehler++; }

END{ 
      print "Ergebnis: " zaehler;
   }

Anwendungen

Eine einfache Textdatei:

1. Hier ist ein Text mit Inhalt
A Eine Zeile

2. Tim & Struppi
A Was war das?
B Aktion und Reaktion

3. Reisig schmeckt am Besten
A Nein, stimmt nicht
B Doch !

Einzeiler-Kommandos

  1. Gibt Anzahl der Eingabezeilen zurück
$ awk 'END {print NR}'
----------------------
10
  1. Zeile Nr. 5 zurückgeben
$ awk 'NR == 5'
----------------------
A Was war das?
  1. Zeilen ab Zeile Nr.6 ausgeben
$ awk 'NR > 6'
----------------------

3. Reisig schmeckt am Besten
A Nein, stimmt nicht
B Doch !
  1. Zeilen ausgeben mit mehr als 4 Felder
$ awk 'NF > 4'
----------------------
1. Hier ist ein Text mit Inhalt
3. Reisig schmeckt am Besten
  1. Jede Zeile mit einer Zeilennummer versehen
$ awk '{print NR, $0}'
-----------------------
1 1. Hier ist ein Text mit Inhalt
2 A Eine Zeile
3 
4 2. Tim & Struppi
5 A Was war das?
6 B Aktion und Reaktion
7 
8 3. Reisig schmeckt am Besten
9 A Nein, stimmt nicht
10 B Doch !

Wichtige Variablen

  • awk arbeitet unter der Annahme, dass die Eingabe strukturiert ist
  • Jedes Feld ist eine Zeichenfolge, die durch Feldseperatoren (meistens Leerzeichen oder Tabulator) begrenzt ist
  • $ ist der Feldoperator
  • $1 ist das erste Feld.
  • $0 steht für die gesamte Zeile, die gerade bearbeitet wird.
$ awk '{print $1}'
-----------------------
1.
A

2.
A
B

3.
A
B
  • $NF steht für das letzte Feld
  • $(NF-1) gibt das vorletzte Feld wieder. (Achtung: Bei Leerzeilen führt es zu Laufzeitfehler)
$ awk '{print $(NF-1)}'
-----------------------
mit
Eine
awk: run time error: negative field index $-1
       FILENAME="beispiel2" FNR=3 NR=3
  • Richtig angewendet:
$ awk '{if($0 ~ /^$/){print $0}else{print $(NF-1)}}' beispiel2
-----------------------
mit
Eine

&
war
und

am
stimmt
Doch