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