24.02.2013 Aufrufe

Einf ¨uhrung in UNIX - CIS

Einf ¨uhrung in UNIX - CIS

Einf ¨uhrung in UNIX - CIS

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

2.7 Writer’s Workbench 137<br />

E<strong>in</strong> awk(1)-Befehl besteht aus den Teilen Muster und Aktion. Jede E<strong>in</strong>gabezeile,<br />

auf die das Muster zutrifft, wird entsprechend der Aktion behandelt.<br />

Die Ausgabe geht auf stdout. E<strong>in</strong> Beispiel:<br />

awk ’{if (NR < 8) pr<strong>in</strong>t $0}’ myfile<br />

Das File myfile wird Zeile für Zeile gelesen. Die vorgegebene awk(1)-<br />

Variable NR ist die Zeilennummer, beg<strong>in</strong>nend mit 1. $0 ist die ganze jeweilige<br />

Zeile. Falls die Zeilennummer kle<strong>in</strong>er als 8 ist, wird die Zeile nach stdout<br />

geschrieben. Es werden also die ersten 7 Zeilen des Files ausgegeben. Nun<br />

wollen wir das letzte Feld der letzten Zeile ausgeben:<br />

awk ’END {pr<strong>in</strong>t $NF}’ myfile<br />

Das Muster END trifft zu, wenn die letzte Zeile verarbeitet ist. Üblicherweise<br />

betrifft die zugehörige Aktion irgendwelche Abschlußarbeiten. Die Variable<br />

NF enthält die Anzahl der Felder der Zeile, die Variable $NF ist also das<br />

letzte Feld. Nun wird es etwas anspruchsvoller:<br />

awk ’$1 != prev { pr<strong>in</strong>t; prev = $1 }’ wortliste<br />

Das File wortliste enthalte <strong>in</strong> alphabetischer Folge Wörter und gegebenenfalls<br />

weitere Bemerkungen zu den Wörtern, pro Wort e<strong>in</strong>e Zeile. Der<br />

awk(1) liest das File zeilenweise und spaltet jede Zeile <strong>in</strong> durch Spaces oder<br />

Tabs getrennte Felder auf. Die Variable $1 enthält das erste Feld, also hier<br />

das Wort zu Zeilenbeg<strong>in</strong>n. Falls dieses Wort von dem Wort der vorangegangenen<br />

Zeile abweicht (Variable prev), wird die ganze Zeile ausgegeben und<br />

das augenblickliche Wort <strong>in</strong> die Variable prev gestellt. Zeilen, die im ersten<br />

Feld übere<strong>in</strong>stimmen, werden nur e<strong>in</strong>mal ausgegeben. Dieser awk(1)-Aufruf<br />

hat e<strong>in</strong>e ähnliche Funktion wie das <strong>UNIX</strong>-Kommando uniq(1). Da Variable<br />

mit dem Nullstr<strong>in</strong>g <strong>in</strong>itialisiert werden, wird auch die erste Zeile richtig<br />

bearbeitet.<br />

Wenn die Anweisungen an den awk(1) umfangreicher werden, schreibt<br />

man sie <strong>in</strong> e<strong>in</strong> eigenes File (awk-Script). Der Aufruf sieht dann so aus:<br />

awk -f awkscript textfiles<br />

awk-Scripts werden <strong>in</strong> e<strong>in</strong>er Sprache geschrieben, die teils an Shellscripts,<br />

teils an C-Programme er<strong>in</strong>nert. Sie bestehen – wie e<strong>in</strong> deutscher Schulaufsatz<br />

– aus E<strong>in</strong>leitung, Hauptteil und Schluß. Sehen wir uns e<strong>in</strong> Beispiel an, das<br />

mehrfache E<strong>in</strong>tragungen von Stichwörtern <strong>in</strong> e<strong>in</strong>em Sachregister aussortiert<br />

und die zugehörigen Seitenzahlen der ersten E<strong>in</strong>tragung zuordnet:<br />

# awk-Script fuer Sachregister<br />

BEGIN { ORS = ""<br />

pr<strong>in</strong>t "Sachregister"<br />

}<br />

{<br />

if ($1 == altwort)

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!