Gawk/Beispiele: Unterschied zwischen den Versionen

Aus Foxwiki
K (Textersetzung - „angewendet“ durch „angewandt“)
 
(58 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
AWK ist eine Programmiersprache um Textdateien zu ändern.
'''awk''' ist eine Programmiersprache zur Veränderung von Textdateien


==Einführung==
==Einführung==
*AWK kann man aufrufen durch
* 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==
Die allgemeine Syntax lautet:
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 39: Zeile 41:
     }
     }


==Anwendungen==
==Anwendungsfälle==
Eine einfache Textdatei:
Eine einfache Textdatei:
  1. Hier ist ein Text mit Inhalt
  1. Hier ist ein Text mit Inhalt
Zeile 53: Zeile 55:


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


#Zeile Nr. 5 zurückgeben
==== 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
==== Zeilen ab Zeile Nr.6 ausgeben ====
  $ awk 'NR > 6'
  $ awk 'NR > 6'
  ----------------------
  ----------------------
Zeile 71: Zeile 72:
  B Doch !
  B Doch !


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


#Jede Zeile mit einer Zeilennummer versehen
==== Jede Zeile mit einer Zeilennummer versehen ====
  $ awk '{print NR, $0}'
  $ awk '{print NR, $0}'
  -----------------------
  -----------------------
Zeile 90: Zeile 91:
  9 A Nein, stimmt nicht
  9 A Nein, stimmt nicht
  10 B Doch !
  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===
===Wichtige Variablen===
*awk arbeitet unter der Annahme, dass die Eingabe strukturiert ist
*awk arbeitet unter der Annahme, dass die Eingabe strukturiert ist
*Jedes Feld ist eine Zeichenfolge, die durch ''Feldseperatoren'' begrenzt ist
*Jedes Feld ist eine Zeichenfolge, die durch ''Feldseperatoren'' (meistens Leerzeichen oder Tabulator) begrenzt ist
*'''$''' ist der ''Feldoperator''
*'''$''' ist der ''Feldoperator''
*$1 ist das erste Feld.
*$1 ist das erste Feld.
*$0 steht für die gesamte Zeile, die gerade bearbeitet wird.
*$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, 12: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:

  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

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