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 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".