8.3 awk-Variablen
Der awk kennt folgende Variablenarten : abhängige Variablen benutzerdefinierte Variablen vordefinierte Variablen
8.3.1 abhängige Variablen
Der awk verarbeitet die Eingabedaten Satz für Satz und legt den Inhalt in den abhängigen Variablen $0 bis $n ab. Abhängige Variablen werden vom awk verwaltet. $0 enthält den gesamten gelesenen Satz $1 .. $n enthält die Felder des gelesenen Satzes. Die Auftrennung erfolgt mit Hilfe der vordefinierten Variablen FS. Mit der Option -Fc kann FS bereits beim Aufruf des awk gesetzt werden $NF greift auf das letzte Feld des Satzes zu.Beispiele:ls -l | awk ' { print $1, $9 } ' # gibt Permissionbits und Dateiname aus ls -l | awk ' { print $1, $NF } ' # gibt Permissionbits und Dateiname aus # $NF greift auf das letzte Feld (hier Dateiname) zu awk -F: ' {print $1, $NF} ' /etc/passwd # gibt Username und Loginshell aus
8.3.3 awk benutzerdefinierte Variablen
AWK Variablen werden werden vom Benutzer definiert und bei der ersten Verwendung dynamisch angelegt und typgerecht belegt . Nicht initialisierte Variables haben den numerischen Inhalt 0 und den Stringwert "" (Achtung: in C ist \0 ist ein NULL-String oder leerer String). Ihr Inhalt ist Floating-Point-Zahl, ein String oder beides. Die Interpretation des Inhalt ist vom Kontext abhängig.
- Bei einer Zuweisung v = e oder v op = e bekommt v den Typ von e var = "text" # var wird String num = 25 # num wird numerisch
- Wenn eine Variable in einem numerischen Ausdruck verwendet wird, dann wird sie als Zahl behandelt. Das führt zu einem Abbruch, wenn der Inhalt nicht numerisch ist. x = abc + $4 # abc und $3 werden in einem arithmetischen Ausdruck # verwendet. Ihr Inhalt wird im Bedarfsfall konvertiert. # nicht numerische Inhalte werden auf 0 konvertiert
- Wird eine Variable als String verwendet, dann wird sie auch als String behandelt. print $1 ":" $2 # Die Variablen werden 'concatenated' . Sie werden falls # erforderlich in den Typ String konvertiert Eine Konvertierung kann erzwungen werden.
- Addition einer 0 erzwingt die Behandlung als Zahl. Intern wird dazu die Funktion atoff(3) aufgerufen. wert = "25string"+0
- Anhängen eines Nullstrings erzwingt die Behandlung als String. Hierzu wird die Funktion sprintf(3) aufgerufen und der Inhalt der Variablen CONVFMT als Formatstring übergeben.Obwohl awk intern als Floatingpoint behandelt, werden ganze Zahlen als Integer konvertiert. CONVFMT = "%2.2f" x = 14 # x ist numerisch y = x"" # erzwingt die Konvertierung in den Typ String Die Variable y hat den Stringinhalt "14" und nicht "14.00".
8.3.4 vordefinierte Variablen
Der awk hat einige vordefinierte Variablen die i.d.R. vom awk zumindest mit Defaultwerten gesetzt sind (zur Anwendung siehe Beispiele im ganzen Kapitel).ARGC Anzahl der übergebenen Argumente (einschl. Options) ARGIND Der Index auf ARGV auf die Datei die augenblicklich verarbeitet wird ARGV Array der command line arguments (indiziert von 0 bis ARGC - 1). CONVFMT Das Konvertierungsformat für Zahlen (Default "%.6g") ENVIRON Eine assoziative Tabelle mit den Werten des Environments. Die Indizierung erfolgt mit den Namen des Environments z.B. ENVIRON["HOME"] ERRNO Enthält Fehlermeldung, wenn Fehler bei getline oder close() ein Fehler auftritt FILENAME Name der current input-file. Wurde kein Name angegeben ist FILENAME ist innerhalb des BEGIN-Blocks undefiniert. FNR Satznummer innerhalb der current file FS Der input-Field-Separator, Default ist ein Blank und oder TAB. /[ \t]*/ (Option -Fc setzt neu). Der Separator kann auf jeden beliebigen Regular Expression gesetzt werden (also auch mehr als ein Zeichen, siehe Metazeichen) BEGIN { FS = "(/,[ \\t]*)|([ \\t]+)" } # Zuweisung zu Stringvariablen deshalb \\ | | | Blanks oder TAB Komma gefolgt von Blanks oder TAB IGNORECASE Kontrolliert die case-sensitivity aller Regular Expression (Default 0) NF Anzahl der Felder im augenblicklichen Satz. NR Bisherige Anzahl der Eingabesätze. OFMT Ausgabeformat für Zahlen (Default "%.6g" siehe formatierte Ausgabe) OFS Output-Field-Separator (Default Blank) ORS Output-Record-Separator (Default new-line \n) RS Eingabe Record-Separator (default new-line \n) RSTART Der Index des ersten Character von einem match(); 0 wenn kein match. RLENGTH Die Länge des String matched by match(); -1 wenn kein match. SUBSEP Trennzeichen zwischen mehreren Indices einer Tabelle (Default "\034").Da intern nur eindimensional gearbeitet wird, wird auf diese Weise ein eindeutiger Index erzeugt. Der Index wird innerhalb von [ ] angegeben. i = "A" ; j = "B" ; k = "C" x[i, j, k] = "hello, world\n" Intern erfolgt der Zugiff über den String "A\034B\034C".