Tracks
/
AWK
AWK
/
Lehrplan
/
Grundlagen
Gr

Grundlagen in AWK

1 Übung

Über Grundlagen

Wir bezeichnen die Sprache als AWK und das ausführbare Programm, das AWK-Programme interpretiert, als awk oder gawk.

Muster und Aktionen

Ein AWK-Programm besteht aus Muster-Aktions-Paaren

pattern1 { action1 }
pattern2 { action2 }
...

Ein Muster kann ein regulärer Ausdruck sein, mit dem die Eingabe abgeglichen wird. Es kann auch ein beliebiger Ausdruck sein, der einen Wahrheitswert (wahr/falsch) ergibt.

Eine Aktion besteht aus einem oder mehreren AWK-Befehlen. Die umschließenden geschweiften Klammern sind erforderlich.

Ist das Ergebnis des Musters wahr, wird die zugehörige Aktion ausgeführt.

Datensätze und Felder

AWK zerlegt die Eingabe in eine Folge von Datensätzen. Jeder Datensatz wird in null oder mehr Felder aufgeteilt.

Standardmäßig gilt:

  • Die Eingabe wird mit dem Zeilenumbruch als „Datensatztrenner“ in Datensätze aufgeteilt, sodass jede Zeile ein Datensatz ist.
  • Der Datensatz wird mit Leerraum als „Feldtrenner“ in Felder aufgeteilt, sodass jedes Wort ein Feld ist.

Muster und Aktionen, Fortsetzung

Das Muster kann weggelassen werden; in diesem Fall wird die Aktion für jeden Eingabedatensatz ausgeführt.

Die Aktion kann weggelassen werden; in diesem Fall besteht die Standardaktion darin, den aktuellen Datensatz auszugeben.

Spezielle Muster

Es gibt zwei spezielle Muster, die häufig verwendet werden.

  • BEGIN führt die zugehörige Aktion aus, bevor eine Eingabe verarbeitet wird.
  • END führt die zugehörige Aktion aus, nachdem die gesamte Eingabe verarbeitet wurde.

Feldvariablen

Auf Felder verweist du mit $1, $2, $3 usw.

Der aktuelle Datensatz ist $0.

Caution

Um es klar zu sagen: Das sind streng genommen keine „Variablen“. Das $ kann man als Operator auffassen, der den Wert der angegebenen Feldnummer liefert. In späteren Konzepten gehen wir genauer darauf ein.

Hier sind einige weitere häufig verwendete eingebaute Variablen.

Eingebaute Variablen, die das Einlesen der Eingabe steuern

  • RS ist der Eingabe-Datensatztrenner. Wie erwähnt, ist sein Standardwert der Zeilenumbruch.
  • FS ist der Eingabe-Feldtrenner.

Diese Variablen werden oft im BEGIN-Aktionsblock gesetzt.

Eingebaute Variablen, die Informationen liefern

Diese Variablen werden von AWK während der Ausführung des Programms automatisch gesetzt.

  • NF speichert die Anzahl der Felder im aktuellen Datensatz.
    • Um den Wert des letzten Feldes zu erhalten, verwendest du $NF.
  • NR speichert die aktuelle Datensatznummer.
    • Wenn mehrere Eingabedateien verarbeitet werden, enthält NR die Gesamtzahl der bisher verarbeiteten Datensätze.
  • FNR speichert die aktuelle Datensatznummer der aktuellen Eingabedatei.
    • Um den Unterschied zwischen NR und FNR zu veranschaulichen, hier ein gebräuchliches AWK-Idiom.
      NR == FNR {action}
      
      Das bedeutet: „wenn die aufsummierte Datensatznummer der Datensatznummer der aktuellen Datei entspricht“. Das kann nur für Datensätze in der ersten Eingabedatei wahr sein.

Wahrheitswertigkeit

AWK verwendet dasselbe Konzept der Wahrheitswertigkeit wie C:

  • Die Zahl 0 ist falsch.
  • Jede andere Zahl ist wahr.

Da AWK eine Sprache zur Textverarbeitung ist, werden Wahrheitswerte auf Strings ausgedehnt.

  • Ein leerer String "" ist falsch.
  • Jeder nicht leere String ist wahr.
Note

AWK verwendet dasselbe Konzept der Wahrheitswertigkeit wie C

AWK entstand in den 1970er Jahren in den Bell Labs, im selben Umfeld, in dem C erfunden wurde. C hatte großen Einfluss auf die Syntax von AWK.

Caution

Eine Besonderheit, auf die du achten solltest

  • Die Zahl 0 ist falsch.
  • Der nicht leere String "0" ist wahr!

Auf die Datentypen von AWK gehen wir in späteren Konzepten genauer ein.

Kommentare

Kommentare beginnen mit dem Zeichen # und reichen bis zum Ende der Zeile.

Wie du awk Eingabe übergibst

awk kann Eingaben aus Dateien oder von der Standardeingabe lesen. Jede dieser Techniken funktioniert.

awk '/regex/ {print $1}' file1 file2 ...

awk '/regex/ {print $1}' < file

some_command_here | awk '/regex/ {print $1}'

Beispiele

Auf Unix-ähnlichen Systemen enthält /etc/passwd Informationen über Benutzer. Jeder Benutzer wird in einer eigenen Zeile beschrieben, wobei die Felder durch Doppelpunkte getrennt sind.

So listest du die Benutzernamen:

awk '
    BEGIN { FS = ":" }
    { print $1 }
' /etc/passwd

Beachte, dass die Aktion {print $1} kein Muster hat und daher für jeden Datensatz ausgeführt wird.

Wenn wir die Ausgabe auf Benutzer beschränken wollen, die bash als Login-Shell verwenden, geht das so:

awk '
    BEGIN { FS = ":" }
    $7 == "/bin/bash" { print $1 }
' /etc/passwd

Noch ein paar Beispiele

Hier sind einige awk-Programme, die dieselben Ergebnisse liefern wie andere gängige Unix-Befehle.

  • Eine Datei anzeigen

    cat file.txt
    
    awk '1' file.txt
    
  • In einer Datei nach Mustern suchen

    grep 'foo.*bar' file.txt
    
    awk '/foo.*bar/' file.txt
    
  • Nur die ersten paar Zeilen einer Datei anzeigen

    head -n 20 file.txt
    
    awk '
        1
        NR == 20 {exit}
    ' file.txt
    
  • Text in einer Datei ersetzen

    sed 's/foo/bar/' file.txt
    
    awk '{sub(/foo/, "bar")};1' file.txt
    # or more readably
    awk '
        {
            sub(/foo/, "bar")
            print
        }
    ' file.txt
    
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab

Lerne Grundlagen