{"id":8654,"date":"2021-09-03T16:21:21","date_gmt":"2021-09-03T16:21:21","guid":{"rendered":"https:\/\/profi-tutorials.de\/linux\/?p=8654"},"modified":"2021-09-03T16:21:21","modified_gmt":"2021-09-03T16:21:21","slug":"befehl-gawk","status":"publish","type":"post","link":"https:\/\/profi-tutorials.de\/linux\/administration\/befehl-gawk\/","title":{"rendered":"Der Befehl gawk"},"content":{"rendered":"<p>In diesem Beitrag lernen Sie den Befehl awk bzw. gawk kennen &ndash; es handelt sich um die GNU-Implementierung der AWK Programmiersprache. Sie ist konform mit der Definition der Sprache im POSIX 1003.1 Standard und basiert auf der Beschreibung in &ldquo;The AWK Programming Language&rdquo; von Aho, Kernighan und Weinberger. gawk bietet die zus&auml;tzlichen Funktionen der aktuellen Version von Brian Kernighan&rsquo;s awk sowie verschiedene GNU-spezifische Erweiterungen. Wenn gawk installiert ist, ist awk oft nur ein Symlink zu gawk, sodass mit beiden Befehlen dasselbe Programm aufgerufen wird. Im Folgenden wird immer gawk verwendet. Zudem werden GNU-Erweiterungen entsprechend gekennzeichnet.<\/p>\n<p>Die Grundfunktion von AWK besteht darin, Dateien nach Zeilen oder anderen Texteinheiten zu durchsuchen, die bestimmte Muster aufweisen. Gibt es &Uuml;bereinstimmungen mit einem Muster, so kann AWK bestimmte Aktionen auf diesen ausf&uuml;hren. AWK f&uuml;hrt auf diesem Weg mit der Verarbeitung der Eingabe fort, bis das Ende der Eingabe(-Dateien) erreicht ist. Programme in AWK sind datengesteuert &ndash; es werden also die Daten mit denen gearbeitet werden soll sowie die jeweils durchgef&uuml;hrten Aktionen beschrieben. Auf diese Weise unterscheidet sich AWK sich von prozeduralen Sprachen, bei denen das Vorgehen von Programmen in der Regel sehr genau beschrieben wird. AWK-Programme sind entsprechend oft einfacher zu lesen und zu schreiben.<\/p>\n<p>Sie lernen zun&auml;chst die allgemeine <a class=\"glossaryLink cmtt_Allgemein cmtt_Informatik\" aria-describedby=\"tt\" data-cmtooltip=\"&lt;div class=glossaryItemTitle&gt;Syntax&lt;\/div&gt;&lt;div class=glossaryItemBody&gt;&#8203;Im  Allgemeinen wird unter Syntax ein Regel&#8203;system verstanden, welches zur  Kombination elementarer Zeichen zu zusammengesetzten &#8203;Zeichen in (...)&lt;\/div&gt;\" href=\"https:\/\/profi-tutorials.de\/linux\/glossar\/syntax\/\" target=\"_blank\" data-mobile-support=\"0\" data-gt-translate-attributes='[{\"attribute\":\"data-cmtooltip\", \"format\":\"html\"}]' tabindex=\"0\" role=\"link\">Syntax<\/a> des Befehls gawk kennen. Anschlie&szlig;end folgen die wichtigsten Optionen des Befehls sowie einige Grundlagen zur Syntax der AWK Programmiersprache selbst.<\/p>\n<h2 id=\"t-1627909588872\">Allgemeine Syntax<\/h2>\n<p>Die allgemeine Syntax des Befehls <strong>gawk <\/strong>lautet:<\/p>\n<pre>gawk [Optionen] [Programmtext] [Datei(en)]<\/pre>\n<p>Neben optionalen Optionen werden dem Befehl der auszuf&uuml;hrende Programmtext sowie darauffolgend eine oder mehrere zu verarbeitende Dateien &uuml;bergeben. Wenn ein langes Programm ausgef&uuml;hrt werden soll, dann ist es oft sinnvoller, dieses ein eine Datei zu schreiben und diese mithilfe der <strong>Option -f<\/strong> an <strong>gawk <\/strong>zu &uuml;bergeben. Der Programmtext wird dann entsprechend nicht mehr im Befehl angegeben:<\/p>\n<pre>gawk [Optionen] -f [Programm-Datei] [Datei(en)]<\/pre>\n<h2 id=\"t-1627909588873\">Wichtige Optionen<\/h2>\n<p>Im Folgenden werden einige der wichtigsten Optionen des Befehls <strong>gawk <\/strong>vorgestellt:<\/p>\n<h3 id=\"t-1627981090519\">-F &ndash; Input-Field-Separator setzen<\/h3>\n<p>Mithilfe der <strong>Option -F<\/strong> kann der Input-Field-Separator, welcher kontrolliert wie <strong>gawk <\/strong>eine Zeile der Eingabe in Felder aufteilt, gesetzt werden. Es kann sich dabei entweder um ein einzelnes Zeichen, oder einen regul&auml;ren Ausdruck handeln. Eingabezeilen werden dann jeweils nach <a class=\"glossaryLink cmtt_Allgemein cmtt_Informatik\" aria-describedby=\"tt\" data-cmtooltip=\"&lt;div class=glossaryItemTitle&gt;String&lt;\/div&gt;&lt;div class=glossaryItemBody&gt;Ein String ist in der Informatik eine Zeichenkette - stellt also eine endliche Folge von Zeichen aus einem bestimmten Zeichensatz,(...)&lt;\/div&gt;&lt;div class=cmtt_synonyms_wrapper&gt;&lt;div class=cmtt_synonyms_title&gt;Synonyms: &lt;\/div&gt;&lt;div class=cmtt_synonyms&gt;Zeichenkette&lt;\/div&gt;&lt;\/div&gt;\" href=\"https:\/\/profi-tutorials.de\/linux\/glossar\/string\/\" target=\"_blank\" data-mobile-support=\"0\" data-gt-translate-attributes='[{\"attribute\":\"data-cmtooltip\", \"format\":\"html\"}]' tabindex=\"0\" role=\"link\">Zeichenketten<\/a> durchsucht, die mit dem Input-Field-Separator &uuml;bereinstimmen, und so aufgeteilt, dass der Text zwischen den &Uuml;bereinstimmungen jeweils ein Feld bildet.<\/p>\n<pre>gawk -F [Input-Field-Separator] [Programmtext] [Datei(en)]<\/pre>\n<h3 id=\"t-1627981090520\">-f &ndash; Programmdatei spezifizieren<\/h3>\n<p>Bei Verwendung dieser Option wird der AWK-Programmtext nicht dem ersten nicht-Options Argument entnommen, sondern stattdessen aus der angegebenen Datei gelesen. Die Option kann mehrfach verwendet werden &ndash; das AWK-Programm besteht dann aus der <a class=\"glossaryLink cmtt_Allgemein cmtt_Informatik\" aria-describedby=\"tt\" data-cmtooltip=\"&lt;div class=glossaryItemTitle&gt;Konkatenation&lt;\/div&gt;&lt;div class=glossaryItemBody&gt;Die Konkatenation ist die Verkn&uuml;pfung zweier Worte zu einem neuen Wort.&lt;\/div&gt;\" href=\"https:\/\/profi-tutorials.de\/linux\/glossar\/konkatenation\/\" target=\"_blank\" data-mobile-support=\"0\" data-gt-translate-attributes='[{\"attribute\":\"data-cmtooltip\", \"format\":\"html\"}]' tabindex=\"0\" role=\"link\">Konkatenation<\/a> der Inhalte jeder spezifizierten Datei.<\/p>\n<pre>gawk -f [Programm-Datei] [Datei(en)]<\/pre>\n<p>Dateien, die mit der <strong>Option -f<\/strong> spezifiziert werden, werden so behandelt, wie als h&auml;tten sie die folgende Zeile zur Festlegung des Namespace am Anfang stehen:<\/p>\n<pre>@namespace \"awk\"<\/pre>\n<h3 id=\"t-1627981090521\">-v &ndash; Variable setzen<\/h3>\n<p>Mit der <strong>Option -v<\/strong> l&auml;sst sich vor dem Beginn der Programmausf&uuml;hrung eine Variable mit der Bezeichnung <strong>&ldquo;[Variable]&rdquo;<\/strong> auf den Wert <strong>&ldquo;[Wert]&rdquo;<\/strong> setzen. Die Werte der Variablen sind dann innerhalb des <strong>BEGIN-Blocks<\/strong> verf&uuml;gbar. Mit einer <strong>Option -v<\/strong> kann jeweils nur eine Variable gesetzt werden, jedoch kann sie mehr als einmal verwendet werden.<\/p>\n<pre>gawk -v [Variable]=[Wert] [Programmtext] [Datei(en)]<\/pre>\n<h3 id=\"t-1627981090522\">-c &ndash; Kompatibilit&auml;ts-Modus<\/h3>\n<p>Die <strong>Option -c<\/strong> wird verwendet, um den Kompatibilit&auml;tsmodus zu aktivieren, in welchem die GNU-Erweiterungen zur AWK-Sprache deaktiviert sind, sodass <strong>gawk <\/strong>sich genau wie BWK awk (Version von Brian Kernighan) verh&auml;lt:<\/p>\n<pre>gawk -c [Programmtext] [Datei(en)]<\/pre>\n<h3 id=\"t-1627981090523\">-d &ndash; Globale Variablen ausgeben<\/h3>\n<p>Mit der <strong>Option -d<\/strong> l&auml;sst sich eine sortierte Liste aller globalen Variablen, ihrer Typisierungen und Werte in die spezifizierte Datei ausgeben. Wenn keine Datei angegeben wurde, wird die Liste in eine Datei mit der Bezeichnung <strong>&ldquo;awkvars.out&rdquo;<\/strong> im aktuellen Arbeitsverzeichnis geschrieben. Wird eine Datei angegeben, so sind zwischen der <strong>Option -d<\/strong> und der Datei keine Leerzeichen erlaubt:<\/p>\n<pre>gawk -d[Datei] [Programmtext] [Datei(en)]<\/pre>\n<h3 id=\"t-1627981090524\">-D &ndash; Debugging aktivieren<\/h3>\n<p>Das Debugging von AWK-Programmen l&auml;sst sich mit der <strong>Option -D<\/strong> aktivieren. Der Debugger liest standardm&auml;&szlig;ig interaktiv, direkt vom Standard-Input <strong>stdin<\/strong>, Kommandos ein. Optional kann eine Datei mit einer Liste von Kommandos spezifiziert werden, welche dann nicht-interaktiv von dem Debugger ausgef&uuml;hrt werden. Wenn eine Datei spezifiziert wird, sind zwischen der <strong>Option -D<\/strong> und der Datei keine Leerzeichen erlaubt:<\/p>\n<pre>gawk -D[Datei] [Programmtext] [Datei(en)]<\/pre>\n<h3 id=\"t-1627981090525\">-e &ndash; Programmtext spezifizieren<\/h3>\n<p>Die <strong>Option -e<\/strong> erlaubt es Ihnen, Programmtext &uuml;ber die Befehlszeile hinzuzuf&uuml;gen. Auf diesem Weg wird es m&ouml;glich, Quellcode aus Dateien mit Quellcode von der Befehlszeile zu kombinieren. Insbesondere wenn Sie Bibliotheksfunktionen in Ihren Befehlszeilen-Programmen verwenden m&ouml;chten, ist diese Option hilfreich.<\/p>\n<p>Jede mit einer <strong>Option -e<\/strong> angegebene Zeichenkette wird von <strong>gawk <\/strong>so behandelt, wie als h&auml;tte sie einen Linefeed am Ende stehen &ndash; der Aufbau eines vollst&auml;ndigen Programms wird so erleichtert.<\/p>\n<pre>gawk -e [Programmtext] [Datei(en)]<\/pre>\n<h3 id=\"t-1627981090526\">-i &ndash; Include<\/h3>\n<p>Mit der <strong>Option -i<\/strong> kann eine AWK-Quellbibliothek aus einer angegebenen Datei gelesen werden. Die Option stellt damit ein vollst&auml;ndiges &Auml;quivalent zur Verwendung von <strong>&ldquo;@include&rdquo;<\/strong> im Programmtext dar. Die Option ist der <strong>Option -f<\/strong> zwar sehr &auml;hnlich, jedoch gibt es zwei wichtige Unterschiede: Zum einen wird eine mit <strong>-i<\/strong> angegebene Datei nur geladen, wenn sie nicht zuvor bereits geladen wurde, w&auml;hrend die Option <strong>-f<\/strong> die angegebene Datei immer l&auml;dt. Zum anderen werden mit der <strong>Option -i<\/strong> eingelesene Dateien von <strong>gawk <\/strong>nicht als Eingabe f&uuml;r das Hauptprogramm (main) erkannt, da die Option f&uuml;r die Verwendung mit Code-Bibliotheken gedacht ist. <strong>gawk <\/strong>erwartet entsprechend nach der Verarbeitung einer <strong>Option -i<\/strong> weiterhin das Hauptprogramm in einer der <strong>Option -f<\/strong> &uuml;bergebenen Datei oder direkt auf der Befehlszeile.<\/p>\n<pre>gawk -i [Programmtext] [Datei(en)]<\/pre>\n<p>Dateien, die mit der <strong>Option -i<\/strong> spezifiziert werden, werden so behandelt, wie als h&auml;tten sie die folgende Zeile zur Festlegung des Namespace am Anfang stehen:<\/p>\n<pre>@namespace \"awk\"<\/pre>\n<h3 id=\"t-1627981090527\">-L &ndash; Vor Inkompatibilit&auml;ten warnen<\/h3>\n<p>Bei Verwendung der <strong>Option -L<\/strong> (<strong>L<\/strong>int) warnt <strong>gawk <\/strong>vor Konstrukten, die gegen&uuml;ber anderen awk-Implementierungen bedenklich oder nicht-&uuml;bertragbar (nicht-portabel) sind. Optional kann eine Zeichenkette <strong>&ldquo;fatal&rdquo;<\/strong>, <strong>&ldquo;invalid&rdquo;<\/strong> oder <strong>&ldquo;no-ext&rdquo;<\/strong> &uuml;bergeben werden, wobei zwischen dieser und der Option selbst keine Leerzeichen erlaubt sind. Die Zeichenkette spezifiziert dabei, welche Warnungen ausgegeben werden:<\/p>\n<table data-rows=\"4\" data-cols=\"2\" data-v=\"middle\">\n<thead>\n<tr>\n<th style=\"\"><strong>Zeichenkette<\/strong><\/th>\n<th style=\"\">Funktion<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td data-th=\"Zeichenkette\" style=\"\">fatal<\/td>\n<td data-th=\"Funktion\" style=\"\">Lint-Warnungen werden zu fatalen Fehlern.<\/td>\n<\/tr>\n<tr>\n<td data-th=\"Zeichenkette\" style=\"\">invalid<\/td>\n<td data-th=\"Funktion\" style=\"\">Nur Warnungen bez&uuml;glich Dingen, die tats&auml;chlich ung&uuml;ltig sind, werden ausgegeben.<\/td>\n<\/tr>\n<tr>\n<td data-th=\"Zeichenkette\" style=\"\">no-ext<\/td>\n<td data-th=\"Funktion\" style=\"\">Warnungen zu gawk Erweiterungen sind werden deaktiviert.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Einige Warnungen werden nur ausgegeben, wenn <strong>gawk <\/strong>ihr Programm erstmals liest. Andere werden zur Laufzeit ausgegeben.<\/p>\n<pre>gawk -L[Zeichenkette] [Programmtext] [Datei(en)]<\/pre>\n<h3 id=\"t-1627981090528\">-P &ndash; POSIX-Modus<\/h3>\n<p>Wird die <strong>Option -P<\/strong> verwendet, so arbeitet <strong>gawk <\/strong>in einem strikten POSIX-Modus. Hierdurch werden alle <strong>gawk <\/strong>Erweiterungen (wie <strong>Option -c<\/strong>), sowie alle solchen Erweiterungen die nicht von POSIX erlaubt werden, deaktiviert.<\/p>\n<pre>gawk -P [Programmtext] [Datei(en)]<\/pre>\n<p>Werden beide <strong>Optionen -P<\/strong> und <strong>-c<\/strong> spezifiziert, so erh&auml;lt <strong>-P<\/strong> Vorrang. Zudem wird eine Warnung ausgegeben.<\/p>\n<h3 id=\"t-1627981090529\">-S &ndash; Sandbox-Modus<\/h3>\n<p>Die <strong>Option -S<\/strong> deaktiviert die Funktion <strong>&ldquo;system()&rdquo;<\/strong>, Eingabeumleitungen mit <strong>&ldquo;getline&rdquo;<\/strong>, Ausgabeumleitungen mit <strong>&ldquo;print&rdquo;<\/strong> und <strong>&ldquo;printf&rdquo;<\/strong> sowie dynamische Erweiterungen. Weiterhin wird das Hinzuf&uuml;gen von Dateinamen zu <strong>&ldquo;ARGV&rdquo;<\/strong>, die zum Startzeitpunkt von <strong>gawk <\/strong>nicht vorhanden waren, nicht erlaubt. Die Option ist insbesondere dann hilfreich, wenn AWK-Programme aus fraglichen Quellen ausgef&uuml;hrt werden sollen, um sicherzustellen, dass au&szlig;er den spezifizierten Eingabedateien kein Zugriff durch das Programm auf das System m&ouml;glich ist.<\/p>\n<pre>gawk -S [Programmtext] [Datei(en)]<\/pre>\n<h2 id=\"t-1627909588874\">AWK-Syntax<\/h2>\n<p>Ein AWK-Programm besteht immer aus einer Reihe von Regeln, welche jeweils eine Bedingung nach deren Eintreffen gesucht und Anweisungen die bei Eintreffen der Bedingung ausgef&uuml;hrt werden sollen, spezifizieren. Wird keine Bedingung angegeben, so werden die entsprechenden Anweisungen der Regel f&uuml;r jede Eingabezeile ausgef&uuml;hrt. Weiterhin kann auch eine Bedingung ohne Anweisung angegeben werden &ndash; in diesem Fall wird &uuml;ber die Standard-Anweisung einfach die Eingabezeile ausgegeben. Optional k&ouml;nnen in einem AWK-Programm auch eigene Funktionen definiert werden &ndash; dazu jedoch sp&auml;ter mehr.<\/p>\n<p>Regeln werden normalerweise mithilfe von Zeilenumbr&uuml;chen voneinander getrennt &ndash; ein typisches AWK-Programm hat damit die folgende Gestalt:<\/p>\n<p>Bedingung { Anweisung }<\/p>\n<p>Bedingung { Anweisung }<\/p>\n<p>&hellip;<\/p>\n<p>In den folgenden Abschnitten werden die Konstrukte, die ein AWK-Programm bilden, genauer behandelt.<\/p>\n<h3 id=\"t-1628153362921\">Bedingungen<\/h3>\n<p>Eine der einfachsten m&ouml;glichen Bedingungen ist der Vergleich der Eingabezeile mit einem regul&auml;ren Ausdruck. Stimmt die Eingabezeile mit dem regul&auml;ren Ausdruck &uuml;berein, so ist die Bedingung wahr und die Anweisungen der Regel werden ausgef&uuml;hrt. Die Bedingung wird dabei wie folgt angegeben, wobei &ldquo;[<a class=\"glossaryLink cmtt_Informatik\" aria-describedby=\"tt\" data-cmtooltip=\"&lt;div class=glossaryItemTitle&gt;Regex [Regular Expression]&lt;\/div&gt;&lt;div class=glossaryItemBody&gt;Regul&auml;re Ausdr&uuml;cke (engl. regular expression, regex) sind spezielle Zeichenketten, die ein Suchmuster definieren.&lt;\/div&gt;\" href=\"https:\/\/profi-tutorials.de\/linux\/glossar\/regex\/\" target=\"_blank\" data-mobile-support=\"0\" data-gt-translate-attributes='[{\"attribute\":\"data-cmtooltip\", \"format\":\"html\"}]' tabindex=\"0\" role=\"link\">regexp<\/a>]&rdquo; mit dem entsprechenden regul&auml;ren Ausdruck zu ersetzen ist:<\/p>\n<pre>\/[regexp]\/<\/pre>\n<p>Mit verschiedenen Vergleichsoperatoren lassen sich weitere Bedingungen formulieren. Vergleichsausdr&uuml;cke, die mit den in der folgenden Tabelle gezeigten Operatoren gebildet werden, haben den Wert 1, wenn sie wahr sind, andernfalls 0. Werden Operanden verschiedener Typisierung verglichen, so werden numerische Operanden in Zeichenketten umgewandelt, wobei der Wert der Variablen &ldquo;CONVFMT&rdquo; f&uuml;r die Umwandlung verwendet wird. Der Vergleich von Zeichenketten erfolgt auf Grundlage der lexikographischen Ordnung. Ist eine Zeichenkette ein Pr&auml;fix einer anderen Zeichenkette, so ist die k&uuml;rzere Zeichenkette stets kleiner als die l&auml;ngere.<\/p>\n<table data-rows=\"9\" data-cols=\"2\" data-v=\"middle\">\n<thead>\n<tr>\n<th style=\"\"><strong>Ausdruck<\/strong><\/th>\n<th style=\"\">Funktion<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td data-th=\"Ausdruck\" style=\"\">x &lt; y<\/td>\n<td data-th=\"Funktion\" style=\"\">Wahr, wenn x kleiner als y<\/td>\n<\/tr>\n<tr>\n<td data-th=\"Ausdruck\" style=\"\">x &lt;= y<\/td>\n<td data-th=\"Funktion\" style=\"\">Wahr, wenn x kleiner oder gleich y<\/td>\n<\/tr>\n<tr>\n<td data-th=\"Ausdruck\" style=\"\">x &gt; y<\/td>\n<td data-th=\"Funktion\" style=\"\">Wahr, wenn x gr&ouml;&szlig;er als y<\/td>\n<\/tr>\n<tr>\n<td data-th=\"Ausdruck\" style=\"\">x &gt;= y<\/td>\n<td data-th=\"Funktion\" style=\"\">Wahr, wenn x gr&ouml;&szlig;er oder gleich y<\/td>\n<\/tr>\n<tr>\n<td data-th=\"Ausdruck\" style=\"\" rowspan=\"1\" colspan=\"1\">x == y<\/td>\n<td data-th=\"Funktion\" style=\"\" rowspan=\"1\" colspan=\"1\">Wahr, wenn x gleich y<\/td>\n<\/tr>\n<tr>\n<td data-th=\"Ausdruck\" style=\"\" rowspan=\"1\" colspan=\"1\">x != y<\/td>\n<td data-th=\"Funktion\" style=\"\" rowspan=\"1\" colspan=\"1\">Wahr, wenn x ungleich y<\/td>\n<\/tr>\n<tr>\n<td data-th=\"Ausdruck\" style=\"\" rowspan=\"1\" colspan=\"1\">x ~ y<\/td>\n<td data-th=\"Funktion\" style=\"\" rowspan=\"1\" colspan=\"1\">Wahr, wenn x dem regul&auml;ren Ausdruck y (&ldquo;\/ &hellip; \/&rdquo;) entspricht<\/td>\n<\/tr>\n<tr>\n<td data-th=\"Ausdruck\" style=\"\" rowspan=\"1\" colspan=\"1\">x !~ y<\/td>\n<td data-th=\"Funktion\" style=\"\" rowspan=\"1\" colspan=\"1\">Wahr, wenn x dem regul&auml;ren Ausdruck y (&ldquo;\/ &hellip; \/&rdquo;) nicht entspricht<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Schlie&szlig;lich existieren noch die beiden speziellen Bedingungen &ldquo;BEGIN&rdquo; und &ldquo;END&rdquo;, welche Initialisierungs- und Cleanup-Aufgaben in AWK-Programmen erm&ouml;glichen. Solche Anweisungen, die sich in einer Regel mit der BEGIN-Bedingung befinden (im Folgenden BEGIN-Block genannt), werden vor dem Einlesen der ersten Eingabezeile ausgef&uuml;hrt. Anweisungen in einer Regel mit END-Bedingung (im Folgenden END-Block genannt) werden dagegen nach dem Einlesen der letzten Eingabezeile ausgef&uuml;hrt. Das Vorhandensein von Anweisungen ist in beiden F&auml;llen Pflicht, da bei ihrer Ausf&uuml;hrung keine Eingabezeilen vorhanden sind. Ein AWK-Programm darf mehrere BEGIN- und END-Bl&ouml;cke beinhalten &ndash; sie werden dann in der Reihenfolge ihres Auftretens ausgef&uuml;hrt. In der urspr&uuml;nglichen Version von AWK aus dem Jahr 1978 durften dagegen nur jeweils ein BEGIN- und ein END-Block pro AWK-Programm vorhanden sein. Weiterhin mussten der BEGIN-Block am Anfang und der END-Block am Ende des Programms positioniert sein &ndash; auch diese Einschr&auml;nkung gilt in aktuellen AWK-Implementierungen nicht mehr.<\/p>\n<p>BEGIN- und END-Block haben somit die folgende Gestalt:<\/p>\n<p>BEGIN { Anweisung }<\/p>\n<p>END { Anweisung }<\/p>\n<h3 id=\"t-1628166221538\">Felder<\/h3>\n<p>Beim Einlesen einer Eingabezeile wird diese automatisch von AWK in eine Reihe von Feldern aufgeteilt. Zur Auftrennung wird der Input-Field-Separator &ndash; standardm&auml;&szlig;ig Whitespace, also eine beliebige Wiederholung von Leerzeichen, Tabs oder Zeilenumbr&uuml;chen &ndash; verwendet.<\/p>\n<p>W&auml;hrend die gesamte Eingabezeile immer mit &ldquo;$0&rdquo; referenziert wird, k&ouml;nnen mithilfe eines Dollarzeichens &ldquo;$&rdquo; und einer direkt darauffolgenden positiven Ganzzahl alle Felder einzeln referenziert werden. In einer Eingabezeile &ldquo;Ich lerne mit gawk umzugehen.&rdquo; w&auml;re so etwa mit &ldquo;$1&rdquo; auf das erste Feld, also die Zeichenkette &ldquo;Ich&rdquo; zuzugreifen. Das zweite Feld &ldquo;lerne&rdquo; ist mit &ldquo;$2&rdquo; erreichbar und so weiter. Eine Angabe &ldquo;$n&rdquo; (n ist eine Ganzzahl und n &gt;= 0) im AWK-Programm ist dabei ein g&uuml;ltiger Ausdruck, der den Wert des entsprechenden Feldes repr&auml;sentiert.<\/p>\n<h3 id=\"t-1628166221537\">Variablen<\/h3>\n<p>Variablen haben eine Bezeichnung, repr&auml;sentieren konkrete Werte (Numerische Werte oder Zeichenketten) und k&ouml;nnen zur Laufzeit des AWK-Programms genutzt und ver&auml;ndert werden. Die Bezeichnung \/ der Name einer Variable muss eine Sequenz von Buchstaben (a-z und A-Z), Ziffern (0-9) oder Unterstrichen (&ldquo;_&rdquo;) sein und darf nicht mit einer Ziffer beginnen. Jede Variable wird standardm&auml;&szlig;ig mit der leeren Zeichenkette initialisiert, welche nach der Umwandlung in eine Zahl die 0 darstellt.<\/p>\n<p>Ein Variablenname ist ein g&uuml;ltiger Ausdruck, welcher den aktuellen Wert der Variablen repr&auml;sentiert. Die Wertzuweisung in einem AWK-Programm erfolgt folgenderma&szlig;en:<\/p>\n<pre>[Variable]=[Wert]<\/pre>\n<p>Es existieren einige eingebaute Variablen mit besonderer Bedeutung. Diese k&ouml;nnen zwar genauso wie alle anderen Variablen verwendet werden und Werte zugewiesen bekommen, jedoch werden ihre Werte auch automatisch von AWK verwendet und \/ oder zugewiesen. Die Bezeichnungen der eingebauten Variablen sind alle in Gro&szlig;buchstaben. Der folgenden Tabelle sind einige der wichtigsten vordefinierten Variablen zu entnehmen:<\/p>\n<table data-rows=\"12\" data-cols=\"2\" data-v=\"middle\">\n<thead>\n<tr>\n<th style=\"\"><strong>Variable<\/strong><\/th>\n<th style=\"\">Funktion<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td data-th=\"Variable\" style=\"\">ARGV<\/td>\n<td data-th=\"Funktion\" style=\"\">Array der &uuml;bergebenen Befehlszeilenargumente<\/td>\n<\/tr>\n<tr>\n<td data-th=\"Variable\" style=\"\">ARGC<\/td>\n<td data-th=\"Funktion\" style=\"\">Anzahl der &uuml;bergebenen Befehlszeilenargumente<\/td>\n<\/tr>\n<tr>\n<td data-th=\"Variable\" style=\"\">ENVIRON<\/td>\n<td data-th=\"Funktion\" style=\"\">Assoziatives Array der <a class=\"glossaryLink cmtt_Informatik\" aria-describedby=\"tt\" data-cmtooltip=\"&lt;div class=glossaryItemTitle&gt;Umgebungsvariable&lt;\/div&gt;&lt;div class=glossaryItemBody&gt;Eine Umgebungsvariable ist in Betriebssystemen &uuml;blicherweise eine konfigurierbare Variable, welche oft Pfade zu bestimmten Dateien aber auch(...)&lt;\/div&gt;&lt;div class=cmtt_synonyms_wrapper&gt;&lt;div class=cmtt_synonyms_title&gt;Synonyms: &lt;\/div&gt;&lt;div class=cmtt_synonyms&gt;Environment Variable&lt;\/div&gt;&lt;\/div&gt;\" href=\"https:\/\/profi-tutorials.de\/linux\/glossar\/umgebungsvariable\/\" target=\"_blank\" data-mobile-support=\"0\" data-gt-translate-attributes='[{\"attribute\":\"data-cmtooltip\", \"format\":\"html\"}]' tabindex=\"0\" role=\"link\">Umgebungsvariablen<\/a><\/td>\n<\/tr>\n<tr>\n<td data-th=\"Variable\" style=\"\">FILENAME<\/td>\n<td data-th=\"Funktion\" style=\"\">Name der aktuellen Eingabedatei<\/td>\n<\/tr>\n<tr>\n<td data-th=\"Variable\" style=\"\" rowspan=\"1\" colspan=\"1\">NF<\/td>\n<td data-th=\"Funktion\" style=\"\" rowspan=\"1\" colspan=\"1\">Anzahl Felder in der aktuellen Eingabezeile<\/td>\n<\/tr>\n<tr>\n<td data-th=\"Variable\" style=\"\" rowspan=\"1\" colspan=\"1\">NR<\/td>\n<td data-th=\"Funktion\" style=\"\" rowspan=\"1\" colspan=\"1\">Anzahl verarbeiteter Eingabezeilen seit Programmstart. Wird beim Einlesen einer neuen Eingabezeile inkrementiert.<\/td>\n<\/tr>\n<tr>\n<td data-th=\"Variable\" style=\"\" rowspan=\"1\" colspan=\"1\">FNR<\/td>\n<td data-th=\"Funktion\" style=\"\" rowspan=\"1\" colspan=\"1\">Anzahl verarbeiteter Zeilen aus der aktuellen Eingabedatei. Wird beim Einlesen einer neuen Eingabezeile inkrementiert.<\/td>\n<\/tr>\n<tr>\n<td data-th=\"Variable\" style=\"\" rowspan=\"1\" colspan=\"1\">FS<\/td>\n<td data-th=\"Funktion\" style=\"\" rowspan=\"1\" colspan=\"1\">Aktueller Input-Field-Separator<\/td>\n<\/tr>\n<tr>\n<td data-th=\"Variable\" style=\"\" rowspan=\"1\" colspan=\"1\">FIELDWIDTHS<\/td>\n<td data-th=\"Funktion\" style=\"\" rowspan=\"1\" colspan=\"1\">Mit Leerzeichen getrennte Liste von Feldbreiten. Wenn gesetzt werden die Felder nicht mit dem Input-Field-Separator sondern anhand der spezifizierten Feldbreiten aufgeteilt.<\/td>\n<\/tr>\n<tr>\n<td data-th=\"Variable\" style=\"\" rowspan=\"1\" colspan=\"1\">OFS<\/td>\n<td data-th=\"Funktion\" style=\"\" rowspan=\"1\" colspan=\"1\">Aktueller Output-Field-Separator (Ausgabe-Feldtrenner). Wird zwischen Feldern, die mit dem print-Befehl ausgegeben werden, ausgegeben. Standardwert ist &rdquo; &ldquo;, also eine Zeichenkette nur mit einem einzelnen Leerzeichen.<\/td>\n<\/tr>\n<tr>\n<td data-th=\"Variable\" style=\"\" rowspan=\"1\" colspan=\"1\">ORS<\/td>\n<td data-th=\"Funktion\" style=\"\" rowspan=\"1\" colspan=\"1\">Aktueller Output-Record-Separator (Ausgabe-Zeilentrenner). Wird am Ende jedes print-Befehls ausgegeben. Standardwert ist &ldquo;n&rdquo; &ndash; der Zeilenumbruch.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Wird erg&auml;nzt&hellip;<\/p>\n<h2 id=\"t-1627909588875\">Exit-Status<\/h2>\n<p>Wenn das Exit-Statement mit einem einem spezifischen numerischen Wert verwendet wurde, dann beendet <strong>gawk <\/strong>und gibt diesen als Exit-Status zur&uuml;ck. &nbsp;Andernfalls wird <strong>gawk<\/strong>, wenn w&auml;hrend der Ausf&uuml;hrung keine Probleme aufgetreten sind, mit dem Wert der C-Konstante <strong>&ldquo;EXIT_SUCCESS&rdquo;<\/strong> beendet &ndash; in der Regel hat sie den <strong>Wert 0<\/strong>. Wenn jedoch ein Fehler aufgetreten ist, dann wird <strong>gawk <\/strong>mit dem Wert der C-Konstante <strong>&ldquo;EXIT_FAILURE&rdquo;<\/strong>, welche normalerweise den <strong>Wert 1<\/strong> hat, beendet.<\/p>\n<p>Wird <strong>gawk <\/strong>aufgrund eines fatalen Fehlers beendet, so ist der <strong>Exit-Status 2<\/strong>. Auf nicht POSIX-konformen Systemen k&ouml;nnte dieser Wert jedoch auch auf <strong>&ldquo;EXIT_FAILURE&rdquo;<\/strong> abgebildet sein.<\/p>\n<p style=\"text-align: center;\">Abonniere JETZT unseren Newsletter!<\/p>\n<p style=\"text-align: center;\">Verpasse nie wieder <strong>neue<\/strong> Beitr&auml;ge und <strong>exklusive Insider-Only-Inhalte!<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In diesem Beitrag lernen Sie den Befehl awk bzw. gawk kennen &#8211; es handelt sich um die GNU-Implementierung der AWK Programmiersprache. Sie ist konform mit der Definition der Sprache im POSIX 1003.1 Standard und basiert auf der Beschreibung in &#8220;The AWK Programming Language&#8221; von Aho, Kernighan und Weinberger. gawk bietet die zus\u00e4tzlichen Funktionen der aktuellen [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":9500,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_seopress_titles_title":"%%post_title%% %%sep%% %%sitetitle%%","_seopress_titles_desc":"In diesem Beitrag lernen Sie den Befehl gawk kennen, welcher unter UNIX- \/ Linux dazu verwendet wird, um auf die Programmiersprache AWK zur\u00fcckzugreifen.","_seopress_robots_index":"","_seopress_robots_follow":"","_seopress_robots_imageindex":"","_seopress_robots_snippet":"","_seopress_robots_primary_cat":"8","_seopress_robots_breadcrumbs":"","_seopress_robots_freeze_modified_date":"","_seopress_robots_custom_modified_date":"","_seopress_robots_canonical":"","_seopress_social_fb_title":"","_seopress_social_fb_desc":"","_seopress_social_fb_img":"","_seopress_social_fb_img_attachment_id":0,"_seopress_social_fb_img_width":0,"_seopress_social_fb_img_height":0,"_seopress_social_twitter_title":"","_seopress_social_twitter_desc":"","_seopress_social_twitter_img":"","_seopress_social_twitter_img_attachment_id":0,"_seopress_social_twitter_img_width":0,"_seopress_social_twitter_img_height":0,"_seopress_redirections_value":"","_seopress_redirections_enabled":"","_seopress_redirections_enabled_regex":"","_seopress_redirections_logged_status":"","_seopress_redirections_param":"","_seopress_redirections_type":301,"_seopress_analysis_target_kw":"UNIX,Linux,Befehl,Befehle,Option,Optionen,Betriebssystem,Betriebssysteme,Betriebssystemen,Syntax,Beispiel,Beispiele,Tutorial,Tutorials,Profi-Tutorials,Profi-Tutorials.de,awk,gawk,GNU,POSIX","footnotes":""},"categories":[8],"tags":[],"class_list":["post-8654","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administration"],"_links":{"self":[{"href":"https:\/\/profi-tutorials.de\/linux\/wp-json\/wp\/v2\/posts\/8654","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/profi-tutorials.de\/linux\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/profi-tutorials.de\/linux\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/profi-tutorials.de\/linux\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/profi-tutorials.de\/linux\/wp-json\/wp\/v2\/comments?post=8654"}],"version-history":[{"count":386,"href":"https:\/\/profi-tutorials.de\/linux\/wp-json\/wp\/v2\/posts\/8654\/revisions"}],"predecessor-version":[{"id":9814,"href":"https:\/\/profi-tutorials.de\/linux\/wp-json\/wp\/v2\/posts\/8654\/revisions\/9814"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/profi-tutorials.de\/linux\/wp-json\/wp\/v2\/media\/9500"}],"wp:attachment":[{"href":"https:\/\/profi-tutorials.de\/linux\/wp-json\/wp\/v2\/media?parent=8654"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/profi-tutorials.de\/linux\/wp-json\/wp\/v2\/categories?post=8654"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/profi-tutorials.de\/linux\/wp-json\/wp\/v2\/tags?post=8654"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}