8.6.17 Estrarre dati da un file tabella
Consideramo un file di testo chiamato DPL
in cui tutti i nomi dei
project leader Debian precedenti e la data di inizio della carica siano
elencati in un formato con separazioni date da spazi.
Ian Murdock August 1993
Bruce Perens April 1996
Ian Jackson January 1998
Wichert Akkerman January 1999
Ben Collins April 2001
Bdale Garbee April 2002
Martin Michlmayr March 2003
Awk viene usato frequentemente per estrarre i dati da questo tipo di file.
$ awk '{ print $3 }' <DPL # mese di inzio
August
April
January
January
April
April
March
$ awk '($1=="Ian") { print }' <DPL # DPL di nome Ian
Ian Murdock August 1993
Ian Jackson January 1998
$ awk '($2=="Perens") { print $3,$4 }' <DPL # Quando Perens ha iniziato
April 1996
Anche le shell come la Bash possono essere usate per questi file:
$ while read first last month year; do
echo $month
done <DPL
... lo stesso output del primo esempio con Awk
Qui ilcomando interno read
usa i caratteri in $IFS (internal field
separators) per dividere le righe in parole.
Se cambiate IFS in ":", potete processare elegantemente
/etc/passwd
con la shell:
$ oldIFS="$IFS" # salva i vecchi valori
$ IFS=":"
$ while read user password uid gid rest_of_line; do
if [ "$user" = "osamu" ]; then
echo "$user's ID is $uid"
fi
done < /etc/passwd
osamu's ID is 1001
$ IFS="$oldIFS" # ripristina i vecchi valori
(Se si usa Awk per la stessa cosa, usate FS=":" per
impostare il separatore di campo)
IFS viene anche usato dalla shell per dividere i risultati della espansione dei
parametri, sostituzione dei comandi ed espansione aritmetica. Questi non sono
possibili all'interno di parole tra virgolette, semplici o doppie. il valore
predefinito di IFS � <space>, <tab>, e <newline> combinati.
Fate attenzione nell'uso di questi trucchi con IFS. Possono accadere strane
cose quando la shell inetrpreta alcune parti degli script come proprio
input.
$ IFS=":," # usa ":" e "," come IFS
$ echo IFS=$IFS, IFS="$IFS" # echo � un Bash built-in
IFS= , IFS=:,
$ date -R # solo l'output di un comando
Sat, 23 Aug 2003 08:30:15 +0200
$ echo $(date -R) # sub shell --> input alla shell principale
Sat 23 Aug 2003 08 30 36 +0200
$ unset IFS # riporta IFS al predefinito
$ echo $(date -R)
Sat, 23 Aug 2003 08:30:50 +0200