Galileo Computing < openbook >
Galileo Computing - Bücher zur Programmierung und Softwareentwicklung
Galileo Computing - Bücher zur Programmierung und Softwareentwicklung


'Wie werde ich Unix-Guru' als Buch bestellen
A. Willemer
Wie werde ich UNIX-Guru
I  ANWENDUNG
Know-How für Unix/Linux-User: Einführung, Shell, Befehle, Hilfe, Arbeit mit Dateien, Editoren, Reguläre Ausdrücke, nützliche Tools, Hardware.

II  ADMINISTRATION
Tools, Systemstart, Benutzer verwalten, Hardware konfigurieren, Software installieren, Datensicherung, Tuning, Kernel

III  NETZWERK
Client/Server Systeme, TCP/IP, Routing, IPv6, Internet-Dienste, DHCP, Webserver, Firewalls

IV  DAS X-WINDOW SYSTEM
Die grafische Oberfläche von UNIX einrichten und nutzen

V  PROGRAMMIERUNG VON SHELLSKRIPTEN
Automatisieren von Tasks durch Shell-Skripte.

VI  PERL
Interpreter, Syntax, Variablen, Steuerung, Funktionen, UNIX-Aufrufe, GUIs mit Tk

VII  PROGRAMMIERWERKZEUGE
C-Compiler, Analyse-Tools, CVS, yacc, diff

VIII  UNIX-SYSTEMAUFRUFE
UNIX-Befehle in eigenen Programmen nutzen

IX  LITERATUR
Weiterführende Literatur zu UNIX und LINUX

 
Galileo Computing / <openbook> / "Wie werde ich UNIX-Guru ?"
« sed Praktische Helfer Weitere Werkzeuge im Überblick »

Unterabschnitte
  • Das Hochkomma
  • Selektion: Auswahl von Zeilen
  • Projektion: Auswahl von Spalten
  • Kombination von Kommandos
  • Variablen
  • Start-, Standard- und Endanweisungen
  • Eingebaute Funktionen
  • Ausführung von Programmdateien

awk

Das Programm awk ist ein Werkzeug zur Auswertung von Textdateien, die wie Datenbanktabellen behandelt werden. Der Name des Programmes setzt sich aus den Anfangsbuchstaben der Nachnamen seiner prominenten Entwickler Aho, Weinberger und Kernighan zusammen. Das Programm awk ist in der Lage, aus einer Datei Spalten und Zeilen auszuwählen und darüber Auswertungen durchzuführen. Im Grunde ist es ein grep, das um die Fähigkeit erweitert wurde, auf Texte innerhalb der gefundenen Zeilen zuzugreifen, sie in Variablen aufzunehmen und zu verarbeiten. awk besitzt darüber hinaus eine kleine Programmiersprache, sodass auch Fallunterscheidungen oder Ähnliches leicht zu realisieren sind.

Wie das aber bei flexiblen und leistungsstarken Programmen so ist, fühlt man sich auch leicht von der Komplexität der Möglichkeiten erschlagen. Dennoch lohnt sich ein Blick auf dieses Programm, da es bestimmte Probleme mit erstaunlich wenig Aufwand lösen kann.

awk betrachtet wie gesagt eine Textdatei als Datenbanktabelle aus Zeilen und Spalten. Die Zeilen sind durch den Zeilentrenner bestimmt, der unter UNIX übrigens mit dem Linefeed codiert wird (ASCII-Zeichen 10). Zwei Spalten werden aus der Sicht von awk und auch anderer UNIX-Werkzeuge durch ein oder mehrere Leerzeichen oder Tabulatorzeichen getrennt.

awk kann wie grep anhand eines Suchbegriffes Zeilen aus einer Datei heraussuchen. Dazu wird der Suchbegriff in Schrägstriche eingeschlossen, was wiederum vom sed bekannt vorkommt. In geschweiften Klammern können Spalten ausgegeben werden. Der gesamte Befehl wird wiederum in Hochkommata eingeklammert, damit die Shell nicht daran herumwerkelt. Beispiel:

awk '/Willemer/ {print $3}' telefon

Dieser Befehl gibt für alle Zeilen der Datei telefon, in denen die Zeichenfolge Willemer steht, die dritte Spalte aus. Die Datei telefon ist eine einfache Textdatei, in der Name, Vorname und Telefonnummer in jeder Zeile stehen. Im Folgenden sehen Sie einen kurzen Ausschnitt:

Müller Anton 0987-6543
Schmidt Erwin 01234-5678
Willemer Arnold 04632-110

Das Hochkomma

Im Allgemeinen bestehen die Argumente von awk aus mehr als einem Wort. Da die Shell durch Leerzeichen getrennte Eingaben dem Programm separat übergibt, wird ein Argument, das aus mehreren Wörtern besteht, in Anführungszeichen oder in Hochkommata eingeschlossen. Diese sind auch hilfreich, wenn das Kommando über mehrere Zeilen geht, da die Shell den Befehl erst als abgeschlossen ansieht, wenn das zweite Hochkomma erscheint. Man verwendet übrigens bei awk das Hochkomma statt des Anführungszeichens, da die Shell in Anführungszeichen auch Umgebungsvariablen auswertet. Das wird durch Hochkommata ausgeschlossen.

Selektion: Auswahl von Zeilen

Das Kommando zur Selektion wird gegeben, indem der Suchstring in Schrägstriche gesetzt wird. Unter einer Selektion versteht man die Auswahl der Zeilen einer Tabelle.

awk /Willemer/ telefon

Alle Zeilen mit der Zeichenfolge Willemer in der Datei telefon werden ausgegeben. Wird kein Suchstring angegeben, werden alle Zeilen angezeigt. Im Suchbegriff können reguläre Ausdrücke verwendet werden (siehe S. regexp).

Würde die Datei telefon alle Telefonnummern enthalten, würde nach der Ausführung des Befehls meine gesamte Verwandtschaft einträchtig beisammen stehen, wie das im Leben vielleicht nicht der Fall wäre. Sind Computer nicht etwas Wunderbares?

Projektion: Auswahl von Spalten

Zur Projektion muss die Spalte angegeben werden und ein Kommando, was mit ihr passieren soll. Als Spaltentrenner gilt jede beliebige Kombination von Tabulatorzeichen oder Leerzeichen. Das einfachste Kommando ist die Ausgabe mittels print. Die Spalte wird durch deren Nummer und ein vorgestelltes Dollarzeichen bezeichnet. Die Zählung beginnt bei 1, da $0 die gesamte Zeile bezeichnet. Aktionen werden immer in geschweifte Klammern gesetzt. Die dritte Spalte einer Datei wird also folgendermaßen ausgegeben:

awk '{print $3}'

Es ist möglich, mehrere Befehle in einer geschweiften Klammer zu setzen. Dabei sind die Kommandos jeweils durch ein Semikolon zu trennen.

Kombination von Kommandos

Die Kombination beider Optionen ist möglich.

awk '/Willemer/ {print $3}' telefon

Das bereits bekannte Beispiel selektiert also nach der Zeichenfolge Willemer und führt in allen Zeilen, auf die die Selektion zutrifft, den Inhalt der geschweiften Klammer aus. Dieser besagt, dass die dritte Spalte ausgegeben werden soll.

Variablen

Innerhalb des awk-Kommandos können Variablen verwendet werden. Variablen sind dem Programmierer aus den Programmiersprachen vertraut. Es sind einfach Speicherplätze für Informationen wie Zahlen oder Zeichenfolgen. Um auf diese Speicher zugreifen zu können, verwendet man Namen. Solche Variablen kennt auch awk, und sie können beispielsweise zur Bildung von Summen eingesetzt werden. Eine Deklaration, wie in vielen Programmiersprachen, ist nicht erforderlich.

Auch die Shell kennt Variablen, wie später näher erläutert wird. Im Gegensatz zu den Umgebungsvariablen der Shell wird den Variablen von awk kein Dollarzeichen zur Auswertung vorangestellt. Im folgenden Beispiel ist anzahl eine Variable, die dort zum Zählen der Tage verwendet wird.

Start-, Standard- und Endanweisungen

Man kann drei Typen von Anweisungen unterscheiden. Die Standardanweisung wurde bereits vorgestellt. Dieser Typ wird auf jede selektierte Zeile angewandt. Daneben gibt es noch die Startanweisung, die genau einmal vor der ersten Verarbeitung ausgef"uhrt wird und der man das Schlüsselwort BEGIN voranstellt. Die Endanweisung wird durch das Schlüsselwort END eingeleitet. Hier ein Beispiel:

gaston> awk 'BEGIN{print"Wir zählen Tage!"; anzahl=0}
     {print $1;anzahl++}
     END{print "Das waren " anzahl " Tage"}' tage
Wir zählen Tage!
montag
dienstag
mittwoch
donnerstag
freitag
samstag
sonntag
Das waren 7 Tage
gaston>

Die Datei tage enthält in der ersten Spalte die Wochentage. Bei BEGIN wird die lokale Variable anzahl auf null gesetzt. Das ist allerdings an sich nicht nötig, da Variablen bei awk standardmäßig mit null vorbesetzt sind. In der Standardanweisung wird nicht nur die erste Spalte ausgegeben, sondern parallel dazu die Variable anzahl um eins erhöht. Die END-Anweisung wird benutzt, um die Anzahl der Tage auszugeben.

Ein weiteres Beispiel soll die Summe aller Dateilängen mit der Endung gnt bilden. In diesem Fall wird awk an eine Pipe gehängt. Man gibt in der ersten Zeile das Kommando, um ein Verzeichnis in seiner Langform anzusehen. Das Ergebnis wird awk per Pipe zugeschoben. In der Standardanweisung von awk wird eine Variable um den Wert in der fünften Spalte erhöht. Die Endanweisung gibt diese Variable aus.

ls -l *.gnt | awk '{sum+=$5}END{print sum}'

Die Suche nach gnt könnte natürlich auch von awk übernommen werden. Dann hie"se der Befehl:

ls -l  | awk '/gnt/ {sum+=$5} END{print sum}'

Der Unterschied besteht darin, dass in diesem Fall Zeilen, in denen irgendwo gnt (beispielsweise im Gruppennamen) vorkommt, auch mitgerechnet werden.

Eingebaute Funktionen

awk hat einige eingebaute Funktionen, deren Syntax sehr an C erinnert.

[awk-Funktionen]L|L Funktion & Wirkung
print & Anzeigen
printf & Entspricht der C-Funktion printf
sprintf & für die Speicherung von Ausgaben in einer Variablen
length(s) & ermittelt die Länge einer Zeichenkette
substr(s, anf, anz) & Teilstringbildung
index(s, t) & gibt die Stelle an, an der in s die Zeichenkette t beginnt
sqrt(n) & Wurzel
log(n) & natürlicher Logarithmus
exp(n) & $e^n$
int(n) & ganzzahliger Anteil

Ausführung von Programmdateien

Mit den Variablen und Befehlen kann man komplexe Programme erzeugen. Damit diese nicht jedes Mal neu eingegeben werden m"ussen, kann man Dateien mit den auszuführenden Aktionen schreiben. Der Dateiname wird awk mit der Option -f als Parameter übergeben.

awk -f awkprg

In diesem Beispiel stehen in der Datei awkprg die Befehle, die durch awk abgearbeitet werden sollen.



« sed | Praktische Helfer | Weitere Werkzeuge im Überblick »
 
 Zum Katalog
Zum Katalog
Wie werde ich UNIX-Guru?
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 UNIX/Linux

PHP 4-Workshop

Einstieg in Python

Perl fürs Web

MySQL 4

GNOME 2.0
 Empfehlung

Einstieg in XML
 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
Info

 MyGalileo
Der Service für registrierte Leser:
Zu MyGalileo
Info



Copyright © Galileo Press GmbH 2003
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.
[Galileo Computing]

Galileo Press GmbH, Gartenstraße 24, 53229 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de