Gawk/Beispiele: Unterschied zwischen den Versionen
Erscheinungsbild
	
	
Keine Bearbeitungszusammenfassung  | 
				K Textersetzung - „angewendet“ durch „angewandt“  | 
				||
| (75 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.  | ||
**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  | ||
* 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 20: | Zeile 22: | ||
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 26: | Zeile 28: | ||
             ...  |              ...  | ||
            }  |             }  | ||
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";  | |||
   }  | |||
 }   | |||
[[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";
  }
}