Gawk/Beispiele: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
K Textersetzung - „angewendet“ durch „angewandt“ |
||
(32 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
'''awk''' ist eine Programmiersprache zur Veränderung von Textdateien | |||
==Einführung== | ==Einführung== | ||
* | * Erstellt von Alfred V. '''A'''ho, Peter J. '''W'''einberger und Brian W. '''K'''ernighan. | ||
**awk-Kommando in der Shell-Konsole | * kann aufgerufen werden durch | ||
**In Shell- oder in awk-Scripte | ** awk-Kommando in der Shell-Konsole | ||
*awk wartet auf Daten von Eingabeströmen aus Dateien oder aus der Standardeingabe | ** In Shell- oder in awk-Scripte | ||
*awk arbeitet Zeile für Zeile bis zum Dateiende | * awk wartet auf Daten von Eingabeströmen aus Dateien oder aus der Standardeingabe | ||
*Basiert auf der Programmiersprache C | * awk arbeitet Zeile für Zeile bis zum Dateiende | ||
* Basiert auf der Programmiersprache C | |||
==Syntax & Aufbau== | ==Syntax & Aufbau== | ||
Allgemeine Syntax: | |||
$ awk 'Programm' Datei | $ '''awk 'Programm' Datei''' | ||
oder | oder | ||
$ awk -f Programmdatei Datei | $ '''awk -f Programmdatei Datei''' | ||
Der Aufbau eines awk-Programms: | Der Aufbau eines awk-Programms: | ||
Zeile 54: | Zeile 55: | ||
===Einzeiler-Kommandos=== | ===Einzeiler-Kommandos=== | ||
==== Gibt Anzahl der Eingabezeilen zurück ==== | |||
$ awk 'END {print NR}' | $ '''awk 'END {print NR}'''' | ||
10 | 10 | ||
==== Zeile Nr. 5 zurückgeben ==== | |||
$ awk 'NR == 5' | $ awk 'NR == 5' | ||
---------------------- | ---------------------- | ||
A Was war das? | A Was war das? | ||
==== Zeilen ab Zeile Nr.6 ausgeben ==== | |||
$ awk 'NR > 6' | $ awk 'NR > 6' | ||
---------------------- | ---------------------- | ||
Zeile 72: | Zeile 72: | ||
B Doch ! | B Doch ! | ||
==== Zeilen ausgeben mit mehr als 4 Felder ==== | |||
$ awk 'NF > 4' | $ awk 'NF > 4' | ||
---------------------- | ---------------------- | ||
Zeile 78: | Zeile 78: | ||
3. Reisig schmeckt am Besten | 3. Reisig schmeckt am Besten | ||
==== Jede Zeile mit einer Zeilennummer versehen ==== | |||
$ awk '{print NR, $0}' | $ awk '{print NR, $0}' | ||
----------------------- | ----------------------- | ||
Zeile 91: | Zeile 91: | ||
9 A Nein, stimmt nicht | 9 A Nein, stimmt nicht | ||
10 B Doch ! | 10 B Doch ! | ||
===Operatoren=== | ===Operatoren=== | ||
*Identisch mit C | *Identisch mit C | ||
Zeile 125: | Zeile 126: | ||
awk: run time error: negative field index $-1 | awk: run time error: negative field index $-1 | ||
FILENAME="beispiel2" FNR=3 NR=3 | FILENAME="beispiel2" FNR=3 NR=3 | ||
*Richtig | *Richtig angewandt: | ||
{ | { | ||
if($0 ~ /^$/) | if($0 ~ /^$/) | ||
Zeile 163: | Zeile 164: | ||
} | } | ||
*Ähnlich wie der davor, nur das die Fragen und Antworten jeweils in eigene Dateien gepackt werden. Desweiteren werden auch die Zahlen und Buchstaben vor den Fragen bzw. Antworten entfernt: | *Ähnlich wie der davor, nur das die Fragen und Antworten jeweils in eigene Dateien gepackt werden. Desweiteren werden auch die Zahlen und Buchstaben vor den Fragen bzw. Antworten entfernt: | ||
{ | { | ||
if($1 ~ /^[0-9]./) | if($1 ~ /^[0-9]./) | ||
Zeile 175: | Zeile 176: | ||
print row, $0 >> "antworten.txt"; | print row, $0 >> "antworten.txt"; | ||
} | } | ||
} | } | ||
[[ | [[Kategorie:Gawk]] | ||
Aktuelle Version vom 18. August 2023, 11:33 Uhr
awk ist eine Programmiersprache zur Veränderung von Textdateien
Einführung
- Erstellt von Alfred V. Aho, Peter J. Weinberger und Brian W. Kernighan.
- kann aufgerufen werden 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
- Basiert auf der Programmiersprache C
Syntax & Aufbau
Allgemeine Syntax:
$ awk 'Programm' Datei oder $ awk -f Programmdatei Datei
Der Aufbau eines awk-Programms:
- Optionaler Anfang(BEGIN), der einmalig ausgeführt wird
- Hauptprogramm aus Anweisungen, das für jede Eingabezeile erneut ausgeführt wird
- Optionales Ende(END), der einmalig ausgeführt wird
Eine Anweisung wiederum:
- hat ein optionales Muster, meist Reguläre Ausdrücke
- 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; }
Anwendungsfälle
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
Gibt Anzahl der Eingabezeilen zurück
$ awk 'END {print NR}' 10
Zeile Nr. 5 zurückgeben
$ awk 'NR == 5' ---------------------- A Was war das?
Zeilen ab Zeile Nr.6 ausgeben
$ awk 'NR > 6' ---------------------- 3. Reisig schmeckt am Besten A Nein, stimmt nicht B Doch !
Zeilen ausgeben mit mehr als 4 Felder
$ awk 'NF > 4' ---------------------- 1. Hier ist ein Text mit Inhalt 3. Reisig schmeckt am Besten
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 !
Operatoren
- Identisch mit C
- Wichtigster Operator: "~" prüft Übereinstimmung mit Regulären Ausdrücken
- "==" vergleicht nur mit Konstanten und Variablen
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 angewandt:
{ if($0 ~ /^$/) { print $0 } else { print $(NF-1) } } ----------------------- mit Eine & war und am stimmt Doch
Weitere Anwendungen
- Zählt Dateien im Verzeichnis usr und berechnet den Speicherbedarf:
$ ls -l /usr | awk '{ ++files; sum+=$5 } END { print sum, "Bytes in", files, "Dateien"; }' ------------------------ 139264 Bytes in 12 Dateien
- Aktueller Fall: Fragen und Antworten mit einer Nummer markieren, um so ihre Zugehörigkeit zu zeigen:
{ if($1 ~ /^[0-9]./) { ++row; } print row, $0; }
- Ähnlich wie der davor, nur das die Fragen und Antworten jeweils in eigene Dateien gepackt werden. Desweiteren werden auch die Zahlen und Buchstaben vor den Fragen bzw. Antworten entfernt:
{ if($1 ~ /^[0-9]./) { ++row; $1 = ""; print row, $0 >> "fragen.txt"; }else { $1 = ""; print row, $0 >> "antworten.txt"; } }