151
Dpto. Informática y Automática Programaci Programaci Programaci Programació ó ón n n n en Shell en Shell en Shell en Shell Rodrigo Santamaría Vicente http://carpex.usal.es/~visusal/rodrigo/shellscript.htm

ProgramaciProgramacióóóón nn n en Shell

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: ProgramaciProgramacióóóón nn n en Shell

Dpto. Informática y Automática

ProgramaciProgramaciProgramaciProgramacióóóón n n n

en Shellen Shellen Shellen ShellRodrigo Santamaría Vicente

http://carpex.usal.es/~visusal/rodrigo/shellscript.htm

Page 2: ProgramaciProgramacióóóón nn n en Shell

Contenidos

1. Introducción a la shell2. Programación básica en bash3. Programación avanzada4. sed y awk5. Referencias

Page 3: ProgramaciProgramacióóóón nn n en Shell

IntroducciIntroducciIntroducciIntroduccióóóón an an an a

la Shellla Shellla Shellla Shell

Page 4: ProgramaciProgramacióóóón nn n en Shell

1.1.1.1.¿¿¿¿QuQuQuQuéééé es una shell?es una shell?es una shell?es una shell?

2.2.2.2.Tipos de shellTipos de shellTipos de shellTipos de shell

3.3.3.3.Usos de la shellUsos de la shellUsos de la shellUsos de la shell

4.4.4.4.Variables de entornoVariables de entornoVariables de entornoVariables de entorno

Page 5: ProgramaciProgramacióóóón nn n en Shell

Interfaz entre el Sistema Operativo y el UsuarioDos tipos

GráficaLínea de Comandos

CLI (Command Line Interface)intérprete de comandos, terminal, consola

¿Qué es una shell?

shell (ȓǫl/) – noun 1.a hard outer covering of an animal, as the hard case of a mollusk, or either half of the case of a bivalve mollusk.

Page 6: ProgramaciProgramacióóóón nn n en Shell

Shell Gráfica

Page 7: ProgramaciProgramacióóóón nn n en Shell

Shell de Línea de Comandos

Generalmente con shell nos referimos a una CLI de Unix

Page 8: ProgramaciProgramacióóóón nn n en Shell

Gráfica vs Texto

Transferencia o procesamiento de datos

Procesamiento de imagen, video, etc.

Usuario expertoUsuario base

Ciertas operaciones son más rápidas o no se pueden hacer de otro

modo

SencillaFácil uso

Línea de ComandosGráfica

Page 9: ProgramaciProgramacióóóón nn n en Shell

Tipos de shell

• Bourne shell (sh)–1971 (Thompson), 1976 (Mashey)–1977. Stephen Bourne, Bell Labs.

• C Shell (csh)–1978. Bill Joy, Berkeley

• Korn Shell (ksh)–1982. David Korn, Bell Labs.

• Bourne again shell (bash)–1987. Brian Fox, GNU Project

Page 10: ProgramaciProgramacióóóón nn n en Shell

Bourne Shell (sh)

• La más antigua• No tiene características interactivas

–Historia de comandos–Autocompletar nombres de ficheros–…

• No tiene estructuras complejas de programación–Funciones–Case–…

Page 11: ProgramaciProgramacióóóón nn n en Shell

C Shell (csh)

• Sintaxis como el lenguaje C–No compatible con la familia Bourne

• Capacidades interactivas–Pausar/reiniciar procesos–Historia de comandos–Operaciones aritméticas

Page 12: ProgramaciProgramacióóóón nn n en Shell

Korn Shell (ksh)

• Sustituye y es compatible con Bourne

• Características interactivas como C, pero mejoradas–Añade edición de líneas de la historia–Ejecución más rápida

Page 13: ProgramaciProgramacióóóón nn n en Shell

Bourne again shell (bash)

• Juego de palabras con born-again (renacido)• Desarrollado para el proyecto GNU, que daría

lugar a Linux• De nuevo, toma las mismas ideas que ksh y csh

y las implementa sobre sh–Parámetros–Operaciones matemáticas–Redireccionamiento E/S–Expresiones regulares–etc.

Page 14: ProgramaciProgramacióóóón nn n en Shell

Distribuciones

AIX, HP-UX, BSD

mac os X

solarisfreebsdlinux

kshcshbash

Page 15: ProgramaciProgramacióóóón nn n en Shell

POSIX shell

• Similar a ksh y utilizada por HP-UX• 95% compatible con bash• Como ksh, integra características de la csh,

mejoradas (histórico de comandos, autocompleción, operaciones aritméticas…)

• Las diferencias entre POSIX y ksh son mínimas:–http://docs.hp.com/en/B2355-90046/ch15s03.html

Page 16: ProgramaciProgramacióóóón nn n en Shell

Multiplicidad de las shells

• Ante el mismo sistema operativo, podemos tener varias shells activas al mismo tiempo–Gráficas y de texto (Linux)–De texto en distintos terminales

•$$ indica el PID de la shell en ejecución•ps para ver los PID de todos los procesos en

ejecución•$SHELL nos indica el tipo de shell que estamos

usando (chsh para cambiar de shell)•/etc/shells es un fichero con todos los tipos

de shell disponibles en el sistema

Page 17: ProgramaciProgramacióóóón nn n en Shell

Usos de la sh

• Intérprete de comandos: ejecutar comandos desde el intérprete

• Scripts: ejecutar secuencias de comandos desde un fichero

• Programas: control del flujo de ejecución de secuencias de comandos (bucles, condiciones, variables, etc.) desde un fichero

Page 18: ProgramaciProgramacióóóón nn n en Shell

Intérprete de comandos

• Sintaxis típica–comando [-]opciones parámetros

• Opciones: dependen de cada comando y alteran su funcionamiento

• Parámetros: variables de entrada que necesita el comando, separadas por espacios–ps –fu

–ls file.txt

–grep “*.txt” ../folder

Page 19: ProgramaciProgramacióóóón nn n en Shell

Procesamiento secuencial

date

ps –fu

who

• El sistema completa cada comando antes de ejecutar el siguiente:

Page 20: ProgramaciProgramacióóóón nn n en Shell

Procesamiento secuencial

•date; “ps –fu”; who

Page 21: ProgramaciProgramacióóóón nn n en Shell

Procesamiento no Secuencial

• Cada programa se ejecuta sin esperar a que el anterior termine

date & “ps -fu” & who

ps

date

pswho

datewho

Page 22: ProgramaciProgramacióóóón nn n en Shell

Redirección de E/S

• > Escribe la salida estándar a fichero• < Lee la entrada estándar de fichero• >> Añade la salida estándar a un fichero

existente• > y >> crean el fichero si no existe• < da error si el fichero no existe

Page 23: ProgramaciProgramacióóóón nn n en Shell

Tuberías (pipes)

• Conectan la salida de un programa a la entrada del siguiente

–ls | more ~ ls > temp; more < temp

Page 24: ProgramaciProgramacióóóón nn n en Shell

Shell script

• Poner en fichero órdenes que se puedan ejecutar en el intérprete de comandos

• Para editar el fichero, se puede usar cualquier editor (típicamente vi)

• Ejemplo: editar un fichero con la línea:• date; who; ps uf; du /home

• Ejecutar con: • sh nombreScript

Page 25: ProgramaciProgramacióóóón nn n en Shell

Trucos

• Si se usa vi, lo ideal es tener dos consolas abiertas, una para edición y otra para ejecución

• Para poder ejecutar un fichero como script, debemos tener permisos de ejecución

•chmod +x nombreFichero

• Otros modos de ejecución:–./nombreScript

–nombreScript si se encuentra en el PATH

Page 26: ProgramaciProgramacióóóón nn n en Shell

Fichero .profile

• Script(s) que se ejecuta automáticamente al hacer login

• Se encuentran en el directorio raíz del usuario

• Establece el “entorno” de trabajo

.profile

.cshrc

.profile

.kshrc

.bash_profile.bash_login

.profile.bashrc

.profile

cshkshbashsh

Page 27: ProgramaciProgramacióóóón nn n en Shell

Variables de entorno

Shell que estamos usandoSHELL

Configuración del prompt de consolaPS1

Tipo de Sistema OperativoOSTYPE

Directorio de trabajo actualPWD

Nombre de cuenta con el que hemos accedido al sistema

LOGNAME

Directorio raíz de nuestra cuentaHOME

Directorios para la búsqueda de parámetros, separados por (:)

PATH

Page 28: ProgramaciProgramacióóóón nn n en Shell

Variables de entorno

• Para acceder al valor $VAR

• Para mostrar el valor echo $VAR

• Para cambiar el valor VAR=valor

• Los cambios a las variables de entorno no se mantienen para otras shells a no ser que se incluyan en el .profile o se utilice export

• Ejercicio– Establecer en el PATH la ruta de la carpeta

donde almacenaremos los scripts

Page 29: ProgramaciProgramacióóóón nn n en Shell

ProgramaciProgramaciProgramaciProgramacióóóón n n n

bbbbáááásica en Bourne Shellsica en Bourne Shellsica en Bourne Shellsica en Bourne Shell

Page 30: ProgramaciProgramacióóóón nn n en Shell

1.1.1.1. IntroducciIntroducciIntroducciIntroduccióóóónnnn

2.2.2.2. VariablesVariablesVariablesVariables

3.3.3.3. ParParParParáááámetrosmetrosmetrosmetros

4.4.4.4. E/S E/S E/S E/S

5.5.5.5. CondicionesCondicionesCondicionesCondiciones

6.6.6.6.BuclesBuclesBuclesBucles

7.7.7.7. FuncionesFuncionesFuncionesFunciones

8.8.8.8. Operaciones Operaciones Operaciones Operaciones aritmaritmaritmaritmééééticasticasticasticas

9.9.9.9. DepuraciDepuraciDepuraciDepuracióóóónnnn

Page 31: ProgramaciProgramacióóóón nn n en Shell

Programación Shell

• Scripts donde introducimos conceptos propios de la programación–Variables–Parámetros–Condiciones–Bucles–Funciones–Operaciones aritméticas

• Los comandos disponibles de la shell actúan como nuestra biblioteca de funciones

Page 32: ProgramaciProgramacióóóón nn n en Shell

Por qué programar en shell?

• Requiere un cierto esfuerzo programar en shell, así que antes debemos plantearnos si nos va a ser útil

• Razones para programar en shell1. Porque nos lo mandan (como es el caso)2. Porque sabemos programar: el esfuerzo necesario

para aprender es muchísimo menor3. Porque en nuestro trabajo nos va a ser útil:– Administradores: tareas complejas o automatizables– Hackers: tareas rápidas– Programadores usuarios: tareas que se repiten

Page 33: ProgramaciProgramacióóóón nn n en Shell

Cuándo programar en shell?

• Llamadas frecuentes a funciones del sistema• Llamadas repetitivas a una función del sistema• Programas cortos

–Si un programa pasa de una página, probablemente la shell no sea la mejor solución

• Cuanto mejor conozcamos la shell y sus comandos, más la usaremos y más útil será la programación en shell

Page 34: ProgramaciProgramacióóóón nn n en Shell

Variables

• Además de las variables de entorno podemos declarar variables locales al script

• No tienen tipo, no hay que declararlas o inicializarlas previamente

• Asignación: variable=valor

• Acceder al valor: $variable

Page 35: ProgramaciProgramacióóóón nn n en Shell

Variables (II)

• Para diferenciar el valor de variables en cadenas, usamos { }:–dir2=/home/rodrigo/curso

–cat ${dir2}/lista.txt

–En las shells más modernas ya no es necesario

• Normalmente, se abre una shell para ejecutar el script– si queremos que se ejecute en la shell en que

estamos, y así luego tener disponibles las variables, usamos (.): . programa

Page 36: ProgramaciProgramacióóóón nn n en Shell

Parámetros

• Un script puede tener parámetros de entrada igual que cualquier comando–script par1 par2 par3 …

• Para acceder a sus valores usamos– $1, $2, $3, … $9

•$0 es el nombre del comando•$*, $@ devuelven todos los parámetros

separados por espacios

Page 37: ProgramaciProgramacióóóón nn n en Shell

Parámetros (II)

• Número de parámetros: $#

• Si tenemos más de 9 parámetros, tenemos que usar desplazamientos: shift [n]

– Donde n es el número de pasos que desplazamos– Si no se especifica n, se comporta como shift 1

Page 38: ProgramaciProgramacióóóón nn n en Shell

Gestión E/S: echo

• Salida por consola: echo cadena

Lo que encierra se toma literalmente‘’

Todo lo que está entre comillas pierde su significado especial salvo $ y \

“ ”

Elimina el significado especial del siguiente carácter\

Todo lo que está entre acentos graves se trata como un comando

` `

Evita el salto de línea (útil si se espera un parámetro de entrada)

-n

descripciónCaracteres especiales

Page 39: ProgramaciProgramacióóóón nn n en Shell

echo: secuencias de escape

tabulador horizontal\t

retorno de carro\r

alerta (beep)\a

salto de línea\n

suprime el salto de línea (como –n)\c

elimina el carácter anterior (backspace)\b

barra hacia atrás (\)\\

activa la interpretación de secuencias de escape-e

descripciónsecuencias de escape

Page 40: ProgramaciProgramacióóóón nn n en Shell

echo: códigos de escape

• Se introducen con la secuencia de escape \033

• Cada código tiene la sintaxis: [parametroAcción–parámetro es un número–acción es una letra

• Ejemplo:•echo –e “\033[34m Hola”

Page 41: ProgramaciProgramacióóóón nn n en Shell

echo: códigos (ii)

11 – acepta caracteres ASCII extendidos (asciitable.com)

30-37 – establece el color de las letras (31 rojo, etc.)

27 – deshabilita el intercambio de colores

25 – deshabilita el parpadeo

0 – modo por defecto (letras negras, fondo blanco)

7 – intercambia el color de fondo y el de las letras

5 – parpadeo

1 – negrita

40-47 – establece el color de fondo

modifica el estilo de la fuentem

descripción y parámetrosacciones

Page 42: ProgramaciProgramacióóóón nn n en Shell

echo: codigos (iii)

Recupera la posición del cursor y sus atributosojo: 7s y 8u no funcionan en todos los terminales, es más

recomentable usar tput sc y tput rc

8u

Establece la posición del cursorx;y – posición para el cursor

H,f

Almacena la posición del cursor y sus atributos7s

0 – apaga todos los bloqueos del teclado

3 – enciende el bloqueo de mayúsculas, apaga el resto

2 – enciende el bloqueo de números, apaga el resto

1 – enciende el bloqueo de scroll, apaga el resto

gestiona los bloqueos del tecladoq

descripciónacciones

Page 43: ProgramaciProgramacióóóón nn n en Shell

echo: ejemplos

Page 44: ProgramaciProgramacióóóón nn n en Shell

Gestion E/S: read

• Entrada de consola: read var

• En ksh también se puede hacer así:•read fich?“Introduce nombre de fichero: ”

Page 45: ProgramaciProgramacióóóón nn n en Shell

Gestión E/S: exit

• Salida del script: exit código_fin

• 0 terminado con éxito• 1 error interno• 2 error por sintaxis de llamada

•$? Devuelve el código de salida del último comando ejecutado

Page 46: ProgramaciProgramacióóóón nn n en Shell

Expresiones regulares

• Manejar con soltura las expresiones regulares es fundamental para programar en shell y manejar comandos como grep, sed o awk.

Cualquier cadena de caracteres.*

Cualquier carácter de los especificados entre corchetes, o un rango si separados por ‘-’

[a-z] [0-9] [a-z,A-Z] [Tt]

[ … ]

Cualquier carácter (1 ocurrencia).

La expr. reg. anterior aparece 0+ veces*

DescripciónSímbolo

Page 47: ProgramaciProgramacióóóón nn n en Shell

Expresiones regulares (II)

• Más expresiones regulares

Marca expr. regulares, para luego repetirlas con \n, donde n es la n-ésima expr. marcada

\(…\)

Líneas sin los caracteres entre corchetes[^…]

Líneas en blanco^$

Interpretar literalmente el símbolo especial siguiente

\

La línea empieza con la expr. reg. siguiente^

La línea acaba con la expr. reg anterior$

DescripciónSímbolo

Page 48: ProgramaciProgramacióóóón nn n en Shell

Expresiones regulares (III)

• Extensión POSIX

Aparece la expr. anterior o la posteriorcat|dog � cat, dog

|

La expr. reg. anterior aparece 1+ veces

[hc]+at � hat, cat, hhat, chat,

__________hcat, ccchat

+

La expr. reg. anterior aparece 0 ó 1 vez

[hc]?at � at, hat, cat

?

DescripciónSímbolo

Page 49: ProgramaciProgramacióóóón nn n en Shell

Condiciones

• if lista_condiciones1

• then lista_comandos1

• eliflista_condiciones2

• then lista_comandos2

• …

• else lista_comandosN

• fi

Page 50: ProgramaciProgramacióóóón nn n en Shell

Test

• Para chequear condiciones se usan [ ] en la sintaxis del if (equivalente al comando test)

Mayor o igual que-ge

Menor o igual que-le

Mayor que-gt

Menor que-lt

Igual a-eq, =

Page 51: ProgramaciProgramacióóóón nn n en Shell

Test

Verdadero si fich existe y tiene tamaño mayor que cero

-s fich

Verdadero si fich existe y es un directorio-d fich

Verdadero si fich existe y se puede ejecutar-x fich

Verdadero si fich existe y se puede escribir-w fich

Verdadero si fich existe y se puede leer-r fich

Verdadero si fich existe y es un fichero -f fich

Ficheros

Page 52: ProgramaciProgramacióóóón nn n en Shell

Test

Verdadero si cad existe y no tiene valor nulo

cad

Verdadero si las cadenas son distintascad1!=cad2

Verdadero si las cadenas son igualescad1==cad2

Verdadero si cad sí es una cadena nula-z cad

Verdadero si cad no es una cadena nula -n cad

Cadenas

Page 53: ProgramaciProgramacióóóón nn n en Shell

Test

OR-o

AND-a

Operadores booleanos

• Observaciones– Incluir siempre un espacio despues de [ y antes de ]– test solo vale para enteros, los reales son truncados al

entero más próximo

Page 54: ProgramaciProgramacióóóón nn n en Shell

Case

• Expansión de if (similar al switch de C o java)

•case param in

•patron1 [ | patron2…] )

lista_comandos1 ;;

•patron2 [ | patron3…] )

lista_comandos2 ;;

•…

•esac

Page 55: ProgramaciProgramacióóóón nn n en Shell

Case

Page 56: ProgramaciProgramacióóóón nn n en Shell

Ejercicio

• Hacer un script similar a mv, move, con la siguiente sintaxis

» move filename

• Deberá:1. Chequear si hay argumento y salirse si no,

mostrando la sintaxis correcta2. Chequear que el argumento es un fichero3. Preguntar si se quiere mover el fichero a otro

directorio o cambiarle el nombre4. Proceder en cada caso, pidiendo el nombre

nuevo para el fichero o el directorio al que se va a mover y realizar la operación (mv)

Page 57: ProgramaciProgramacióóóón nn n en Shell

Ejercicios

1. Modificar move para que el paso 3 se haga mediante case

2. Hacer un programa showLines que muestre numlíneas de un fichero empezando en start

– showLines start num file

3. Hacer un programa sayHello que diga “Buenos dias”, “Buenas tardes” o “Buenas noches”, seguido del nombre del usuario, según la hora que sea. El programa debe ejecutarse automáticamente al abrir un terminal

Page 58: ProgramaciProgramacióóóón nn n en Shell

Bucles

• For•for parametro [ in lista]

•do lista_comandos

•done

•parametro toma los valores de la lista y para cada uno de ellos se ejecuta lista_comandos

• Si se omite la lista, parametro contiene los parámetros de entrada al script ($1 $2 …)

Page 59: ProgramaciProgramacióóóón nn n en Shell

for (ii)

Page 60: ProgramaciProgramacióóóón nn n en Shell

for (iii)

• Sintaxis como en C:–for (( expr1; expr2; expr3 ))

–do

–…

–done

• Ejemplo:–for (( i = 0 ; i <= 5; i++ ))

do

echo “Hola $i veces"

done

Page 61: ProgramaciProgramacióóóón nn n en Shell

While

• Ejecutamos lista_comandos2 mientras la siguiente entrada de lista_comandos1tenga éxito (código de salida 0):

•while lista_comandos1

•do lista_comandos2

•done

Page 62: ProgramaciProgramacióóóón nn n en Shell

Until

• Como while, pero se ejecuta hasta que la condición sea verdadera, en vez de mientras la condición no sea falsa (~ do…while de C o java)

•until lista_comandos1

•do lista_comandos2

•done

Page 63: ProgramaciProgramacióóóón nn n en Shell

Ejemplos while - until

Page 64: ProgramaciProgramacióóóón nn n en Shell

Detalles

•break rompe un bucle for o while

•# a comienzo de línea para añadir un comentario

•$$ devuelve el identificador único de la shell

• Recursividad: un script puede llamarse a sí mismo

Page 65: ProgramaciProgramacióóóón nn n en Shell

Ejercicios

1. Hacer un script gp (groupcopy), que copie todos los ficheros del directorio actual al directorio especificado, con la siguiente sintaxis:

– gp [-q] [-d] directorioDestino

» -q para confirmar la copia de cada fichero» -d para incluir ficheros en los subdirectorios

Page 66: ProgramaciProgramacióóóón nn n en Shell

Ejercicios

2. Realizar un script digitalClock que muestre la hora cada segundo (función sleep), siempre en la misma posición (fila 0 y columna 69)

Page 67: ProgramaciProgramacióóóón nn n en Shell

Funciones

•nombreFuncion() {listaComandos;}

–Llamada: nombreFuncion parametros

•parametros es una lista separada por espacios

–$1, $2, … dentro del código de la función son los parámetros con los que se llama a la función• dentro de la función no se pueden referenciar los

parámetros posicionales.

–Una función debe declararse al principio del fichero, o al menos antes de su primera llamada

–Una función puede hacerse recursiva llamándose a sí misma

Page 68: ProgramaciProgramacióóóón nn n en Shell

Funciones (ii)

• Retorno de función:–Código de retorno: return n

–Devolver una variable: echo $var

–Si se retorna con echo, se considera un retorno con éxito (return 0)

–Ejemplo:•ret=`factorial 3`

•echo $?

•echo $ret

factorial()

{

echo $fact

}

Page 69: ProgramaciProgramacióóóón nn n en Shell

Funciones (iii)

Con return, los valores que se devuelven son numéricos y siguen el mismo código de retorno

Toma los parámetros como si fuera el script principal

No hay que declarar parámetros

Page 70: ProgramaciProgramacióóóón nn n en Shell

Alcance y Biblioteca de funciones

• Cualquier variable declarada en un punto o función del programa es acessible en cualquier otro punto o función– No hay definición de alcance más que para los parámetros

posicionales $1, $2, …

• Las funciones de un script puede utilizarse en otros scripts utilizando el comando–. ./script

– Generalmente, a los scripts que son sólo funciones tienen las extensión .lib

• La función se invoca como si estuviera en nuestro script

Page 71: ProgramaciProgramacióóóón nn n en Shell

expr

•expr expresion1 operador expresion2

•expr se puede sustituir por (( … ))• Realiza operaciones aritméticas

Comparación de enteros=,!=,\>,\>=, \<,\<=

Multiplicación, división, resto\*,/,%Suma, resta+, -

acciónoperador

Page 72: ProgramaciProgramacióóóón nn n en Shell

expr

• Y operaciones con cadenas

Posición de la primera ocurrencia del carácter c en c1

expr index c1 c

Subcadena de c1 que empieza en la posición start y de longitud length

expr substr c1

start length

Nº de caracteres de c1expr length c1

Nº de caracteres en que coinciden c1 y c2 (pueden ser expresiones regulares)

expr c1 : c2

acciónexpresión

Page 73: ProgramaciProgramacióóóón nn n en Shell

Ejercicios

1. Hacer un script fact que devuelva el factorial de un número que se pasa como argumento

– Sintaxis: fact num

2. Reescribir fact para que utilice una función que se llamará factorial

3. Modificar la función factorial para que sea recursiva

4. Ubicar la función factorial en otro fichero (common.lib) y reescribir fact para que la invoque a través de la biblioteca de funciones.

Page 74: ProgramaciProgramacióóóón nn n en Shell

wait y sleep

•wait [n]

–Espera hasta que el proceso con id n acabe–Si no es especifica id, espera a que todos los

procesos hijos en background terminen–“!” da el id del último proceso lanzado en segundo

plano � wait $! para esperar por él

•sleep n

–El script se queda bloqueado sin hacer nada durante n segundos

Page 75: ProgramaciProgramacióóóón nn n en Shell

Depuración

•sh –v script

• Escribe cada linea de código que ejecuta:

–tot=`expr $1 + $2`–echo $tot

$ sh -v suma.sh 4 5tot=`expr $1 + $2`expr $1 + $2echo $tot9

Page 76: ProgramaciProgramacióóóón nn n en Shell

Depuración de scripts

•sh –x script

• Sustituye cada $var por su valor• Muestra cada línea de código que se va

ejecutando–Precedida de +, o de ++ si es un ‘subcomando’ de la

línea

–tot=`expr $1 + $2`–echo $tot

$ sh -x suma.sh 4 5++ expr 4 + 5+ tot=9+ echo 99

Page 77: ProgramaciProgramacióóóón nn n en Shell

ProgramaciProgramaciProgramaciProgramacióóóón n n n

avanzada en bashavanzada en bashavanzada en bashavanzada en bash

Page 78: ProgramaciProgramacióóóón nn n en Shell

1.1.1.1. Variables locales y globalesVariables locales y globalesVariables locales y globalesVariables locales y globales

2.2.2.2. SeSeSeSeññññalesalesalesales

3.3.3.3. getoptsgetoptsgetoptsgetopts

4.4.4.4. Utilidades esencialesUtilidades esencialesUtilidades esencialesUtilidades esenciales

Page 79: ProgramaciProgramacióóóón nn n en Shell

Variables globales y locales

• Las variables declaradas en un programa son locales, y por tanto no estarán disponibles en otras shells

• Para hacer global: export var

$ vech=Bus

$ echo $vech

Bus

$ export vech

$ /bin/bash

$ echo $vech

Bus

$ exit

$ echo $vech

Bus

$ vech=Bus

$ echo $vech

Bus

$ /bin/bash

$ echo $vech

$ vech=Car

$ echo $vech

Car

$ exit

$ echo $vech

Bus

Page 80: ProgramaciProgramacióóóón nn n en Shell

Ejecución condicional

•comando1 && comando2

–Ejecuta comando2 sólo si comando1 se ejecutó con éxito

•comando1 || comando2

–Ejecuta comando2 sólo si comando1 se ejecutó sin éxito

•listaComandos1 ; listaComandos2

–Se ejecuta primero listaComandos1, luego listaComandos2

– test –d /tools && cd /tools; test –z “$fn” || sort –o $fn $fn &

Page 81: ProgramaciProgramacióóóón nn n en Shell

Señales

• Un programa puede terminar de manera forzosa debido a un error en el SO o a la interrupción por parte del usuario

• Para controlar estos eventos, se utilizan señales

• Si, por ejemplo, un programa modifica ficheros delicados o crea ficheros temporales, etc. debe manejar la gestión de señales para evitar dejar ficheros incompletos o innecesarios

Page 82: ProgramaciProgramacióóóón nn n en Shell

Trap

•trap {comandos} {lista de ids. de señal}

• Ejecuta la lista de comandos cuando se produce alguna de las señales especificadas

• Una vez incluida, se mantiene a la escucha para el resto del programa

• Es bueno tratar estas señales en una función, que será la que se incluya en trap como comando

Page 83: ProgramaciProgramacióóóón nn n en Shell

ids. de señal

kill (no se puede coger con trap)9

terminate (kill que se puede coger con trap)15

quit3

interrupt (CTRL+C)2

hangup (colgar)1

salida de la shell0

ocurre cuandonº de señal

Existen muchas más señales (segmentation fault, bus error, power fail, etc) , pero generalmente, estas son las que se busca controlar

Page 84: ProgramaciProgramacióóóón nn n en Shell

Señales: ejercicio

• Hacer un programa ages que1. Acepte un único parámetro, el nombre de un

fichero2. Indefinidamente:1. Pregunte por un nombre y luego por una edad 2. Añada el nombre y la edad a un fichero temporal temp3. Pregunte si se quieren añadir más ficheros4. Si no se van a añadir más ficheros, vuelca temp al

fichero que se pasó como parámetro

3. Ejecutar el programa, meter un par de nombres y luego pulsar CTRL+C

Page 85: ProgramaciProgramacióóóón nn n en Shell

Señales: ejercicio (II)

• ¿Qué ocurre? temp no se ha borrado y no se ha generado el fichero final

• Hacer tratamiento de la señal generada por CTRL+C para que temp se borre en ese caso.

Page 86: ProgramaciProgramacióóóón nn n en Shell

getopts

•getopts optstring var1

• Recoge las opciones que se le hayan pasado al script y que coincidan con la sintaxis en optstring, almacenándolos en var1

• Si un parámetro en optstring va seguido de :quiere decir que requiere de un argumento

• Ejemplo de optstring:–n:asgr:t

»-n argn –a –s –g –r argr –t

»-n argn –r argr -asgt

Page 87: ProgramaciProgramacióóóón nn n en Shell

getopts (II)

• Si una opción requiere de argumento, se almacena en $OPTARG

•$OPTIND es el índice del siguiente parámetro• Ejemplo:

• while getopts n:a:s opt

do

case "$opt" in

n) na="$OPTARG";;

a) age="$OPTARG";;

s) single=“y” ;;

esac

done

usage: civilState –n name –a age -s

Page 88: ProgramaciProgramacióóóón nn n en Shell

getopts: ejercicios

1. Modificar el programa move para que los parámetros sean recogidos mediante getopts

– usage: move [–f file | -d dir] filename

2. Escribir un script utilities que, mediante getopts, comprenda la sintaxis

– usage: utilities –c –d –e editor– -c limpia la pantalla– -d muestra la lista de ficheros en el directorio actual– -e inicia el editor que se pase como parámetro (p. ej,

vi), comprobando si existe antes– -? muestra la ayuda (usage)

Page 89: ProgramaciProgramacióóóón nn n en Shell

Utilidades esenciales

• Linux provee una serie de utilidades esenciales para agilizar el trabajo:– Ficheros de datos– Información del sistema– Administración del sistema

• De todas ellas, veremos las más importantes–cut

–paste

–join

–tr

–uniq

Page 90: ProgramaciProgramacióóóón nn n en Shell

Ficheros

• Vamos a trabajar sobre dos ficheros sencillos

Sr.No Name11 Vivek12 Renuka13 Prakash14 Ashish15 Rani

Sr.No Mark11 6712 5513 9614 3615 67

sname

(nombres)

smark

(patrimonio en mill.)

Page 91: ProgramaciProgramacióóóón nn n en Shell

cut

Extracción de columnas o campos: cut–cut [opciones] [fichero ...]

Opciones-c lista Trata cada carácter como una columna

-f lista Campos delimitados por tabuladores

-d SEP Utiliza el carácter SEP como separador en vez del tabulador

lista es una secuencia de números para indicar qué campos o columnas se quieren cortar:A-BCampos o columnas A hasta B inclusive

A- Campo o columna A hasta el final de la línea

A,BCampos o columnas A y B

Page 92: ProgramaciProgramacióóóón nn n en Shell
Page 93: ProgramaciProgramacióóóón nn n en Shell

paste

• Pegar líneas de ficheros por columnas•paste file1 file2

• Como separador, añade un tabulador

• Ejercicio: Generar un fichero con códigos, patrimonio y nombres, pero sin repetir el código de persona

$ paste sname smark11 Vivek 11 6712 Renuka 12 5513 Prakash 13 9614 Ashish 14 3615 Rani 15 67

cut –f2 smark > temp; paste sname temp; rm temp

Page 94: ProgramaciProgramacióóóón nn n en Shell

join

• Pega líneas de dos ficheros, por columnas, sólo para las líneas que tienen el mismo valor en la primera columna (que no se repite)–join file1 file2

• Si uno de los campos no existe en alguno de los ficheros, no lo añade

$join sname smark11 Vivek 6712 Renuka 5513 Prakash 9614 Ashish 3615 Rani 67

Page 95: ProgramaciProgramacióóóón nn n en Shell

tr

• Cambiar un rango de caracteres a otro distinto–tr pattern1 pattern2

$ tr "h2" "3x" < sname11 Vivek1x Renuka13 Prakas314 As3is315 Rani

$ tr "[a-z]" "[A-Z]" holaHOLA…

Page 96: ProgramaciProgramacióóóón nn n en Shell

tr (ii)

• Opciones

elimina pattern1 (no se necesita pattern2)-d

(delete)

añade pattern2 a pattern1 en vez de sustituirlo-c

(concat)

busca las cadenas más largas que coincidan con pattern1 antes de sustituirlas por pattern2

-s

(squeeze)

descripciónopciones

Page 97: ProgramaciProgramacióóóón nn n en Shell

tr (iii) - ejemplos

•echo “hola que tal” | tr “hl” “cs”

–cosa que tas

•echo “hola que tal” | tr “[a-z]” “3”

–3333 333 333

•echo “hola que tal” | tr –s “[a-z]” “3”

–3 3 3

•echo “hola que tal” | tr –sc “[a-z]” “3”

–hola3 que3 tal3

•echo “hola que tal” | tr –d “[aeiou]”

–hl q tl

Page 98: ProgramaciProgramacióóóón nn n en Shell

uniq

• Elimina líneas duplicadas adyacentes– uniq file

• -c indica el número de veces que aparece duplicada

• Su salida es el mismo fichero sin líneas duplicadas adyacentes

• Si queremos eliminar todas las líneas duplicadas

– sort file | uniq

Page 99: ProgramaciProgramacióóóón nn n en Shell

Ejercicios con ficheros

• Hacer un script listWords que recoja todas las palabras de file1 y las ordene en una lista de palabras (sin repetir), según la cantidad de veces que aparecen (que debe aparecer en la lista), que se guardará en file2

– listWords file1 file2

• Modificar el script para que acepte la opción –v, en cuyo caso la ordenación se llevará a cabo según palabras que rimen

– truco: usar rev

Page 100: ProgramaciProgramacióóóón nn n en Shell

ejercicios

• Un digrama es un conjunto de dos palabras. Realizar un script que liste, en orden, el número de ocurrencias de cada digrama en un fichero que se pase como parámetro

•listDigrams file1 file2

Page 101: ProgramaciProgramacióóóón nn n en Shell

awk y sedawk y sedawk y sedawk y sed

Page 102: ProgramaciProgramacióóóón nn n en Shell

a)a)a)a) sedsedsedsed

1.1.1.1. substitucionessubstitucionessubstitucionessubstituciones

2.2.2.2. delimitadoresdelimitadoresdelimitadoresdelimitadores

3.3.3.3. marcadoresmarcadoresmarcadoresmarcadores

4.4.4.4. ocurrenciasocurrenciasocurrenciasocurrencias

5.5.5.5. scriptingscriptingscriptingscripting

6.6.6.6. restriccionesrestriccionesrestriccionesrestricciones

b)b)b)b) awkawkawkawk

1.1.1.1. patronespatronespatronespatrones

2.2.2.2. accionesaccionesaccionesacciones

3.3.3.3. variablesvariablesvariablesvariables

4.4.4.4. scriptingscriptingscriptingscripting

5.5.5.5. nawknawknawknawk

Page 103: ProgramaciProgramacióóóón nn n en Shell

sed

• stream editor: edición de textos en script–sed –e ‘expr1’ [–e ‘expr2’ …] filename

•sed suele estar muy mal documentado:–http://www.grymoire.com/Unix/Sed.html#uh-0

• Si sólo se usa una expresión, se puede quitar el –e: sed ‘expr1’ filename

• Si no se pone filename, se usa la entrada estándar

Page 104: ProgramaciProgramacióóóón nn n en Shell

sed - substitución

•sed ‘s/word1/word2/’ filein>fileout

• Para cada línea de filein, sed busca la primera ocurrencia de word1 y la substituye por word2 , añadiendo la línea resultante a fileout

•word1 y word2 pueden ser expresiones regulares• Si no se especifica fileout, lo escribe en consola• Ejemplo: sed ‘s/gold/stone/’ coins.txt>• La substitución es la operación más común para la que

se usa sed

Page 105: ProgramaciProgramacióóóón nn n en Shell

sed - delimitadores

• El delimitador (/) puede cambiarse por cualquier otro carácter que no aparezca en las secuencias de búsqueda

• Ejemplo: sustituir rutas de fichero–sed 's|/usr/local/bin|/common/bin|' old >new

–sed 's:/usr/local/bin:/common/bin:' old >new

–sed 's_/usr/local/bin_/common/bin_' old >new

– Con barras sería•sed 's/\/usr\/local\/bin/\/common\/bin/' old >new

Page 106: ProgramaciProgramacióóóón nn n en Shell

&

• & indica la cadena correspondiente al patrón buscado

• Útil cuando no sabemos exactamente qué estamos buscando (expresiones regulares):–Poner paréntesis a cualquier palabra en minúscula

sed 's/[a-z]*/(&)/' old >new

–Duplicar el primer número de cada línea–echo "123 abc" | sed 's/[0-9]*/& &/'

–echo "abc 123" | sed 's/[0-9]*/& &/‘ � ?

–echo "abc 123 456" | sed 's/[0-9]*/& &/‘ � ?

Page 107: ProgramaciProgramacióóóón nn n en Shell

substitución global

•sed sólo modifica la primera ocurrencia de la expresión buscada en cada línea

• para modificar todas las ocurrencias–‘s/pattern1/pattern2/g’

• echo "abc 123 456" | sed 's/[0-9][0-9]*/& &/g‘

Page 108: ProgramaciProgramacióóóón nn n en Shell

flags (marcadores)

• Podemos marcar los patrones con \(…\)

• Un patrón marcado se puede repetir con \1, \2… según el orden en que se hayan marcado (hasta \9)

• Quedarnos con la primera palabra de cada línea:–sed 's|\([a-z]*\).*|\1|'

• Cambiar el orden de la primera y la segunda palabra–sed 's|\([a-z]*\) \([a-z]*\)|\2\1|'

• Eliminar palabras duplicadas–sed 's|\([a-z]*\) \1|\1|'

• probar con echo “perro perro gato”• y con echo “casa perro gato”?

Page 109: ProgramaciProgramacióóóón nn n en Shell

ocurrencias

• /n especifica a qué ocurrencia del patrón nos referimos

• Eliminar la segunda palabra de cada línea• echo "casa perro gato " | sed 's/[a-z][a-z]* //2'

• Comparar con • echo "casa perro gato " | sed 's/[a-z][a-z]* //'

• echo "casa perro gato " | sed 's/[a-z][a-z]* //g'

•/n se puede combinar con g:• echo "casa perro gato " | sed 's/[a-z][a-z]* //2g'

Page 110: ProgramaciProgramacióóóón nn n en Shell

escribir a fichero

•sed ‘s/word1/word2/w file’ filein

• No tiene mucho sentido si solo tenemos una expresión (es equivalente a >file)

• Es muy útil si tenemos varias expresiones y queremos que la acción de cada una vaya a un fichero diferente

• En caso de que se usen varias opciones tras el último /, w debe ser la última.

Page 111: ProgramaciProgramacióóóón nn n en Shell

sed scripting

• Cuando tenemos muchas expresiones sed, es cómodo hacer un sedscript:

•#Este script cambia vocales minúsculas

a mayúsculas

•s/a/A/g

•s/e/E/g

•s/i/I/g

•s/o/O/g

•s/u/U/g

• Para llamarlo: sed –f script filein>fileout

Page 112: ProgramaciProgramacióóóón nn n en Shell

sed en shell script

• Dentro de un shell script, podemos usar igualmente sed. Podemos utilizar varias líneas usando “\”•sed -e 's/a/A/g‘ \

-e 's/e/E/g' \

-e 's/i/I/g' \

-e 's/o/O/g' \

-e 's/u/U/g' filein >fileout

Page 113: ProgramaciProgramacióóóón nn n en Shell

paso de argumentos a sed en shell script

• Deberemos jugar con las comillas para que no tome el argumento como una expresión regular:

•sed -n 's/'$1'/&/g'

• Para evitar problemas de sintaxis en el caso de que el parámetro contenga espacios:

•sed -n 's/‘“$1”'/&/g'

Page 114: ProgramaciProgramacióóóón nn n en Shell

restricciones

• Restringir a una línea– sed ‘n s/searh/replace/options’ filein>fileout

• Restringir a un rango de líneas– sed ‘n,m s/searh/replace/options’ filein>fileout

• La última línea del fichero se identifica con $• Restricción con patrones: la búsqueda va de la

primera línea en la que se encuentre p1 hasta la primera en que se encuentre p2– sed ‘/p1/,/p2/ s/searh/replace/options’ fin>fout

Page 115: ProgramaciProgramacióóóón nn n en Shell

otras opciones

•sed tiene multitud de opciones adicionales–manejo de E/S–condiciones (if, else)–control de flujo (for, while)–etc.

• Sin embargo, para soluciones más complejas que búsquedas y sustituciones simples, awk es más potente y más fácil de utilizar

Page 116: ProgramaciProgramacióóóón nn n en Shell

otras acciones

write (escribe a fichero la salida de sed)w

print (imprime por pantalla la salida de sed)p

quit (terminar la ejecución)q

significadoacciones

Page 117: ProgramaciProgramacióóóón nn n en Shell

Ejercicios

1. Sustituir todas las vocales minúsculas de un fichero por vocales mayúsculas

2. Realizar el mismo ejercicio, pero mediante un sedscript llamado vowels

3. Realizar el mismo ejercicio, pero en una shellscript

4. Modificar 3 para que se acepten los nombres de ficheros de entrada y salida como argumentos

Page 118: ProgramaciProgramacióóóón nn n en Shell

ejercicios (ii)

5. Queremos cambiar todos los ficheros con extensión *.txt a *.tex. Hacer mv *.txt *.tex no funciona ¿Por qué? Hacer un script basename que realice esta función

Page 119: ProgramaciProgramacióóóón nn n en Shell

awk

• Se puede ver como– Utilidad para realizar procesamiento sencillo de texto– Lenguaje de programación para procesamiento

complejo de texto

• Basado en C• Utilizado para

– Generación de informes– Manejo de Bases de Datos pequeñas– Traducir formatos de fichero– Realizar operaciones matemáticas en ficheros

numéricos

Page 120: ProgramaciProgramacióóóón nn n en Shell

awk (ii)

• AWK � Aho, Weinberg & Kernigan–Kernigan es autor, junto con Ritchie, de C

• AWK es un lenguaje interpretado–Relativamente lento–Fácil de apreder

• AWK cuando no haya una solución más sencilla:–grep para buscar texto–head/tail para quedarnos con partes de texto–cat, paste, join para unir ficheros–sed para hacer búsquedas/reemplazos–tr, unique, sort para transformaciones básicas

Page 121: ProgramaciProgramacióóóón nn n en Shell

Fichero de ejemplo: coins.txt

metal weight_in_ounces date_minted country_of_origin description

gold 1 1986 USA American Eagle

gold 1 1908 Austria-Hungary Franz Josef 100 Korona

silver 10 1981 USA ingot

gold 1 1984 Switzerland ingot

gold 1 1979 RSA Krugerrand

gold 0.5 1981 RSA Krugerrand

gold 0.1 1986 PRC Panda

silver 1 1986 USA Liberty dollar

gold 0.25 1986 USA Liberty 5-dollar piece

Page 122: ProgramaciProgramacióóóón nn n en Shell

sintaxis

• Aplicar a un fichero un patrón awk• awk [-F<del>]‘/search_pattern/ {awk_actions}’ filename

– Aplica awk_actions a todas las líneas de filename que cumplan con search_pattern

– -F<del> especifica el carácter a utilizar como delimitador de columnas. Por defecto, se toman espacios y tabuladores

• Aplicar a un fichero un programa awk•awk –f awk_program filename

• Básicamente ambas opciones son lo mismo, la segunda se usa cuando el patrón awk se hace muy largo o lo tenemos en un fichero

Page 123: ProgramaciProgramacióóóón nn n en Shell

patrones de búsqueda

• awk busca en el fichero de entrada todas las líneas que contengan el patrón de búsqueda

• Patrones de búsqueda–/seq/ busca líneas que contengan seq

•var ~ /seq/ busca variables (ver +abajo) que contengan seq

–BEGIN busca la primera línea–END busca la última línea

• Si no se especifica patrón de entrada, devuelve todaslas líneas del fichero

• Las secuencias de búsqueda pueden llevar metacaracteres

Page 124: ProgramaciProgramacióóóón nn n en Shell

metacaracteres

Coincide con el patrón a su izquierda o derecha|

El carácter anterior aparece 0 ó 1 vez?

El carácter anterior aparece 1+ veces+

Coincide con la expresión exacta entre {}{ }

Coincide con alguna de los caracteres entre [][ ]

El carácter siguiente no es metacaracter\

Coincide con el final de línea$

Coincide con el comienzo de línea^

El carácter anterior aparece 0+ veces*

Cualquier carácter (uno).

significadometa caracter

Page 125: ProgramaciProgramacióóóón nn n en Shell

ejemplos de búsqueda

“Germany” “Germany’s politics …”/{^Germany}/

“Bourne” “815oceanic”^[^a-z]

“bourne” “Bourne” “oceanic815”/[a-zA-Z0-9]/

“plane” “house” “bourne”/[a-z]/

“The” “the”/[Tt]he/

“$”/\$/

“Bourne Ultimatum, The”, “The”, “Pathe”/The$/

“The Bourne Ultimatum”, “The”, “Thelema"/^The/

“The”/The/

resultadopatrón

Page 126: ProgramaciProgramacióóóón nn n en Shell

ejemplos de búsqueda (ii)

[0-9]+ Cualquier cadena de números[-+]? Posible signo inicial/^…$/ La línea coincide exactamenteCualquier entero (con o sin signo)/^[+-]?[0-9]+$/

“wh” “whh” “whhh” …/wh+/

“w” “wh”/wh?/

Cualquier cadena de caracteres/.*/

“w“ “wh” “whh” “whhh” …/wh*/

“who” “why” “wh3” …/wh./

resultadopatrón

Page 127: ProgramaciProgramacióóóón nn n en Shell

acciones

• awk ‘/search_pattern/ {awk_actions}’ filename

• Podemos tener cualquier tipo de acción que ofrezca awk como lenguaje de programación (~C)– Asignación de variables y arrays (=)– Operaciones aritméticas simples (+,-,*,/,%, ++, --, ^)– Comparaciones aritméticas (==,!=,>,<,>=,<=)– Operaciones aritméticas avanzadas (sqrt, log, exp, int)– Salida por pantalla (print y printf)– Procesamiento de cadenas (substr, split, index, length)– Estructuras de control (if…else, for, while)

• For se puede usar como en bash: for(var in lista) o como en C

Page 128: ProgramaciProgramacióóóón nn n en Shell

acciones

devuelve la longitud de la cadenalength(str)

Como en shell y Cbreak, continue, exit

salta a la siguiente línea de textonext

index(“gorbachov”, “bach”) � 4index(“gorbachov”, “z”) � 0

index(str, str)

split(“jay:bob”,c,”:”) � c[1]=jay, c[2]=bob

split(str, array

[,sep])

substr("unforgettable",6,3) � “get”substr(str,start,

length)

descripciónacción

Page 129: ProgramaciProgramacióóóón nn n en Shell

print y printf

imprime siguiendo la sintaxis de C:%d, %f, %o, %x%n.m\n, \t

printf()

imprime “cad1cad2”print “cad1”

“cad2”

imprime “cad1 cad2”print

“cad1”,”cad2”

imprime la linea actualprint

descripciónacción

Page 130: ProgramaciProgramacióóóón nn n en Shell

variables

• No tienen tipo ni hay que declararlas• Se asignan como en los programas de la shell• Variables especiales:

Valor de la última columna$NF

Número de columnasNF

Número de líneas de entradaNR

Contiene el valor de toda la línea$0

Variable de campo, da el valor de la columna 1, 2, 3 …

$1, $2, $3…

descripciónvariable

Page 131: ProgramaciProgramacióóóón nn n en Shell

variables especiales (ii)

Formato numérico. Por defecto “%.6g”OFMT

Como los anteriores pero para el fichero de salida

OFS, ORS

Separador de filas. Por defecto es “newline”, refiriéndose a “\n”

RS

Separador de columnas. Por defecto es “white space”, refiriéndose a “[ ]“ y “\t”

También se puede modificar con la opción de comando –F seguido del delimitador (-F:, -F/)

FS

Nombre del fichero de entradaFILENAME

descripciónvariable

Page 132: ProgramaciProgramacióóóón nn n en Shell

arrays

• Sólo tienen una dimensión• El acceso se identifica por indices–array[1], array[2], array[3]

–Los índices van de 1 a N

• Podemos usar como índices cadenas:– array[“Roberto”], array[“Antonio”], array[“Luis”]

– En este sentido, se pueden utilizar los arrays como tablas hash

• Para acceder a cada elemento de un array–for (i in array) print $i

Page 133: ProgramaciProgramacióóóón nn n en Shell

Ejemplos

• Imprimir todas las líneas con la palabra “gold”– awk ‘/gold/’ coins.txt

• Imprimir todas las líneas de coins.txt– awk ‘{print}’ coins.txt

• Imprimir la tercera columna de coins.txt– awk ‘{print $3}’ coins.txt

• Guardar la tercera columna de las líneas de coins.txt que contengan la palabra “gold” a un fichero goldYear.txt

– awk ‘/gold/ {print $3}’ coins.txt > goldYear.txt

Page 134: ProgramaciProgramacióóóón nn n en Shell

Ejemplos

• Hacer doble espaciado en coins.txt (poner una línea en blanco tras cada línea)–awk ‘{print ; print “ “}’ coins.txt

• Hacer doble espaciado SIN duplicar líneas en blanco–awk {print ; if(NF>0) print “”} coins.txt

• Contar el número de líneas en el fichero–awk ‘END {print NR}’ coins.txt

–wc coins.txt

Page 135: ProgramaciProgramacióóóón nn n en Shell

Ejemplos

• Imprimir el tamaño medio de los ficheros de nuestro directorio actual

• ls -l | awk '{count+=$5} END {print count/(NR-1)}‘

• Generar los 10 primeros números de la secuencia de Fibonacci: 1 1 2 3 5 8 13 21 34 55

»awk 'BEGIN

» {

» a=1; b=1;

» count=0;

» while(count++<10)

» {print a; ta=a; a=b; b=b+ta;}

» }'

Page 136: ProgramaciProgramacióóóón nn n en Shell

Scripts con awk

• Hacer un script que se llame words, que escriba cada palabra en el fichero pasado como parámetro en una nueva línea– awk ‘NF>0 {split($0, c); for(i in c) print $i}’ $1

– awk ‘BEGIN {FS=“[^A-Za-z]+”}

– {for(i=1;i<=NF;i++) print $i}’ $1

Page 137: ProgramaciProgramacióóóón nn n en Shell

Programas awk

• Un programa awk tiene el siguiente aspecto:•search_pattern1 {awk_actions1}

search_pattern2 {awk_actions2}

•…

• search_patternN {awk_actionsN}

• Se llama con:

•awk –f awk_program filename

Page 138: ProgramaciProgramacióóóón nn n en Shell

Ejemplo programa awk: findDup

• Buscar palabras seguidas duplicadas en un fichero

• BEGIN { dups=0; w="xy-zzy" }

• {

• for( n=1; n<=NF; n++)

• {

• if ( w == $n )

• {

• print w, "::", $0 ;

• dups = 1

• }

• w = $n

• }

• }

• END { if (dups == 0)

• print "No duplicates found."

• }

Page 139: ProgramaciProgramacióóóón nn n en Shell

Ejercicios

1. Modificar findDup para que muestre el número de línea en el que se produce el duplicado

2. Modificar findDup para que no cuente la última palabra de la línea anterior

Page 140: ProgramaciProgramacióóóón nn n en Shell

Condiciones

• En vez de patrones de búsqueda, podemos usar condiciones.

• Ejemplo: buscar líneas con el nº diez en su segundo campo, e imprimir la línea siguiente•BEGIN {flag = 0}

•$2 == 10 {flag = 1; next}

•flag == 1 {print; flag = 0; next}

• ¿Cómo modificar para que acepte cualquier número en vez del 10 como parámetro?

Page 141: ProgramaciProgramacióóóón nn n en Shell

ejercicios: bases de datos

• Trabajando sobre el fichero cars.txt1. Buscar todos los coches de la marca volvo2. Mostrar la columna 3, seguida de la 13. Mostrar todas las entradas que contengan una ‘h’

en la primera columna4. Mostrar todas las entradas cuya primera columna

empiece con una ‘h’5. Mostrar la columna 2, luego la 1, luego un ‘mpg’

seguido de la columna 3; sólo para aquellas entradas cuya seguna columna empieza por m o t. ¿Se observa algo raro?

Page 142: ProgramaciProgramacióóóón nn n en Shell

ejercicios (ii)

6. Mostrar las entradas cuya columna 5 tiene un valor numérico menor o igual a 100

7. Mostrar todas las entradas desde la primera que contenga ‘toyota’ hasta la primera que contenga ‘chevrolet’

8. Mostrar todos los usuarios del sistema que no tengan como shell por defecto /bin/sh

Page 143: ProgramaciProgramacióóóón nn n en Shell

script con awk

• En shell script, los parámetros de la función están en $1, $2, $3 …

• En awk, $1, $3, $3 … expresan campos!

• Si queremos usar parámetros del script en llamadas a awk, antes tenemos que almacenarlos en otras variables

Page 144: ProgramaciProgramacióóóón nn n en Shell

Ejemplo awk script

• Ejemplo: hacer un script que, mediante awk, devuelva un campo de un fichero. Campo y fichero deben ser parámetros del script

»file=$1

»num=$2

»awk '{print $'$num'}' $file

»awk '{print $' $2 '}' $1

• En estos casos, no podemos usar awk –f y tener el programa awk en otro fichero, pues no podríamos pasarle los parámetros de la script

Page 145: ProgramaciProgramacióóóón nn n en Shell

Ejercicios awk scripts

• Un palíndromo es una palabra que es igual si se escribe de izquierda a derecha que al revés. Buscar todos los palíndromos que se encuentran en un texto. El script tendrá la sintaxis:–palindrome filein fileout

Page 146: ProgramaciProgramacióóóón nn n en Shell

ejercicios (ii)

• Hacer un script que devuelva todas las palabras de un fichero (sin repetir) que tengan tantas letras como se le indique. El script debe tener la sintaxis–textAnalysis –l n file

• donde n es el número de letras• file es el fichero de entrada

Page 147: ProgramaciProgramacióóóón nn n en Shell

nawk

• awk está diseñado para hacer programas cortos• pero mucha gente lo adoptó como lenguaje de

programación al uso y desarrollaba con él• nawk (new awk) trata de incorporar herramientas

para una mejor gestión de programas largos–Funciones–Entrada: getline–Trigonometría: sin, cos, atan2, rand, srand–Manejo de cadenas: match, sub

Page 148: ProgramaciProgramacióóóón nn n en Shell

otras versiones e implementaciones

• bkw: versión de Brian Kernigan de awk• gawk: implementación GNU de awk

– No funciona en todos los sistemas– xgawk: projecto SourceForge que extiene awk con la carga

de bibliotecas dinámicamente

• mawk: implementación muy rápida de awk por Mike Brennan, basado en un intérprete de código binario– awka: traductor de awk a C basado en mawk.

• tawk: compilador de awk para DOS y Windows de Thompson Automation Software

• jawk: implementación de awk en Java

Page 149: ProgramaciProgramacióóóón nn n en Shell

shell y awk en la historia de la programación

http://www.oreilly.com/news/graphics/prog_lang_poster.pdf

Page 150: ProgramaciProgramacióóóón nn n en Shell

referencias

• Tutoriales utilizados–shell scripting

• http://www.cyberciti.biz/nixcraft/linux/docs/uniqlinuxfeatures/lsst/

• http://tldp.org/LDP/abs/html/index.html

–sed• http://www.grymoire.com/Unix/Sed.html#uh-1

–awk• http://cs.sru.edu/~whit/cpsc207/notes/awkegs.html• http://www.vectorsite.net/tsawk_1.html#m1

Page 151: ProgramaciProgramacióóóón nn n en Shell

referencias (ii)

• Libros– Shells: User’s Guide. Hewlett Packard,

1991– Linux & Unix Shell Programming. David

Tansley– Portable Shell Programming. Bruce Blinn– Unix Shell Programming. Stephen G.

Kochan and Patrick H. Wood

– sed & awk. Dale Dougherty and Arnold Robbins

– awk Programming. Arnold Robbins– The AWK programming language. Aho,

Kernigan y Weinberger, 1988, Addison-Wesley.