Gawk/Beispiele: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
|||
| (92 dazwischenliegende Versionen von 2 Benutzern 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 | ||
* | * Basiert auf der Programmiersprache C | ||
* | |||
Aufruf in | |||
*awk arbeitet | * der interaktiven [[Shell]] | ||
* [[Shell-Script]]en | |||
* [[awk-Script]]en | |||
awk wartet auf Daten von Eingabeströmen aus Dateien oder aus der Standardeingabe | |||
* awk arbeitet zeilenweise bis zum Dateiende | |||
==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 20: | Zeile 25: | ||
Eine Anweisung wiederum: | Eine Anweisung wiederum: | ||
#hat ein optionales Muster | #hat ein optionales Muster, meist Reguläre Ausdrücke | ||
#gefolgt von einem Kommandoblock in geschweiften Klammern | #gefolgt von einem Kommandoblock in geschweiften Klammern | ||
/Muster/ {Kommando; | /Muster/ {Kommando; | ||
| Zeile 27: | Zeile 32: | ||
} | } | ||
Ein Beispiel: | |||
BEGIN{ | BEGIN{ | ||
print "Zählen von Eingabezeilen"; | print "Zählen von Eingabezeilen"; | ||
zaehler=0;} | zaehler=0; | ||
} | |||
{ zaehler++; } | { zaehler++; } | ||
END{ | END{ | ||
print "Ergebnis: " zaehler;} | print "Ergebnis: " zaehler; | ||
} | |||
==Anwendungsfälle== | |||
Beispieldatei | |||
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 == | |||
=== Anzahl der Zeilen ausgeben === | |||
$ '''awk 'END {print NR}'''' | |||
10 | |||
=== Zeile fünf ausgeben === | |||
$ awk 'NR == 5' | |||
---------------------- | |||
A Was war das? | |||
=== Zeilen ab Zeile sechs ausgeben === | |||
$ awk 'NR > 6' | |||
---------------------- | |||
3. Reisig schmeckt am Besten | |||
A Nein, stimmt nicht | |||
B Doch ! | |||
=== Zeilen mit mehr als vier Feldern ausgeben === | |||
$ awk 'NF > 4' | |||
---------------------- | |||
1. Hier ist ein Text mit Inhalt | |||
3. Reisig schmeckt am Besten | |||
=== Zeilen nummerieren === | |||
$ 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 ! | |||
=== Weitere Beispiele === | |||
{| class="wikitable options big" | |||
| awk '{print $2, $3}' my.txt || 2. und 3. Feld durch Leerzeichen getrennt ausgeben | |||
|- | |||
| awk '{print $2 "," $3}' my.txt || 2. und 3. Feld durch Komma getrennt ausgeben | |||
|- | |||
| awk '$2 >100' my.txt || Zeilen ausgeben, in denen das zweite Feld größer als 100 ist | |||
|- | |||
| awk '$1==100' my.txt || Zeilen ausgeben, in denen das erste Feld gleich 100 ist | |||
|- | |||
| awk '/error/' my.txt || Zeilen ausgeben, die das Wort „Fehler“ enthalten | |||
|- | |||
| awk '{sum=$1+$2; print sum]' my.txt || Erstes und zweites Feld jeder Zeile summieren | |||
|- | |||
| awk '{print NR, $0}' my.txt || Zeilennummer hinzufügen | |||
|- | |||
| awk '[print NF}' my.tzt || Die Anzahl der Felder in jeder Zeile ausgeben | |||
|- | |||
| awk '{print $1, $NF}' my.txt || Erstes und letztes Feld ausgeben | |||
|- | |||
| awk '{s+=$2; c++} END {print s/c}' my.txt || Durchschnitt des zweiten Feldes berechnen | |||
|- | |||
| awk '$1>100 {s+=$2; c++} END {print s/c}' my.txt || Durchschnitt mit Bedingung | |||
|- | |||
| awk '{print toupper($2)}' my.txt || Zweites Feld in Großbuchstaben ausgeben | |||
|- | |||
| awk '$1=="ERR" {print $2}' my.log || Zweites Feld ausgeben, wenn das erste Feld „ERR“ ist. | |||
|- | |||
| awk '{print "Name:", $1, "Age:", $2}' my.txt || Ausgabe formatieren | |||
|- | |||
| awk -F"," {print $2, $3}' my.csv || Komma „,“ als Feldtrennzeichen. | |||
|- | |||
| awk '{print substr($2,1,3)} my.txt || Teilzeichenfolge aus dem zwiten Feld extrahieren | |||
|- | |||
| awk function sq(x) {return x*x} {print sq($2)}' my.txt || eine Funktion definieren | |||
|- | |||
| awk '!seen[$1]++' my.txt || Duplikate anhand der ersten Zeile entfernen | |||
|- | |||
| awk 'length($2) > 3' my.txt || Zeilen ausgeben, in denen die Länge des zweiten Feldes > 3 ist | |||
|- | |||
| awk '$1 ~ /ERR/' my.log || Zeilen ausgeben, in denen das erste Feld dem Muster entspricht | |||
|- | |||
| awk '$1 ~- /ERR/' my.log || Zeilen ausgeben, in denen das erste Feld nicht mit dem Muster übereinstimmt | |||
|- | |||
| awk '$1 ~ /*[0-9]+$/' my.log || Zeilen ausgeben, in denen das erste Feld ein numerischer Wert ist | |||
|} | |||
==Operatoren== | |||
*Identisch mit C | |||
*Wichtigster Operator: "~" prüft Übereinstimmung mit ''Regulären Ausdrücken'' | |||
*"==" vergleicht nur mit Konstanten und Variablen | |||
== Wichtige Variablen == | |||
[[gawk]] 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"; | |||
} | |||
} | |||
== Links == | |||
* https://www.instagram.com/reel/DR2Bh6PEZYJ/ | |||
[[Kategorie:Gawk]] | |||
Aktuelle Version vom 6. Dezember 2025, 09:52 Uhr
awk ist eine Programmiersprache zur Veränderung von Textdateien
Einführung
Erstellt von Alfred V. Aho, Peter J. Weinberger und Brian W. Kernighan
- Basiert auf der Programmiersprache C
Aufruf in
- der interaktiven Shell
- Shell-Scripten
- awk-Scripten
awk wartet auf Daten von Eingabeströmen aus Dateien oder aus der Standardeingabe
- awk arbeitet zeilenweise bis zum Dateiende
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
Beispieldatei
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
Anzahl der Zeilen ausgeben
$ awk 'END {print NR}'
10
Zeile fünf ausgeben
$ awk 'NR == 5' ---------------------- A Was war das?
Zeilen ab Zeile sechs ausgeben
$ awk 'NR > 6' ---------------------- 3. Reisig schmeckt am Besten A Nein, stimmt nicht B Doch !
Zeilen mit mehr als vier Feldern ausgeben
$ awk 'NF > 4' ---------------------- 1. Hier ist ein Text mit Inhalt 3. Reisig schmeckt am Besten
Zeilen nummerieren
$ 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 !
Weitere Beispiele
| awk '{print $2, $3}' my.txt | 2. und 3. Feld durch Leerzeichen getrennt ausgeben |
| awk '{print $2 "," $3}' my.txt | 2. und 3. Feld durch Komma getrennt ausgeben |
| awk '$2 >100' my.txt | Zeilen ausgeben, in denen das zweite Feld größer als 100 ist |
| awk '$1==100' my.txt | Zeilen ausgeben, in denen das erste Feld gleich 100 ist |
| awk '/error/' my.txt | Zeilen ausgeben, die das Wort „Fehler“ enthalten |
| awk '{sum=$1+$2; print sum]' my.txt | Erstes und zweites Feld jeder Zeile summieren |
| awk '{print NR, $0}' my.txt | Zeilennummer hinzufügen |
| awk '[print NF}' my.tzt | Die Anzahl der Felder in jeder Zeile ausgeben |
| awk '{print $1, $NF}' my.txt | Erstes und letztes Feld ausgeben |
| awk '{s+=$2; c++} END {print s/c}' my.txt | Durchschnitt des zweiten Feldes berechnen |
| awk '$1>100 {s+=$2; c++} END {print s/c}' my.txt | Durchschnitt mit Bedingung |
| awk '{print toupper($2)}' my.txt | Zweites Feld in Großbuchstaben ausgeben |
| awk '$1=="ERR" {print $2}' my.log | Zweites Feld ausgeben, wenn das erste Feld „ERR“ ist. |
| awk '{print "Name:", $1, "Age:", $2}' my.txt | Ausgabe formatieren |
| awk -F"," {print $2, $3}' my.csv | Komma „,“ als Feldtrennzeichen. |
| awk '{print substr($2,1,3)} my.txt | Teilzeichenfolge aus dem zwiten Feld extrahieren |
| awk function sq(x) {return x*x} {print sq($2)}' my.txt | eine Funktion definieren |
| awk '!seen[$1]++' my.txt | Duplikate anhand der ersten Zeile entfernen |
| awk 'length($2) > 3' my.txt | Zeilen ausgeben, in denen die Länge des zweiten Feldes > 3 ist |
| awk '$1 ~ /ERR/' my.log | Zeilen ausgeben, in denen das erste Feld dem Muster entspricht |
| awk '$1 ~- /ERR/' my.log | Zeilen ausgeben, in denen das erste Feld nicht mit dem Muster übereinstimmt |
| awk '$1 ~ /*[0-9]+$/' my.log | Zeilen ausgeben, in denen das erste Feld ein numerischer Wert ist |
Operatoren
- Identisch mit C
- Wichtigster Operator: "~" prüft Übereinstimmung mit Regulären Ausdrücken
- "==" vergleicht nur mit Konstanten und Variablen
Wichtige Variablen
gawk 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";
}
}