Unidad 2. Ejemplo de script comentado (numrep-v6.sh)
por Juan Chico, Jorge
—
Última modificación
11/04/2014 12:30
numrep-v6.sh
—
text/x-sh,
3Kb
Contenido del Archivo
#!/bin/bash
# numrep-v6.sh: cuenta repeticiones (comentado)
# Jorge Juan <jjchico@gmail.com>. 2013.
# Define la variable "prog" con el nombre del programa. "$0" es la ruta
# completa del ejecutable (ej. /usr/local/bin/numrep-v6.sh). "basename"
# extrael del nombre la última parte de la ruta, esto es, "numrep-v6.sh".
# El nombre se empleará en los mensajes de error. De esta forma, aunque en el
# futuro cambiemos el nombre del script a "numrep.sh" por ejemplo, el script
# siempre sabe con qué nombre fue llamado.
prog=`basename $0`
# Define el número de líneas a mostrar por defecto
lines=10
# Este bloque analiza las opciones que se pasan al programa. Las opciones son
# parámetros que comienzan con "-", por ejemplo "numrep-v6.sh -n 15 gpl.txt".
# "$1" contiene el primer parámetro. El bucle "while" comprueba si el parámetro
# es una opción, para ello mira si corresponde a la expresión regular "^-", que
# significa "pricipio de línea (^) seguido de guión (-)". Si es una opción, el
# "case" determina qué opción es y actúa en consecuencia.
while [[ "$1" =~ ^- ]]; do
case "$1" in
# Si la opción es "-h" muestra un mensaje de ayuda y temina el script.
-h) echo "$prog: cuenta repeticiones de palabras"
echo "Uso: $prog [-h] [-n N] <archivo>"
exit 1
;;
# Si la opción es "-n", define un nuevo número de líneas a mostrar. El
# numero dado por el usuario debe estar en el segundo parámetro pasado
# al script, esto es, "$2". El "shift" elimina un parámetro de la lista,
# esto es, $1 pasa a ser $2, $2 es $3, etc.
-n) lines=$2; shift
;;
# Cualquier otra opción (* significa cualquier carácter) no es recono-
# cida y se mostrará un mensaje de error.
-*) echo "$prog: opción desconocida."
echo "Pruebe: '$prog -h' para ayuda."
exit 1
;;
esac
# Tras procesar cada opción, se desplazan las opciones con "shift" para que
# al repetir el bucle se compruebe la siguiente opción.
shift
done
# "$*" contiene la lista de parámetros restantes. Si la lista está vacía,
# ejecutamos "cat" para leer de la entrada estándar. Si la lista no está
# vacía, ejecutamos cat pero pasándole el resto de parámetros dados al
# script ("$@") que serán los archivos a leer.
# El resto es una cadena de filtros. La salida de un filtro (comando) se pasa
# al siguiente filtro con "|". Cada comando hace una tarea específica (más
# detalles en el manual de cada comando).
if [ "X$*" == "X" ]
then
cat
else
cat "$@" # tr: convierte todos los espacios en nuevas líneas
fi | # dejando una sóla palabra por línea.
tr -sc A-Za-z '\012' | # sort: ordena todas las líneas dejando juntas palabras
sort | # iguales.
uniq -c | # uniq: une líneas iguales y cuenta repeticiones.
sort -nr | # sort: ordena de mayor a menor numéricamente.
head -$lines # head: muestra sólo $lines líneas.

