Zum Inhalt springen

Gawk/Beispiele: Unterschied zwischen den Versionen

Aus Foxwiki
 
(12 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 2: Zeile 2:


== Einführung ==
== Einführung ==
* Erstellt von Alfred V. '''A'''ho, Peter J. '''W'''einberger und Brian W. '''K'''ernighan.
Erstellt von Alfred V. '''A'''ho, Peter J. '''W'''einberger und Brian W. '''K'''ernighan
* 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
* Basiert auf der Programmiersprache C
Aufruf in
* 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==
Zeile 54: Zeile 57:
  B Doch !
  B Doch !


==Einzeiler-Kommandos==
== Einzeiler ==
=== Gibt Anzahl der Eingabezeilen zurück ===
=== Anzahl der Zeilen ausgeben ===
  $ '''awk 'END {print NR}''''
  $ '''awk 'END {print NR}''''
  10
  10


=== Zeile Nr. 5 zurückgeben ===
=== Zeile fünf ausgeben ===
  $ awk 'NR == 5'
  $ awk 'NR == 5'
  ----------------------
  ----------------------
  A Was war das?
  A Was war das?


=== Zeilen ab Zeile Nr.6 ausgeben ===
=== Zeilen ab Zeile sechs ausgeben ===
  $ awk 'NR > 6'
  $ awk 'NR > 6'
  ----------------------
  ----------------------
Zeile 72: Zeile 75:
  B Doch !
  B Doch !


=== Zeilen ausgeben mit mehr als 4 Felder ===
=== Zeilen mit mehr als vier Feldern ausgeben ===
  $ awk 'NF > 4'
  $ awk 'NF > 4'
  ----------------------
  ----------------------
Zeile 78: Zeile 81:
  3. Reisig schmeckt am Besten
  3. Reisig schmeckt am Besten


=== Jede Zeile mit einer Zeilennummer versehen ===
=== Zeilen nummerieren ===
  $ awk '{print NR, $0}'
  $ awk '{print NR, $0}'
  -----------------------
  -----------------------
Zeile 94: Zeile 97:
=== Weitere Beispiele ===
=== Weitere Beispiele ===
{| class="wikitable options big"
{| class="wikitable options big"
| awk '{print $2, $3}' my.txt || print 2nd & 3rd fields separated by space
| awk '{print $2, $3}' my.txt || 2. und 3. Feld durch Leerzeichen getrennt ausgeben
|-
|-
| awk '{print $2 "," $3}' my.txt || print 2nd & 3rd field separated by comma
| awk '{print $2 "," $3}' my.txt || 2. und 3. Feld durch Komma getrennt ausgeben
|-
|-
| awk '$2 >100' my.txt || print lines where 2nd field is> 100
| awk '$2 >100' my.txt || Zeilen ausgeben, in denen das zweite Feld größer als 100 ist
|-
|-
| awk '$1==100' my.txt || print lines where 1st field equals to 100
| awk '$1==100' my.txt || Zeilen ausgeben, in denen das erste Feld gleich 100 ist
|-
|-
| awk '/error/' my.txt || print lines containing the word 'error'
| awk '/error/' my.txt || Zeilen ausgeben, die das Wort „Fehler“ enthalten
|-
|-
| awk '{sum=$1+$2; print sum]' my.txt || sum up 1st & 2nd fields of each line
| awk '{sum=$1+$2; print sum]' my.txt || Erstes und zweites Feld jeder Zeile summieren
|-
|-
| awk '{print NR, $0}' my.txt || add line number to each line and print it
| awk '{print NR, $0}' my.txt || Zeilennummer hinzufügen
|-
|-
| awk '[print NF}' my.tzt || print the number of fields in each line
| awk '[print NF}' my.tzt || Die Anzahl der Felder in jeder Zeile ausgeben
|-
|-
| awk '{print $1, $NF}' my.txt || print 1st & last fields
| awk '{print $1, $NF}' my.txt || Erstes und letztes Feld ausgeben
|-
|-
| awk '{s+=$2; c++} END {print s/c}' my.txt || compute average of 2nd field
| 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 || average with condition
| awk '$1>100 {s+=$2; c++} END {print s/c}' my.txt || Durchschnitt mit Bedingung
|-
|-
| awk '{print toupper($2)}' my.txt || print 2nd field in uppercase
| awk '{print toupper($2)}' my.txt || Zweites Feld in Großbuchstaben ausgeben
|-
|-
| awk '$1=="ERR" {print $2}' my.log || print 2nd field if 1st field is "ERR"
| awk '$1=="ERR" {print $2}' my.log || Zweites Feld ausgeben, wenn das erste Feld „ERR“ ist.
|-
|-
| awk '{print "Name:", $1, "Age:", $2}' my.txt || formatted printing
| awk '{print "Name:", $1, "Age:", $2}' my.txt || Ausgabe formatieren
|-
|-
| awk -F"," {print $2, $3}' my.csv || use comma "," as a field separator
| awk -F"," {print $2, $3}' my.csv || Komma „,“ als Feldtrennzeichen.
|-
|-
| awk '{print substr($2,1,3)} my.txt || extract substring from 2nd field
| 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 define a function
| awk function sq(x) {return x*x} {print sq($2)}' my.txt || eine Funktion definieren
|-
|-
| awk 'Iseen[$1]++' my.txt || remote duplicate lines based on 1st field
| awk '!seen[$1]++' my.txt || Duplikate anhand der ersten Zeile entfernen
|-
|-
| awk 'length($2) > 3' my.txt || print lines where length of 2nd field > 3
| awk 'length($2) > 3' my.txt || Zeilen ausgeben, in denen die Länge des zweiten Feldes > 3 ist
|-
|-
| awk '$1- /ERR/' my.log || print lines where 1st field matches pattern
| awk '$1 ~ /ERR/' my.log || Zeilen ausgeben, in denen das erste Feld dem Muster entspricht
|-
|-
| awk '$1!- /ERR/' my.log || print lines where 1st field doesn't match pattern
| awk '$1 ~- /ERR/' my.log || Zeilen ausgeben, in denen das erste Feld nicht mit dem Muster übereinstimmt
|-
|-
| awk '$1- /*[0-9]+$/' my.log || print lines where 1st field is a numeric value
| awk '$1 ~ /*[0-9]+$/' my.log || Zeilen ausgeben, in denen das erste Feld ein numerischer Wert ist
|}
|}


Zeile 145: Zeile 148:


== Wichtige Variablen ==
== Wichtige Variablen ==
[[[gawk]] arbeitet unter der Annahme, dass die Eingabe strukturiert ist
[[gawk]] arbeitet unter der Annahme, dass die Eingabe strukturiert ist
* Jedes Feld ist eine Zeichenfolge, die durch ''Feldseperatoren'' (meistens Leerzeichen oder Tabulator) begrenzt ist
* Jedes Feld ist eine Zeichenfolge, die durch ''Feldseperatoren'' (meistens Leerzeichen oder Tabulator) begrenzt ist


Zeile 198: Zeile 201:
  Doch
  Doch


==Weitere Anwendungen==
== Weitere Anwendungen ==
*Zählt Dateien im Verzeichnis ''usr'' und berechnet den Speicherbedarf:
Zählt Dateien im Verzeichnis ''usr'' und berechnet den Speicherbedarf:
  $ ls -l /usr | awk '{ ++files; sum+=$5 } END { print sum, "Bytes in", files, "Dateien"; }'
  $ ls -l /usr | awk '{ ++files; sum+=$5 } END { print sum, "Bytes in", files, "Dateien"; }'
  ------------------------
  ------------------------
  139264 Bytes in 12 Dateien
  139264 Bytes in 12 Dateien


*Aktueller Fall: Fragen und Antworten mit einer Nummer markieren, um so ihre Zugehörigkeit zu zeigen:
Aktueller Fall: Fragen und Antworten mit einer Nummer markieren, um so ihre Zugehörigkeit zu zeigen:
  {  
  {  
     if($1 ~ /^[0-9]./)
     if($1 ~ /^[0-9]./)
Zeile 213: Zeile 216:
  }
  }


*Ä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 226: Zeile 229:
   }
   }
  }  
  }  
== Links ==
* https://www.instagram.com/reel/DR2Bh6PEZYJ/
   
   
[[Kategorie:Gawk]]
[[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

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:

  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, meist Reguläre Ausdrücke
  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;
   }

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";
  }
} 

Links