Kapitel 1 Erste Schritte1.1 Was ist awk?awk ist ein Werkzeug zum Bearbeiten von strukturierten Texten, wie z.B. Datensätzen für FE-Programme. Es bietet Such- und Ersetzungsfunktionen, formatiertes und unformatiertes Einlesen und Herausschreiben und eine mächtige Skriptsprache. All diese Dinge können je nach Gusto und Anforderungen des Benutzers beliebig einfach oder kompliziert gehalten werden. awk-Skripte können auf verschiedene Weise aufgerufen werden:
Die Shell ermöglicht es, den awk-Aufruf direkt in den Kopf der Skriptdatei zu schreiben. Steht in der ersten Zeile des Skripts #!/bin/awk -f so kann die Skriptdatei direkt mit Namen aufgerufen werden. Die Skriptdatei muss dann für den Benutzer ausführbar und lesbar sein (r-x oder oktal 5). Außerdem wurde hier angenommen, dass sich awk unter /bin/ befindet. Wer Zweifel hat, wo sein awk liegt, sagt which awk. 1.2 Wie arbeitet awk?awk liest die Daten zeilenweise aus der angegebenen Textdatei ein. In jeder Zeile wird das Skript ausgeführt. Die Anweisungen im Skript haben dabei die Form [Bedingung] { [Anweisung(en)] } Ist die [Bedingung] erfüllt, so werden die [Anweisungen] in den geschweiften Klammern ausgeführt. Fehlt die Bedingung, so werden die Anweisungen für jede Zeile ausgeführt. Fehlt der Anweisungsteil in geschweiften Klammern, so wird die Zeile, die die Bedingung erfüllt, einfach ausgegeben. Eine typische Anweisung ist print, das einfach die eigelesene Zeile ausgibt. Wie oben beschrieben, kann { print } einfach weggelassen werden. Ein Beispiel für eine typische Bedingung ist /[text]/. Diese Bedingung ist wahr, wenn der String [text] im der eingelesenen Zeile auftaucht. Unser erstes awk-Skript soll einfach alle Zeilen der Datei xyz.dat ausgeben, die das Wort »NODE« enthalten: awk '/NODE/ { print }' xyz.dat Da { print } weggelassen werden kann, kann man dies verkürzen zu awk '/NODE/' xyz.dat Dieses awk-Skript ist natürlich äqivalent zum Shell-Befehl grep 'NODE' xyz.dat Das noch viel einfachere awk '{ print }' xyz.dat ist dasselbe wie cat xyz.dat wobei hier { print } nicht ausgelassen werden kann, da sonst das Skript leer wäre, was awk interpretiert als »mache gar nichts«. 1.3 awk findet WörterWenn awk eine Zeile einliest, so schreibt es sie auf die Variable $0. Außerdem teilt awk die Zeile automatisch in Wörter (oder »Felder«) auf, die $1, $2, $3 usw. heißen. Ein Wort ist dabei alles, was zwischen zwei Leerzeichen steht. Weiterhin werden folgende Variablen belegt: NF (Number of Fields) ist die Anzahl der Wörter, in die die Zeile aufgeteilt wurde. NR (Number of Records) ist die Zeilennummer der momentan eingelesenen Zeile. Eine Zeile wird in awk oft als Record, Eintrag, bezeichnet. awk berücksichtigt Groß- und Kleinschreibung. So ist NF die Anzahl der Felder; nf, Nf und nF sind es nicht. Wenn die Zeile also (Fischers Fritz fischt frische Fische.) heißt, so ist NF fünf. Satzzeichen gehören zu den Wörtern, deshalb heißt das letzte Wort "Fische.)", nicht bloß "Fische". awk hat also keine menschlichen Lesegewohnheiten. Das Skript awk '{print $NF}' xyz.dat schreibt übrigens das letzte Wort jeder Zeile heraus. An diesem Skript kann man sehen, dass nach dem Dollar anstelle einer Zahl auch eine Variable stehen kann, und dass print nicht nur alleine stehen kann, sondern konkret angegeben werden kann, was ausgegeben werden soll. print ohne alles ist also nur eine Abkürzung für print $0. Aufgaben: Aufgabe 1a Aufgabe 1b
|
|