8.6.17 Extraire des donn�es d'un tableau contenu dans un fichier texte
Consid�rons un fichier texte DPL
dans lequel tous les responsables
pr�c�dents du projet Debian (DPL, Debian Project Leader) et leur date
d'investiture sont list�s s�par�s par des espaces dans un tableau.
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 est fr�quemment utilis� pour extraire des donn�es � partir de ce type de
tableaux.
$ awk '{ print $3 }' <DPL # mois d'investiture
August
April
January
January
April
April
March
$ awk '($1=="Ian") { print }' <DPL # DPL appel� Ian
Ian Murdock August 1993
Ian Jackson January 1998
$ awk '($2=="Perens") { print $3,$4 }' <DPL # quand Perens a �t� investi
April 1996
Des shells comme Bash peuvent aussi �tre utilis�s pour ce genre de
fichiers :
$ while read first last month year; do
echo $month
done <DPL
... m�me sortie que le premier exemple Awk
Ici, la commande de Bash read
utilise les caract�res de $IFS
(internal field separators, s�parateurs de champs internes) pour s�parer les
lignes en mots.
Si vous changez $IFS � ":", vous pouvez traiter le fichier
/etc/passwd
avec le shell :
$ oldIFS="$IFS" # garde l'ancienne valeur
$ 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" # remet l'ancienne valeur
(Si Awk est utilis� pour faire cela, utilisez FS=":"
pour r�gler le s�parateur de champs.)
IFS est aussi utilis� par le shell pour s�parer les r�sultats de l'expansion de
param�tres, de la substitution de commande, et l'expansion arithm�tique.
Celles-ci ne sont pas effectu�es � l'int�rieur de guillemets simples ou
doubles. La valeur par d�faut de IFS est <space>, <tab> et
<newline>.
Faites attention en utilisant IFS. Des choses �tranges peuvent survenir,
lorsque le shell interpr�te certaines parties du script comme
entr�e.
$ IFS=":," # utilise ":" et "," come IFS
$ echo IFS=$IFS, IFS="$IFS" # echo est une commande Bash
IFS= , IFS=:,
$ date -R # une simple sortie de commande
Sat, 23 Aug 2003 08:30:15 +0200
$ echo $(date -R) # sous-shell --> entr�e vers
le shell principal
Sat 23 Aug 2003 08 30 36 +0200
$ unset IFS # restaure la valeur par d�faut
$ echo $(date -R)
Sat, 23 Aug 2003 08:30:50 +0200