8.6.16 Extrahieren von Daten aus Tabellen in Textdateien
Sei DPL
der Name einer Textdatei, in welcher alle vorherigen
Debian-Projektleiter mit Namen und Einf�hrungsdatum, durch Freizeichen
getrennt, aufgef�hrt sind.
Ian Murdock August 1993
Bruce Perens April 1996
Ian Jackson Januar 1998
Wichert Akkerman Januar 1999
Ben Collins April 2001
Bdale Garbee April 2002
Martin Michlmayr M�rz 2003
Awk wird oft benutzt, um Daten aus dieser Art von Datei zu extrahieren.
$ awk '{ print $3 }' <DPL # Monat des Beginns
August
April
Januar
Januar
April
April
M�rz
$ awk '($1=="Ian") { print }' <DPL # Vorname Ian
Ian Murdock August 1993
Ian Jackson Januar 1998
$ awk '($2=="Perens") { print $3,$4 }' <DPL # wann fing Perens an
April 1996
Shells wie Bash sind ebenfalls in der Lage, Dateien dieser Art auszulesen:
$ while read Vorname Nachname Monat Jahr; do
echo $Monat
done <DPL
... selbe Ausgabe wie beim ersten Awk Beispiel
Das eingebaute read
Kommando verwendet die Zeichen in $IFS
(interne Feld-Separatoren), um Zeilen in W�rter aufzuteilen.
Wenn IFS auf ":" gesetzt wird, kann /etc/passwd
leicht
mit der Shell ausgelesen werden:
$ altIFS="$IFS" # alten Wert sichern
$ IFS=":"
$ while read Benutzer Passwort uid gid Zeilenrest; do
if [ "$Benutzer" = "osamu" ]; then
echo "$Benutzer's ID ist $uid"
fi
done < /etc/passwd
osamu's ID ist 1001
$ IFS="$altIFS" # Wert zur�cksetzen
(Wenn Awk dazu verwendet wird, so wird der Spaltentrenner mit
FS=":" angegeben.)
IFS wird auch von der Shell benutzt, um die Ergebnisse von
Parameterauswertungen, Kommando-Substitutionen und arithmetischen Auswertungen
aufzuteilen. Dies geschieht nicht innerhalb von doppelten oder einfachen
Anf�hrungszeichen. Der Standardwert von IFS sind die Werte
<Freizeichen>, <Tabulator> und <neue Zeile>.
Man muss bei der Verwendung von IFS-Tricks vorsichtig sein. Eigenartige Dinge
k�nnen geschehen, wenn die Shell Teile eines Skripts als
Eingabe interpretiert.
$ IFS=":," # ":" und "," seien Feldtrenner
$ echo IFS=$IFS, IFS="$IFS" # echo ist ein Bash Kommando
IFS= , IFS=:,
$ date -R # nur eine Kommandoausgabe
Sat, 23 Aug 2003 08:30:15 +0200
$ echo $(date -R) # Untershell --> Eingabe der Haupt-Shell
Sat 23 Aug 2003 08 30 36 +0200
$ unset IFS # zur�cksetzen von IFS auf den Standardwert
$ echo $(date -R)
Sat, 23 Aug 2003 08:30:50 +0200