Guía de iniciación a la shell de GNU/Linux 3

CAPITULO 1

CAPITULO 2

CAPITULO 3

Capitulo tercero.

En este capitulo trataremos los últimos aspectos de la shell a tener en cuenta antes de meternos de lleno en la programación en shell-script, aspectos tales como las expresiones regulares como patrones de búsqueda, algunos otros comandos de filtrado, el editor de textos ‘vi’,y al fin nos meteremos con aspectos básicos de shell-script, y nuestro primer shell-script.

Empecemos

Expresiones regulares .

Patrones de busqueda.

Los metacaracteres son caracteres especiales que se refieren a otros caracteres con la finalidad de de efectuar búsquedas de archivos, líneas o palabras depurando resultados.
Hay multitud de formas de intercalarlos para depurar al máximo las búsquedas, tantas como nuestra ‘imaginación’ o conocimiento del manejo de ellos nos permitan, yo me limitare a deciros cuales son, para que sirven, y os daré algunos ejemplos.

Metacarateres:

opciones:
? —————> hace coincidir con cualquier carácter al menos una vez.
* —————> hace coincidir con el carácter precedente u otro 0 o mas veces.
+ —————> hace coincidir con el carácter precedente 1 o mas veces.
{n} ————-> hace coincidir con el carácter precedente ‘n’ veces.
{,m}————-> hace coincidir con el carácter precedente al menos ‘m’ veces.
{n,m}————> busca ‘n’, ‘m’ veces.
^ —————> El acento circunflejo mira el principio de la línea de búsqueda. ejemplo: ‘^a’ buscaría las líneas que empiecen por ‘a’.
$ —————> busca al final de la línea. ejemplo: ‘a$’ busca las líneas acabadas en ‘a’.
. —————> hace coincidir con cualquier carácter solo una vez.
[]—————> hace coincidir cualquier letra dentro de los corchetes una vez o varias separadas por comas ‘,’.Se pueden dar rangos.
ejemplos:
^[a-z] —> esto buscaría las líneas empezadas de la ‘a’ la ‘z’.
^[a-z,A-Z]> esto buscaría como la anterior, también mayúsculas.
[^a-z,A-Z]> al contrario que las anteriores, buscaría las que no empiecen por ninguna letra ni mayúscula ni minúscula.
^[0-9] —> buscaría líneas empezadas por números.

 

Comandos de filtrado.

Comando ‘cut’: corta o filtra campos o columnas. el argumento puede ser la salida de una tubería, un fichero.. etc

Sintaxis: cut [opciones [delimitador]] argumento

Opciones:
-c corta columnas —-> cut -c 1-3 /etc/passwd
-f corta campos. esta opción necesitaría en algunos casos de la opción -d la cual fija un delimitador de campos. Sin usarla por defecto usa el tabulador.

Os recomiendo que practiquéis con este comando y sus distintas posibilidades, ya que es realmente útil, a continuación unos ejemplos:

cut -c 1-3 /etc/passwd
cut -c 1,3 /etc/passwd
ls -l /etc|cut -c 2-10
ls -l /etc|cut -f 1
ls -l /etc|cut -f 1 -d ” ”
cut -f 5,3 -d “:” /etc/passwd

 

Comando ‘tr’ Traductor. Traduce caracteres con la finalidad de igualar patrones de filtrado. Por defecto lee de la entrada estándar, pero se puede redireccionar la entrada a un fichero o dar argumentos a través de tubería.

Sintaxis: tr [opción] [“patrón”][“patrón”]

Al igual que con el comando anterior, os recomiendo que miréis su ayuda y practiquéis su uso, ya que es también extremadamente útil.

Opciones:
-d — delete. Se especifica solo un rango de caracteres.
-s — Elimina caracteres repetidos.
-c — Todos aquellos caracteres que no sean ‘x’ los combierte a ‘x’.

Ejemplos:

tr -d [a-z]< /ruta/archivo
tr -d [0-9]< /ruta/archivo
tr -s ” ” < /ruta/archivo
tr -c [a-z\n] “,” < /ruta/archivo
ls -l | tr -c “0-9 a\n” “x”

 

Comando ‘tee’.Duplica la salida estándar, esto es que la salida estándar además de ir redireccionada o simplemente salir por pantalla, también se guarda en un fichero de texto. Si el fichero no existe lo crea, si existe lo sobre escribe.
En el caso de que no queramos sobre escribir, existe la opción -a (append), esta opción, añade la salida al archivo sin sobre escribir.

Sintaxis: stdin tee archivo.txt —-> stdout

Ejemplo:

rh3nt0n@rh3nt0n-laptop:~$ ls | tee listado
borrador.odt
capitulo2.odt
configuracion
…..
rh3nt0n@rh3nt0n-laptop:~$ head listado
borrador.odt
capitulo2.odt
configuracion
…..

 

Comando ‘find’. Busca ficheros recursivamente directorio a directorio.

Sintaxis: find fichero [opciones]

Opciones:
-name —- busca el nombre del fichero buscado.
-maxdepth (n) Máxima profundidad. Busca solo hasta el nivel de directorios que le digamos en numero ‘n’.
-iname — No toma en consideración mayúsculas y minúsculas.
-user —- (find fichero -user [user]) Busca los ficheros del usuario especificado. se pueden incluir mas opciones con -a (and) y -o (ó).
-group — Busca los ficheros del grupo especificado.
-mtime [+ – n] Busca segun modificación. +n busca en archivos modificados hasta ‘n’ dias.-n busca en archivos modificados como mucho en ‘n’ dias.
-size [+ – n] Busca por tamaño. (find ruta -size [+ -]n[k M G])
-links [n] Busca por numero de enlaces duros.
-inum [n] Busca por numero de inodo.
-type [b c d f l] [-a -o !] [opción de find]. Busca por tipo de archivo.
-exec [orden] {}\; Ejecuta la orden sobre el fichero buscado.

Herramienta de edición de texto.

Hay muchos editores de texto de uso para linux, tanto en modo texto, como en modo grafico. En modo texto tenemos ’emacs’ de los primeros en usarse en Unix, ‘Joe’ una extensión de GNU, ‘vi’ de los mas extendidos en distribuciones Linux, y también los de entorno Grafico, el mas usual en el entorno grafico Gnome es ‘gedit’, y para Kde ‘kedit’.Nosotros vamos a ver el editor ‘vi’ para modo texto que a mi modo de ver es el que mas y mejor se lleva con la shell, sin salir de ella.

Editor de textos ‘vi’.

El editor de textos ‘vi’ es una herramienta muy potente, para la programación de shell-script ya que nos permite ir editando el script según lo vamos probando en otra consola.

Este editor, no lo encontrareis en ningún menú grafico, ya que funciona en la shell, así que lo llamaremos de la siguiente forma desde la terminal:

vi fichero

Si el fichero existe lo abre y lo podremos editar, si no existe lo crea.
Para empezar a insertar texto, pulsaremos ‘i’ de insertar y para agregar texto, pulsaremos ‘a’ de append. En esta aplicación debéis de olvidaros del uso del ratón lo suyo es usar el teclado para moverse por el texto, con las teclas de dirección, ‘intro’ para salto de línea, ‘Supr’ para suprimir caracteres, también ‘dell’ para esto.. etc, doy por hecho que sabéis para que sirven las teclas..
Para salir de la edición pulsamos ‘Esc’, ojo, salimos de la edición pero no del editor.
Para guardar los cambios sin salir pulsamos ‘:w ‘enter’ ‘.
Para salir del editor guardando los cambios ‘:x ‘enter’ ‘.
Para salir ‘:q ‘enter”.
Para forzar salida ‘:q! ‘enter”.

Primeros pasos en shell-script.

Que es un shell-script.

Un shell script es un fichero de texto, que contiene ordenes de shell, la cual va ejecutando una a una siguiendo un guión preestablecido en el propio script.
Se pueden hacer shell-script en todos los tipos de shell que existen, ‘bash’ ‘sh’ ‘ksh’ ‘csh’… pero no tienen por que ser compatibles unos con otros, para que sean compatibles hay distintas formas de ejecutarlos y de indicar a la shell como actuar.

Maneras de ejecutar un shell-script.

Lo mejor para ver como se ejecuta un shell-script es crear uno, así que a ello.

vi script1

Una vez abierto en la shell el editor, pulsamos ‘i’ e insertamos el siguiente texto.

echo “hola mundo”

A continuación pulsamos escape ‘Esc’, y tecleamos ‘:w’ para grabar los cambios. a continuación, abrimos otra shell y empezamos a ver las formas de ejecutarlo.

1º La forma mas rápida para ir ejecutando un script según lo vamos editando, es llamar a la propia shell que estemos usando, para que ejecute el archivo de nuestro script:

rh3nt0n@rh3nt0n-laptop:~$ bash script1
hola mundo
rh3nt0n@rh3nt0n-laptop:~$

Como podéis apreciar, el script se ha ejecutado sin problemas y ha imprimido en la pantalla ‘hola mundo’ ejecutando la orden echo.

2ª Del modo anterior, usamos ‘bash’ para que ejecute nuestro script. Para ejecutar directamente nuestro script en la shell, sin tener que llamar a ‘bash’, la opción que tenemos es dar a nuestro script permiso de ejecución de la siguiente manera:

chmod +x script1

Para ejecutar nuestro script una vez tenga permiso de ejecución solo hay que llamarlo de la siguiente manera:

rh3nt0n@rh3nt0n-laptop:~$ chmod +x script1
rh3nt0n@rh3nt0n-laptop:~$ ./script1
hola mundo
rh3nt0n@rh3nt0n-laptop:~$

 

Como podréis apreciar, para ejecutarlo hemos usado ‘./’ esto no es mas que la ruta relativa de donde se encuentra el fichero de nuestro script, si este se encontrara en otro directorio de nuestro home, la orden tendría que ser: ./directorio/script1. Espero que halláis captado la idea.

3ª Para definir en que shell ha de ejecutarse nuestro script, existe el ‘shebang’ que corresponde a la primera línea de nuestro script y que es algo que tendremos que añadir siempre a nuestros script para evitarnos problemas a la hora de ejecutarlos, ya que define la shell hija donde se ejecutaran estos.

#!/bin/bash

Esto es un ‘shebang’, el cual indica que para ejecutar el script, hay que usar la aplicación ‘bash’ que se encuentra en el directorio ‘/bin’.
Una buena idea, y algo que deberíamos de tener en cuenta a la hora de programar nuestros shell-script, es comentar las ordenes que vayamos añadiendo a estos, ya que a la hora de configurar la orden sabremos que función tiene, pero a la hora de echarle tiempo después un vistazo al código, si no hemos comentado las ordenes elaboradas, puede ser realmente tedioso el hecho de interpretarlo. Esto ocurre también con la identación de el código que veremos mas adelante.
Para comentar líneas de ordenes, existe el carácter ‘#’ almohadilla, el cual la shell salta sin ejecutar el contenido de la línea que empiece por ella, esto lo veremos mejor insertando en nuestro script1, tanto el shebang, como una línea comentando lo que hace nuestro script.

Si hemos dejado abierto el editor vi, en otra terminal, vamos a ella, si no es así abrimos nuestro script1 de esta manera:

vi script1

Se abrirá nuestro fichero script1 con ‘vi’.Ahora insertamos ‘i’ las siguientes líneas, de tal modo que quede así:

#!/bin/bash
# Mi primer shell-script
echo “hola mundo”

Para poder ejecutar nuestro script desde cualquier lugar de nuestro sistema de archivos, tenemos dos opciones, la primera es copiar el script en el directorio /bin (si no existe, no hay problema en crearlo) de nuestro /home, en mi caso rh3nt0n. Lo cual permitiría que ejecutáramos nuestro script sin necesidad de tener privilegios de administrador como cualquier otro comando, con solo nombrarlo. O bien la opción de copiar nuestro script en el directorio /bin de root, lo cual permitirá ejecutarlo con privilegios de administrador con solo nombrarlo, siendo root.

En todo caso os doy los dos ejemplos, y vosotros decidís como queréis trabajar con vuestros scripts, eso si, teniendo en cuenta que trabajar como root es bastante peligroso para la integridad de nuestro sistema de ficheros.

cp script1 /home/bin
cp script1 /bin

 

Con el primer comando copiamos script1 a el directorio /home/bin, lo cual nos permitiría ejecutar el script con solo nombrarlo, pero solo a nosotros como usuario sin privilegios.

Con el segundo comando copiaríamos nuestro script a el directorio /bin, lo cual permitirá solo a ‘root’ ejecutarlo, para esta opción deberemos tener privilegios de administrador.

Supongamos que elejimos el primer caso, despues de copiar el script1 en /home/bin lo ejecutaríamos:

rh3nt0n@rh3nt0n-laptop:~$ ls -l ~/bin
total 4
-rwxr-xr-x 1 rh3nt0n rh3nt0n 18 2006-11-05 15:26 script1
rh3nt0n@rh3nt0n-laptop:~$ ./bin/script1
hola mundo
rh3nt0n@rh3nt0n-laptop:~$ ./script1
hola mundo
rh3nt0n@rh3nt0n-laptop:~$ script1
hola mundo
rh3nt0n@rh3nt0n-laptop:~$

 

Bueno, pues habiendo visto, algunos de los aspectos básicos de la programación en shell-script, os emplazo a la semana que viene, para meternos de lleno con asuntos mas serios y nuevos comandos de uso en shell-script.
Autor: rh3nt0n

Privacy Policy Settings