8.6.17 Extraer datos de una tabla contenida en un archivo de texto
Consideremos un archivo de texto llamado DPL
en donde todos los
nombres de los l�deres del proyecto Debian y el d�a de su asunci�n est�n
listados separados entre s� mediante espacios.
Ian Murdock Agosto 1993
Bruce Perens Abril 1996
Ian Jackson Enero 1998
Wichert Akkerman Enero 1999
Ben Collins Abril 2001
Bdale Garbee Abril 2002
Martin Michlmayr Marzo 2003
A menudo, se utiliza Awk para extraer datos de este tipo de archivos.
$ awk '{ print $3 }' <DPL # mes de asunci�n
August
April
January
January
April
April
March
$ awk '($1=="Ian") { print }' <DPL # DPL llamado Ian
Ian Murdock Agosto 1993
Ian Jackson Enero 1998
$ awk '($2=="Perens") { print $3,$4 }' <DPL # Cuando Perens asumi�
Abril 1996
Los int�rpretes de comandos como el Bash pueden tambi�n utilizarse para
analizar este tipo de archivo:
$ while read primero �ltimo mes a�o; do
echo $mes
done <DPL
... la misma salida que en el primer ejemplo Awk
En este caso, el comando incorporado read
utililiza las caracteres
de $IFS (separadores de campo internos, con sus siglas en ingl�s) para dividir
l�neas en palabras.
Si cambian IFS a ":", puede analizar perfectamente el
/etc/passwd
con el shell:
$ originalIFS="$IFS" # guarda el valor original
$ IFS=":"
$ while read user password uid gid resto_de_la_l�nea; do
if [ "$user" = "osamu" ]; then
echo "el ID de $user es $uid"
fi
done < /etc/passwd
El ID de osamu es 1001
$ IFS="$originalIFS" # devuelve valor anterior
(Si utiliza Awk para hacer lo mismo, utilice FS=":" para
configurar el separador de campo)
IFS tambi�n es utilizado por el int�rprete de comandos para dividir la
espansi�n de par�metros, la sustituci�n de comandos y la expansi�n aritm�tica.
Esto no sucede con palabras entre comillas simples o dobles. El valor
predeterminado de IFS es <espacio>, <tab> y <nueva_l�nea>
combinados.
Sea cuidadoso al usar estos trucos con el IFS del int�rprete de comandos.
Pueden ocurrir cosas extra�as cuando el shell interpreta parte de un script
como si se fuese su entrada.
$ IFS=":," # utiliza ":" y "," como IFS
$ echo IFS=$IFS, IFS="$IFS" # echo es un comando del Bash
IFS= , IFS=:,
$ date -R # simplemente la salida de un comando
Sat, 23 Aug 2003 08:30:15 +0200
$ echo $(date -R) # subshell --> entrada al shell principal
Sat 23 Aug 2003 08 30 36 +0200
$ unset IFS # volver al IFS predeterminado
$ echo $(date -R)
Sat, 23 Aug 2003 08:30:50 +0200