require(".zlconfig.php"); require("$webroot/cabecera.php"); ?> $navIdx->Asignar("texto_indice.php","Índice"); $navIzq->Asignar("texto_cap13.php","Capítulo 13"); $navDer->Asignar("texto_ap1.php","Apéndice 1") ?>
$graf_titulo = "$base_grafs/docs_head.png"; ?> require("$webroot/titulos.php"); ?>14. Miscelánea: los comandos find y pr.
Hasta ahora todas las utilidades que hemos visto y otras en general tratan los ficheros en forma de líneas. Es necesario, en muchos casos extraer de documentos en forma vertical.
El programa find busca en las partes especificadas del sistema de archivos de UNIX aquellos archivos que cumplen ciertos criterios. En general esta orden es muy completa (llega a ser bastante compleja en su manejo). Vamos a utilizarla únicamente para búsquedas básicas en la forma
find <directorio> -name <patrón shell> -print
que busca en el directorio especificado (y en todos sus subdirectorios) los archivos que coinciden con el patrón y los imprime en la salida. Una ejecución de este tipo da salidas simples
$ find . -name "*.ksh" -print
./curso/p.ksh
./proc/base.ksh
./proc/diag.ksh
./proc/limpieza.ksh
./proc/nodo900.ksh
./proc/plan.ksh
./proc/rec.ksh
./proc/resp_mail.ksh
./proc/uso.ksh
./proc/w.ksh
La siguiente línea de comandos permite obtener una lista de los ficheros buscados sin el camino completo
$ find . -name "*.ksh" -print | sed -n 's/.*\///gp' | tr "\012" " "
p.ksh
base.ksh
diag.ksh
limpieza.ksh
nodo900.ksh
plan.ksh
rec.ksh
resp_mail.ksh
uso.ksh
w.ksh
Obviamente perderemos el camino donde se encuentran los ficheros. También podemos crear una lista con todos esos ficheros para su uso en un procedimiento
$ LISTA=`find . -name "*.ksh" -print | tr "\012" " "`
$ echo $LISTA
./curso/p.ksh ./proc/base.ksh ./proc/diag.ksh ./proc/limpieza.ksh
./proc/nodo900.ksh ./proc/plan.ksh ./proc/rec.ksh
./proc/resp_mail.ksh ./proc/uso.ksh ./proc/w.ksh
El comando pr se utiliza principalmente para obtener una presentación adecuada a la hora de enviar un fichero a la impresora. Permite poner cabeceras en cada página, controlar el ancho de columna, etc. Sin embargo es posible utilizar pr de forma equivalente a paste, incluso más eficientemente. La opción -t de pr permite eliminar la cabecera de la salida y la opción -m permite mezclar varios ficheros e imprimirlos simultáneamente con un fichero por columna (esta es la opción paste que conocemos).
Por defecto cada separador se da con un número fijo de espacios, pero esto puede controlarse con la opción -wn que permite que cada columna, que representa a un fichero, tenga un número determinado n de espacios.
EJEMPLOS.
Supongamos que hemos extraido del fichero titulos.lis los nombres de los alumnos del plan 1 cuyo primer apellido empieza por A y en otro su número de expediente para fusionarlos posteriormente en un único fichero de dos campos: nombre (y apellidos) y expediente. Veremos todos los pasos para la obtención de todos los ficheros parciales y la obtención final.
El proceso de trabajo es el que sigue (aquí '^I' es nuevamente el tabulador)
$ grep "^1.*^IA" titulos.lis | cut -f2,8 > out.lis
$ cut -f1 out.lis > exp.lis ; cut -f2 out.lis > nomb.lis
$ pr -m -t -w60 nomb.lis exp.lis > nombre.lis
$ rm out.lis nomb.lis exp.lis