Betriebssysteme - Werkzeuge und UNIX-Schnittstelle
==================================================
Werkzeuge
=========
8. awk - Alfred V. Aho, J. Weinberger, Brian W. Kernighan
- - -
=========================================================
Ein Filter oder eine leistungsfähige Programmiersprache?
|
| next | back | 2017 - 1 | Fri Apr 7 14:46:39 CEST 2017 |
Historisches:
1977 von Alfred V. Aho, J. Weinberger, Brian W. Kernighan entwickelt
1985 grundlegend verbessert
1990 aufgenommen in POSIX 1003.2 Command Language And Utilities
Standard
1992 gawk POSIX-konform mit Erweiterungen!!!
1995 verbesserte Version von gawk
1998 verbesserte Version von gawk (POSIX 1003.2 Regel 11.2)
Allgemeines:
- Mit awk lassen sich Dateien nach Textmustern durchsuchen und wenn
diese erkannt werden, verschiedene Aktionen ausführen (ersetzen,
streichen, merken).
- Syntax entspricht in groben Zügen der Syntax von C
- awk wird vorrangig in der Systemprogrammierung zum Bearbeiten von
Konfigurationsdateien eingesetzt.
Weiterhin ist awk für die einmalige komplexe Modifikation von großen
Dateien geeignet.
- awk ist langsam!!!!! Wenn man häufig große Datenbestände mit awk
durchmustern will, sollte man das awk-Programm in ein C-Programm
umformen.
- awk-Programme sind in der Regel kurz!!!!!
|
| next | back | 2017 - 2 | Fri Apr 7 14:46:39 CEST 2017 |
awk-Einführung
--------------
Arbeitsweise von awk:
awk liest die Eingabedatei zeilenweise. Jede Eingabezeile wird in
mehrere Eingabefelder zerlegt. Die Eingabefelder werden mit $1, $2,
$3, ... bezeichnet. $0 bezeichnet die Eingabezeile. Danach wird
für jede Zeile das awk-Programm abgearbeitet und die entsprechenden
Anweisungen ausgeführt.
Aufruf von awk:
awk [-F<Feldseparator>] '<awk-Programm>' {<Datei>}
awk [-F<Feldseparator>] -f <awk-Programm-File> {<Datei>}
<awk-Programm> - vollständiges awk-Programm, kann sich über
mehrere Zeilen erstrecken. <NL> sollte durch
'\' maskiert sein.
-F<Feldseparator> - Feldseparator ist ein Zeichen. Dieses Zeichen
definiert das Trennzeichen zwischen zwei
Eingabefeldern in der Eingabedatei.
Standard ist das Leerzeichen.
a1,a2,a3,a4,a5
-f <awk-Programm-File> - File, das ein awk-Programm enthält
a6
<Datei> - Name der Datei, die bearbeitet werden soll. Wird
keine Datei angegeben, werden die Daten von der
Standardeingabe gelesen. a7
|
| next | back | 2017 - 3 | Fri Apr 7 14:46:39 CEST 2017 |
Einfache awk-Programme
----------------------
awk-Programm:
Folge von Anweisungen der Form:
<Muster> { <Aktion> }
<Muster> { <Aktion> }
.....
oder formal (unvollständig):
<awk-Programm> ::= <Pattern> ["{" <Folge von Anweisung> "}"] |
<awk-Programm> <NL> <Pattern> ["{"<Folge von Anweisung>"}"]
<Folge von Anweisungen> ::= <Anweisung> { "<NL>" <Anweisung> }
<Anweisung> ::= <print-Anweisung> | ...
<Pattern> ::= <arithmetische Vergleiche> | <Textvergleiche> |
"BEGIN" | "END" | ...
<print-Anweisung> ::= print [<Ausdruck> {"," <Ausdruck>}]
Ausgabe unformatiert auf die Standardausgabe. Zwischen
den Ausdrücke wird ein Leerzeichen ausgegeben. Eine
leere print-Anweisung bewirkt die Ausgabe der Eingabe-
zeile.
a8,a9
Built-in-Variable:
NF - Anzahl der Eingabefelder in der aktuellen Zeile
NR - Aktuelle Zeilennummer
a10
|
| next | back | 2017 - 4 | Fri Apr 7 14:46:39 CEST 2017 |
<arithmetische Vergleiche> - "<" und ">"
Arithmetische Ausdrücke können verglichen werden.
<Textvergleich> - "=="
Nur Strings können verglichen werden.
BEGIN-Pattern - Die zum BEGIN-Pattern gehörende Folge von Anweisungen
wird einmal vor dem Lesen der ersten Zeile der Eingabe-
datei abgearbeitet. Initialisierung!!!!
Achtung: BEGIN muß wirklich groß geschrieben werden!!!!
END-Pattern - Die zum END-Pattern gehörende Folge von Anweisungen
wird einmal nach dem Lesen der letzten Zeile der
letzten Eingabedatei abgearbeitet.
Achtung: END muß wirklich groß geschrieben werden!!!!
Variable sind möglich. Werden beim Auftreten definiert. Arithmetische
Variable werden mit Null initialisiert. String-Variable werden mit der
leeren Zeichenkette initialisiert.
a11,a12 a13,a14
arithmetische Operationen: +, -, * , /
<arithmetischer Ausdruck> := <variable> | <Konstante> |
<arithmetischer Ausdruck> <Operator> <arithmetischer Ausdruck>
Verkettungsoperationen für Strings:
<string> string>
a15
|
| next | back | 2017 - 5 | Fri Apr 7 14:46:39 CEST 2017 |
Die Sprache AWK
---------------
<awk-Programm> ::= <Pattern> [ "{" <Folge von Anweisung> "}" ] |
<Funktionsdefinition> |
<awk-Programm> "<NL>" <Pattern>
[ "{" <Folge von Anweisung> "}" ] |
<awk-Programm> "<NL>" <Funktionsdefinition>
<Folge von Anweisungen> ::= <Anweisung> | "#" [<Zeichenkette>] "<NL>" |
<Folge von Anweisungen> { "<NL>" <Anweisung> } |
<Folge von Anweisungen> { ";" <Anweisung> }
Das Pattern und die zugehörige "{" müssen immer auf der selben Zeile stehen.
Wird nach einem Pattern keine <Folge von Anweisungen> angegeben, erfolgt
die Ausgabe der Zeile, auf die das Pattern passt auf Standardausgabe.
a16
Anweisungen werden durch ";" getrennt, wenn sie auf einer Zeile stehen.
Ein ";" am Ende einer einzelnen Anweisung ist nicht schädlich.
Leerzeichen und Tabulatoren können zur Strukturierung des awk-Programms
benutzt werden.
"#" leitet einen Kommentar ein, der bis zum Zeilenende reicht.
a17
|
| next | back | 2017 - 6 | Fri Apr 7 14:46:39 CEST 2017 |
<Pattern> ::= <BEGIN-Pattern> | <END-Pattern> |
<Ausdruck> |
"/"<regulärer Ausdruck>"/" |
<zusammengesetztes Pattern> |
<Bereich>
<BEGIN-Pattern> ::= "BEGIN"
Die zum BEGIN-Pattern gehörende Folge von Anweisungen wird einmal
vor dem Lesen der ersten Zeile des ersten Eingabefiles abgearbeitet.
Der Anweisungsteil darf nicht leer sein!!!!
<END-Pattern> ::= "END"
Die zum END-Pattern gehörende Folge von Anweisungen wird einmal
nach dem Lesen der letzten Zeile des letzten Eingabefiles
abgearbeitet. Der Anweisungsteil darf nicht leer sein!!!!
<Ausdruck> ::= <numerischer Ausdruck> | <String-Ausdruck>
Jeder Ausdruck kann als Pattern benutzt werden. Ist der Wert
des Ausdrucks ungleich Null, wird der Anweisungsteil ausgeführt,
andernfalls nicht. Typische "Ausdrucks-Pattern" sind Vergleiche
(arithmetische und string). Arithmetische Vergleiche werden
ausgeführt, wenn beide Operanden arithmetisch sind, andernfalls
wird ein String-Vergleich ausgeführt.
|
| next | back | 2017 - 7 | Fri Apr 7 14:46:39 CEST 2017 |
Vergleichsoperatoren in Ausdrücken:
Vergleichs- Bedeutung Type
operator
< kleiner als n,s
<= kleiner gleich n,s
== gleich n,s
!= ungleich n,s
> größer als n,s
>= größer gleich n,s
~ rechter String im
linken String enthalten s
!~ rechter String nicht im
linken String enthalten s
Tricks:
Anhängen eines Nullstrings an eine Zahl bewirkt die
Konvertierung der Zahl zu einem String.
Addieren einer Null zu einem String bewirkt die
Konvertierung eines Strings zu einer Zahl.
a18,a19
<regulärer Ausdruck> - siehe oben
Wie reguläre Ausdrücke:
Metazeichen: \ ^ $ . [ ] | ( ) * + ?
Operatoren: A | B (oder), AB (A gefolgt von B)
A* (0 bis n-mal A), A+ (1 bis n-mal A),
A? (0 oder 1-mal A)
Klassen von Zeichen: [a-zA-z], [^a-zA-Z]
a20,a21
|
| next | back | 2017 - 8 | Fri Apr 7 14:46:39 CEST 2017 |
<zusammengesetztes Pattern>::= <Pattern> || <Pattern> |
<Pattern> && <Pattern> |
"!" <Pattern> |
"(" <Pattern> ")"
Zusammensetzen von mehreren Pattern zu einem.
|| - oder
&& - und
! - Verneinung
( .. ) - Klammerung
a22,a23
<Bereich> ::= <Pattern> "," <Pattern>
Hierdurch wird ein Bereich festgelegt, der mit der Zeile
beginnt, für die das erste Pattern paßt und endet mit
der Zeile, für die das zweite Pattern paßt, bzw. bis
zum Fileende. Die zugehörigen Anweisungen werden für alle
Zeilen des Bereichs ausgeführt.
a24,a25
<Anweisung> ::= <Ausdrücke> |
<print-Anweisung> | <printf-Anweisung> |
<getline-Anweisung> | <if-Anweisung> |
<for-Anweisung> | <for-array-Anweisung> | <do-Anweisung> |
<while-Anweisung> | <break-Anweisung> |
<continue-Anweisung> | <next-Anweisung> |
<exit-Anweisung> | "{" <Anweisung> { <Anweisung> }"}"
|
| next | back | 2017 - 9 | Fri Apr 7 14:46:39 CEST 2017 |
<Ausdrücke>
<awk-Operatoren> - Übersicht
Vorzeichen-Operatoren: +, -
Additions-Operatoren: +, -
Multiplikations-Operatoren: *, /, %
Potenz-Operator: ^
a^2 a zum Quadrat
Zuweisungsoperatoren: =, +=, -=, *=, /=, %=, ^=
a+=3 - a = a + 3
Präfix-Operatoren: ++, --
y = ++z - z=z+1; y=z;
Postfix-Operatoren: ++, --
y = z-- - y=z; z=z-1;
Relations-Operatoren: <, <=, ==, !=, >=, >
Match-Operatoren: ~, !~
Bediengungsoperator: ?:
(a?b:c - wenn a dann b sonst c)
|
| next | back | 2017 - 10 | Fri Apr 7 14:46:39 CEST 2017 |
Logische Operatoren: || - logisches oder
&& - logisches und
! - logische Verneinung
Enthaltens-Operator-Array: in - n in array - liefert True,
wenn array[n] existiert
Klammerung: ( )
<Konstante>::=<String-Konstante> | <numerische Konstante>
<String-Konstante> : Zeichenkette in Doppelapostrophs geklammert
z.B. "Passwd", "\npasswd\n"
<numerische-Konstante>: ganze Zahlen, z.B. 123, 1234,4711
Gleitkommanzahlen, z.B. 3.1415, 1.0e-6, 1E-6
<Variable>::=<Normale-Variable> | <Built-in-Variable> | <Felder>
<Normale-Variable> : vom Anwender definierte Variable, Bezeichner
aus Buchstaben, Unterstrichen und Ziffern bestehend,
mit Buchstaben oder Unterstrich beginnend.
z.B. i, i_, i_23
|
| next | back | 2017 - 11 | Fri Apr 7 14:46:39 CEST 2017 |
<Built-in-Variable> : von awk vordefinierte Variable:
ARGC - Anzahl der Argumente
ARGV - Feld der Argumente
ENVIRON - Feld der Umgebungsvariablen
FILENAME - Filename des momentan bearbeiteten Feldes
FNR - Zeilennummer des aktuellen Files
FS - Feldseparator
NF - Anzahl der Felder in der aktuellen Zeile
NR - Anzahl der gelesenen Zeilen insgesammt
OFMT - Ausgabeformat für Zahlen - "%.6g"
OFS - Trennzeichen für Ausgabefelder - " "
ORS - Trennzeichen für Ausgabezeilen - "\n"
RS - Trennzeich für Eingabezeile - "\n"
a26
|
| next | back | 2017 - 12 | Fri Apr 7 14:46:39 CEST 2017 |
<Felder>:
$-Feld: bezeichnet die Eingabezeile
$0 - gesammte Eingabezeile
$1 - erstes Feldelement
$2 - zweite Feldelement
....
a27
Nutzerdefinierte Felder:
awk unterstützt assoziative Felder, die nicht explizite
definiert werden müssen. Sie sind bei der ersten
Benutzung mit Null oder "" initialisiert.
z.B. feld["drei"] = 3; feld["vier"] = 4;
feldn[3] = 3; feldn[4] = 4;
felda[3] = "drei"; felda[4] = "vier";
a28
in-Operator für for-Anweisung:
Ermittelt alle Indizes eines Feldes. Reihefolge ist
Implementationsabhängig. siehe Beispiel
delete-Operation für Felder:
delete feld[index] - das "indexte" Element des Feldes feld
wird gelöscht.
|
| next | back | 2017 - 13 | Fri Apr 7 14:46:39 CEST 2017 |
<print-Anweisung>::=
"print" {<Ausdruck1>} |
"print" {<Ausdruck1>} ">" <Ausgabefile> |
"print" {<Ausdruck1>} ">>" <Ausgabefile> |
"print" {<Ausdruck1>} "|" <Kommando>
print
Ausgabe der Eingabezeile auf die Standardausgabe
entspricht "print $0"
print Ausdruck1, Ausdruck2, ...
Ausgabe der Ausdrücke Ausdruck1, Ausdruck2, ... auf die
Standardausgabe. Zwischen den einzelnen Ausdrücken wird
OFS (Output Field Separator) geschrieben. Nach dem letzten
Ausdruck wird ORS (Output Record Separator geschrieben.
print Ausdruck1, Ausdruck2, ... > Ausgabefile
Ausgabe der Ausdrücke Ausdruck1, Ausdruck2, ... in das
Ausgabefile. Zwischen den einzelnen Ausdrücken wird
OFS (Output Field Separator) geschrieben. Nach dem letzten
Ausdruck wird ORS (Output Record Separator geschrieben.
Der alte Inhalt des Ausgabefiles wird überschrieben.
a29
print Ausdruck1, Ausdruck2, ... >> Ausgabefile
Anfügen der Ausdrücke Ausdruck1, Ausdruck2, ... in das
Ausgabefile. Zwischen den einzelnen Ausdrücken wird
OFS (Output Field Separator) geschrieben. Nach dem letzten
Ausdruck wird ORS (Output Record Separator geschrieben. Die
neuen Daten werden an den Inhalt des Ausgabefiles angefügt.
a30
|
| next | back | 2017 - 14 | Fri Apr 7 14:46:39 CEST 2017 |
print Ausdruck1, Ausdruck2, ... | kommando
Ausgabe der Ausdrücke Ausdruck1, Ausdruck2, ... auf die
Standeingabe des Kommandos kommando. Zwischen den einzelnen
Ausdrücken wird OFS (Output Field Separator) geschrieben.
Nach dem letzten Ausdruck wird ORS (Output Record Separator
geschrieben.
a31
printf-Anweisung
<printf-Anweisung>::=
"printf" "("<format> {,<Ausdruck>} ")" |
"printf" "("<format> {,<Ausdruck>} ")" ">" <Ausgabefile> |
"printf" "("<format> {,<Ausdruck>} ")" ">>" <Ausgabefile> |
"printf" "("<format> {,<Ausdruck>} ")" "|" <Kommando>
Formatgesteuerte Ausgabe von Ausdrücken. Die Formate sind
ähnlich wie bei C.
Der format-String besteht aus Zeichen ungleich "%", die
unverändert ausgegeben werden und Formatsteuerungselemente.
Es folgen die für den format-String notwendigen Ausdrücke.
|
| next | back | 2017 - 15 | Fri Apr 7 14:46:39 CEST 2017 |
Ein Formatsteuerungselement hat folgenden Aufbau:
%FWGU
F - Formatierungszeiche: "-" - linksbündige Justierung
W - Weite: Mindestanzahl der auszugebenden Zeichen
G - Genauigkeit: für Strings - Maximalzahl der auszugebenden
Zeichen
für Zahlen - Anzahl der Stellen nach dem
Komma
Der Wert wird als .<Ziffern> ausgegeben.
U - Umwandlungszeichen:
c - ASCII-Zeichen
d - Dezimalzahl mit Vorzeichen
e - Geitkommanzahl der form [-]d.dddddE[+-]dd
f - Geitkommanzahl der form [-]ddd.dddddd
g - die kürzere Darstellung von e oder f Umwandlung
o - vorzeichenlose Oktalzahl
s - String
x - vorzeichenlose Hexadezimalzahl
% - "%"-Zeichen
printf (format,Ausdruck1, Ausdruck2, ... )
Ausgabe der Ausdrücke Ausdruck1, Ausdruck2, ... unter
Berücksichtigung der Formatelemente in format auf die
Standardausgabe. Es werden keine OFS und ORS geschrieben.
a32
|
| next | back | 2017 - 16 | Fri Apr 7 14:46:39 CEST 2017 |
printf (format,Ausdruck1, Ausdruck2, ... ) > Ausgabefile
Ausgabe der Ausdrücke Ausdruck1, Ausdruck2, ... unter
Berücksichtigung der Formatelemente in format in das
Ausgabefile. Es werden keine OFS und ORS geschrieben.
Der alte Inhalt des Ausgabefiles wird überschrieben.
printf (format,Ausdruck1, Ausdruck2, ... ) >> Ausgabefile
Anfügen der Ausdrücke Ausdruck1, Ausdruck2, ... unter
Berücksichtigung der Formatelemente in format in das
Ausgabefile. Es werden keine OFS und ORS geschrieben.
Die neuen Daten werden an den Inhalt des Ausgabefiles
angefügt.
printf (format,Ausdruck1, Ausdruck2, ... ) | Kommando
Ausgabe der Ausdrücke Ausdruck1, Ausdruck2, ... unter
Berücksichtigung der Formatelemente in format auf die
Standeingabe des Kommandos kommando. Es werden keine
OFS und ORS geschrieben.
Sowohl bei print als auch bei printf kann die Verbindung zur
Ausgabefile bzw. zum Kommando durch:
close(Ausgabefile)
bzw.
close(Kommando)
abgebrochen werden.
|
| next | back | 2017 - 17 | Fri Apr 7 14:46:39 CEST 2017 |
getline-Anweisung
<getline-Anweisung>::= "getline" |
"getline" <Variable> |
"getline" "<" <Dateiname> |
"getline" <Variable> "<" <Dateiname> |
<Kommando> "|" "getline" |
<Kommando> "|" "getline" <Variable>
getline-Anweisung wird benutzt, um von der momentanen Eingabe, von
einem File oder von der Standardausgabe eines Kommandos ein Zeile
zu lesen. Die Zeile kann dabei in den Standardeingabepuffer oder
in eine Variable gelesen werden.
Wird in den Standardeingabepuffer gelesen, wird die Zeile wie gewohnt
in Felder aufgeteilt.
Wird die Zeile in eine Variable gelesen, so findet keine Aufteilung
statt.
Die Variablen NR und FNR werden jeweils weitergezählt.
Die Variable NF wird nur bei der Eingabe in den Standardeingabepuffer
gefüllt.
Rückkehrwert: 1 - eine Zeile gelesen
0 - Dateiende erreicht
-1 - Fehler beim Lesen
|
| next | back | 2017 - 18 | Fri Apr 7 14:46:39 CEST 2017 |
Klammerung von Anweisungen:
<Anweisung>::="{" <Anweisung> { <Anweisung> }"}"| ....
Durch die Klammerung in geschweiften Klammern können
mehrere Anweisungen zu einer Anweisung zusammengefaßt werden.
Dies wird für die nachfolgenden komplexen Anweisungen
benötigt.
if-Anweisung
<if-Anweisung>::= "if" "(" <Ausdruck> ")" <Anweisung 1>
[ "else" <Anweisung 2> ]
Bemerkung zur Syntax:
Für <Anweisung 1> und <Anweisung 2> darf genau eine
Anweisung stehen. Diese kann auch auf einer neuen Zeile
stehen. Stehen <Anweisung 1> und der "else"-Teil auf der
selben Zeile, müssen sie durch ein ";" getrennt werden.
Sollen mehrere Anweisungen auf der Position von
<Anweisung 1> bzw. <Anweisung 2> abgearbeitet werden,
so sind diese zu klammern (siehe oben).
Funktionsweise: Der Ausdruck wird ausgewertet. Ist der Wert
des Ausdrucks ungleich Null oder ein Nicht-Null-String, so
wird die erste Anweisung abgearbeitet, andernfalls wird
die Anweisung nach dem "else"-Teil abgearbeitet, falls
dieser vorhanden ist.
a33,a34
|
| next | back | 2017 - 19 | Fri Apr 7 14:46:39 CEST 2017 |
for-Anweisung
<for-Anweisung>::="for" "(" <Ausdruck 1> ";" <Ausdruck 2> ";"
<Ausdruck 3> ")" <Anweisung>
Bemerkung zur Syntax:
Für <Anweisung> darf genau eine Anweisung stehen. Diese
darf auf einer neuen Zeile stehen. Sollen mehrere
Anweisungen auf der Position von <Anweisung> abgearbeitet
werden, so sind diese zu klammern (siehe oben).
Funktionsweise:
1. <Ausdruck 1> wird berechnet.
2. <Ausdruck 2> wird berechnet. Ist der Wert des
Ausdrucks ungleich Null (True) wird bei 3.
fortgesetzt, sonst wird die for-Anweisung beendet.
3. Abarbeitung des Anweisungsteil
4. Berechnung des <Ausdruck 3> und fortsetzen bei 2.
a27
for-array-Anweisung
<for-array-Anweisung>::= "for" "(" <Variable> "in" <Feld> ")"
<Anweisung>
Funktionsweise:
Der Variablen wird nacheinander die existierenden Indizes
des Feldes zugewiesen. Jedesmal wird anschließend die
Anweisung abgearbeitet. Die Reihenfolge des Indizes ist
unbestimmt (implementations-abhängig).
a28
|
| next | back | 2017 - 20 | Fri Apr 7 14:46:39 CEST 2017 |
do-Anweisung
<do-Anweisung>::="do" <Anweisung> "while" "("<Ausdruck>")"
Funktionsweise:
1. Abarbeiten der Anweisung.
2. Berechnung des Ausdrucks.
3. Wenn der Ausdruck ungleich Null ist (True), wird bei 1.
fortgesetzt, sonst wird die do-Anweisung beendet.
a35
while-Anweisung
<while-Anweisung>::="while" "("<Ausdruck>")" <Anweisung>
Funktionsweise:
1. Berechnung des Ausdrucks.
2. Wenn der Ausdruck ungleich Null ist (True), wird 3.
ausgeführt, sonst wird die while-Anweisung beendet.
3. Abarbeiten der Anweisung und fortfahren bei 1.
a35
|
| next | back | 2017 - 21 | Fri Apr 7 14:46:39 CEST 2017 |
break-Anweisung
<break-Anweisung>::="break"
Funktionsweise:
Sofortiges Verlassen der aktuellen Schleifenanweisung
(for-Anweisung, while-Anweisung, do-Anweisung). Bei
mehrfach ineinander geschachtelten Schleifenanweisungen
wird nur die innerste Schleife verlassen.
a35
continue-Anweisung
<continue-Anweisung>::= "continue"
Funktionsweise:
Die continue-Anweisung bewirkt das Beenden des aktuellen
Schleifendurchlaufs bei einer Schleifenanweisung (for-Anweisung,
while-Anweisung, do-Anweisung). Anschließend werden die
notwendigen Ausdrücke berechnet und eventuell mit dem
nächsten Schleifendurchlauf fortgesetzt.
a36
|
| next | back | 2017 - 22 | Fri Apr 7 14:46:39 CEST 2017 |
next-Anweisung
<next-Anweisung>::="next"
Funktionsweise:
Es wird sofort die nächste Eingabezeile gelesen und mit
der Auswertung des ersten Patterns des awk-Programms
fortgesetzt. Bei EOF wird awk beendet.
a37
exit-Anweisung
<exit-Anweisung>::="exit" [<Ausdruck>]
Funktionsweise:
Beenden des awk-Programms. Befindet sich die exit-Anweisung
in einem END-Anweisungs-Teil, wird die das awk-Programm
sofort beendet. In allen anderen Teilen eines awk-Programms
bewirkt die exit-Anweisung die sofortige Verzweigung zum
END-Anweisungs-Teil, wenn dieser vorhanden ist, sonst
ebenfalls die sofortige Beendigung des awk-Programms.
Ist ein Ausdruck in der exit-Anweisung spezifiziert, wird
dieser als Rückkehrkode von awk benutzt.
a38,a39
|
| next | back | 2017 - 23 | Fri Apr 7 14:46:39 CEST 2017 |
built-in-Funktionen
-------------------
In awk vordefinierte Funktionen. Werden von awk mitgeliefert. Die
Zahl ist unterschiedlich.
arithmetische built-in-Funktionen
atan2(x,y) - Arcustangens von x/y
cos(x) - Cosinus von x im Bogenmaß
sin(x) - Sinus von x im Bogenmaß
exp(x) - Exponential-Funktion e hoch x
log(x) - natürlicher Logarithmus von x: ln x
int(x) - ganzzahliger Anteil von x
sqrt(x) - Quadratwurzel von x
rand() - Zufallszahl im Intervall von 0 bis 1
srand(x) - neuer Startwert x für den Zufallszahlen-
generator
a40
|
| next | back | 2017 - 24 | Fri Apr 7 14:46:39 CEST 2017 |
String built-in-Funktionen
re - regulärer Ausdruck s1,s2 - Strings ar - Feld
tr - Trennzeichen n1,n2 - ganze Zahlen
gsub(re,s1,s2) - Ersetzt im String s2 den regulären Ausdruck re
durch den String s1
Rückkehrwert: Anzahl der Ersetzungen
gsub(re,s1) - wie gsub, aber anstelle von s2 wird $0
benutzt
Rückkehrwert: Anzahl der Ersetzungen
index(s1,s2) - Sucht das erste Auftreten des Strings s2
in s1
Rückkehrwert: Anfangsposition von s2 in s1
length(s1) - Berechnet die Länge von s1
Rückkehrwert: Länge des Strings s1
match(s1,re) - prüft, ob der String s1 einen Teilstring
enthält, der mit re "matchet".
Rückkehrwert: Anfangsposition des Teilstrings
oder 0
split(s1,ar,tr) - Zerlegt den String s1 entsprechend dem Trennzeichen
tr in ein Feld ar.
Rückkehrwert: Anzahl der Feldelemente
|
| next | back | 2017 - 25 | Fri Apr 7 14:46:39 CEST 2017 |
split(s1,ar) - wie split(s1,ar,tr), aber als Trennzeichen wird FS
genommen.
Rückkehrwert: Anzahl der Feldelemente
sprintf(fmt,format-liste) - Formatierte Ausgabe
Rückkehrwert: Ergebnis der Ausgabe als String
sub(re,s1,s2) - Substitution des am weitesten links stehenden
längsten Strings re durch den String s1 im String s2
Rückkehrwert: Anzahl der Ersetzungen
sub(re,s1) - wie sub(re,s1,s2), aber in $0
Rückkehrwert: Anzahl der Ersetzungen
substr(s1,n1,n2) - schneide aus String s1 ab der Position n1 einen
String der Länge n2 aus
Rückkehrwert: Ausgeschnittene Teilstring
substr(s1,n1) - liefert ab Position n1 den Rest des Strings s1
Rückkehrwert: Rest des Strings ab Position n1
tolower(s1) - Konvertieren der Großbuchstaben in Kleibuchstaben
s1 bleibt unverändert
Rückkehrwert: Konvertierte String s1
toupper(s1) - Konvertieren der Kleibuchstaben in Großbuchstaben
s1 bleibt unverändert
Rückkehrwert: Konvertierte String s1
a41
|
| next | back | 2017 - 26 | Fri Apr 7 14:46:39 CEST 2017 |
<Funktionsdefinition>
Benutzer definierte Funktionen. Können bei Bedarf in das awk-Program
eingefügt werden, auch als File mit Funktionsdefinitionen.
<Funktionsdefinition>::="function" <Funktionsname>"("<Parameterlist>")"
"{" <Anweisung> { <Anweisung> }"}"
"return" <Ausdruck>
a42
Funktionsbibliothek
Eine Funktionsbibliothek ist ein File mit nützlichen Funktionen, das wie
das eigentliche awk-Script mittels einer -f Option beim awk-Aufruf
angegeben wird, es sind also mehrere -f Optionen zulässig.
awk -f /home/unixsoft/bell/awklib -f prog.awk beispieldatei
a43
|
| next | back | 2017 - 27 | Fri Apr 7 14:46:39 CEST 2017 |
Vollständiger Programmaufruf von awk
------------------------------------
awk [POSIX-Optionen oder GNU-Optionen] [--] 'program' file ...
Optionen:
-f progfile, --file=progfile
File mit awk-Programm, mehrer derartiger Optionen sind
möglich
-F<fs>, --field-separator=fs
Feldseparator, Standard ist Leerzeichen
-v var=val, --assign=var=val
Definition einer awk-Variablen <var> mit dem Wert <val> vor
Begin der Abarbeitung des awk-Programms
-mf val
Maximalwert für die Anzahl von Feldern in einer Zeile
-mr val
Maximalwert für die Länge eines Satzes
-W compat, --compat
Kompatibilitätsmodus, gawk verhält sich wie awk
-W copyleft, --copyleft
Ausgabe des kurzen Copyrights
|
| next | back | 2017 - 28 | Fri Apr 7 14:46:39 CEST 2017 |
-W copyright, --copyright Ausgabe des langen Copyrights -W version, --version Ausgabe der Versionsinformationen -W dump-variables[=file], --dump-variables[=file] -W gen-po, --gen-po -W help , --help -W usage, --usage Ausgabe einer kurzen Hilfe-Information -W lint[=fatal], --lint[=fatal] Ausgabe von Warnungen für awk-Konstruktionen, die nicht portable sind. -W lint-old, --lint-old Ausgabe von Warnungen für awk-Konstruktionen, die nicht mit dem ursprünglichen awk verträglich sind. -W non-decimal-data, --non-decimal-data -W profile[=file], --profile[=file] -W posix, --posix Posix-Kompatibilitätsmodus - nur reguläre Ausdrücke im POSIX- Format werde unterstützt. |
| next | back | 2017 - 29 | Fri Apr 7 14:46:39 CEST 2017 |
-W re-interval, --re-interval
Intervall-Ausdrücke in Regulären Asudrücken erlauben
-W source=program-text, --source=program-text
wie -f Option - awk-Programmtext
-W traditional, --traditional
Reguläre Ausdrücke entsprechend dem ursprünglichen awk-Format
werden unterstützt.
Abschlußbeispiele
-----------------
1. Verwaltung der Datenbasis eines DNS-Servers:
add_dns <Hostname> - hinzufügen eines neuen Hosts zur Datenbasis
add_dns.awk - modifizieren von db.informatik
add_dns1.awk - modifizieren von db.141.20.xx
del_dns <Hostname> - streichen eines Hosts aus der Datenbasis
|
| back | 2017 - 30 | Fri Apr 7 14:46:39 CEST 2017 |