Sistemas UNIX - PowerPoint PPT Presentation

About This Presentation
Title:

Sistemas UNIX

Description:

en Shell Rodrigo Santamar a Vicente Dpto. Inform tica y Autom tica Contenidos Introducci n a la shell Programaci n b sica en bash Programaci n avanzada sed y ... – PowerPoint PPT presentation

Number of Views:98
Avg rating:3.0/5.0
Slides: 151
Provided by: visUsalEs
Category:

less

Transcript and Presenter's Notes

Title: Sistemas UNIX


1
Programación en Shell
Rodrigo Santamaría Vicente
Dpto. Informática y Automática
2
Contenidos
  1. Introducción a la shell
  2. Programación básica en bash
  3. Programación avanzada
  4. sed y awk
  5. Referencias

3
Introducción a la Shell
4
  1. Qué es una shell?
  2. Tipos de shell
  3. Usos de la shell
  4. Variables de entorno

5
Qué es una shell?
  • Interfaz entre el Sistema Operativo y el usuario
  • Dos tipos
  • Gráfica
  • Línea de Comandos
  • CLI (Command Line Interface)
  • intérprete de comandos, terminal, consola

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.
6
Shell Gráfica
7
Shell de Línea de Comandos
Generalmente con shell nos referimos a una CLI de
Unix
8
Gráfica vs Texto
Gráfica Línea de Comandos
Sencilla Fácil uso Ciertas operaciones son más rápidas
Usuario base Usuario experto
Procesamiento de imagen, video, etc. Transferencia o procesamiento de datos
9
Tipos de shell
  • Bourne shell (sh)
  • 1977. Stephen Bourne, Bell Labs.
  • C Shell (csh)
  • 1980. Bill Joy, Berkeley
  • Korn Shell (ksh)
  • 1980. David Korn, Bell Labs.
  • Bourne again shell (bash)
  • 1987. Brian Fox, GNU Project

10
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

11
C Shell (csh)
  • Sintaxis como el lenguaje C
  • No compatible con la familia Bourne
  • Capacidades interactivas
  • Pausar/reiniciar procesos
  • Historia de comandos
  • Operaciones matemáticas

12
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

13
Distribuciones
bash csh ksh
linux freebsd solaris
mac os X AIX, HP-UX, BSD
14
POSIX shell
  • Similar a ksh y utilizada por HP-UX
  • 95 compatible con Bourne shell
  • Como ksh, integra características de la csh,
    mejoradas (histórico de comandos, autocompleción,
    operaciones aritméticas)
  • Las diferencias con bourne shell son menores
  • Las diferencias entre POSIX y ksh son mínimas
  • http//docs.hp.com/en/B2355-90046/ch15s03.html

15
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
  • /etc/shells es un fichero con todas los tipos de
    shell disponibles en el sistema

16
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

17
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

18
Procesamiento secuencial
  • El sistema completa cada comando antes de
    ejecutar el siguiente

date ps fu who
19
Procesamiento secuencial
  • date ps fu who

20
Procesamiento no Secuencial
  • Cada programa se ejecuta sin esperar a que el
    anterior termine

date ps -fu who
date
ps
who
ps
date
who
21
Redirección de E/S
  • gt Escribe la salida estándar a fichero
  • lt Lee la entrada estándar de fichero
  • gtgt Añade la salida estándar a un fichero
    existente
  • gt y gtgt crean el fichero si no existe
  • lt da error si el fichero no existe

22
Tuberías (pipes)
  • Conectan la salida de un programa a la entrada
    del siguiente
  • ls more ? ls gt temp more lt temp

23
Shell script
  • Simplemente, poner en un 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

24
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

25
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

sh bash ksh csh
.profile .bash_profile .bash_login .profile .bashrc .profile .kshrc .profile .cshrc
26
Variables de entorno
PATH Directorios para la búsqueda de parámetros, separados por ()
HOME Directorio raíz de nuestra cuenta
LOGNAME Nombre de cuenta con el que hemos accedido al sistema
PWD Directorio de trabajo actual
OSTYPE Tipo de Sistema Operativo
PS1 Configuración del prompt de consola
SHELL Shell que estamos usando
27
Variables de entorno
  • Para acceder al valor VAR
  • Para imprimir el valor echo VAR
  • Para cambiar el valor VARvalor
  • 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

28
Programación básica en Bourne Shell
29
  • Introducción
  • Variables
  • Parámetros
  • E/S
  • Condiciones
  • Bucles
  • Funciones
  • Operaciones aritméticas
  • Depuración

30
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

31
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 shell
  • Porque nos lo mandan (como es el caso)
  • Porque sabemos programar el esfuerzo necesario
    para aprender es muchísimo menor
  • Porque en nuestro trabajo nos va a ser útil
  • Administradores tareas complejas o
    automatizables
  • Hackers tareas rápidas
  • Programadores usuarios tareas que se repiten

32
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 mayor útil será la programación
    en shell

33
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 variablevalor
  • Acceder al valor variable

34
Variables (II)
  • Para diferenciar el valor de variables en
    cadenas, usamos
  • dir2/home/rodrigo/curso
  • cat dir2/lista.txt
  • 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

35
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
  • , _at_ devuelven todos los parámetros separados
    por espacios

36
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

37
Gestión E/S echo
  • Salida por consola echo cadena

Caracteres especiales descripción
-n Evita el salto de línea (útil si se espera un parámetro de entrada)
\ Elimina el significado especial del siguiente carácter
Todo lo que está entre comillas pierde su significado especial salvo y \
Lo que encierra se toma literalmente
Todo lo que está entre acentos graves se trata como un comando
38
echo secuencias de escape
secuencias de escape descripción
-e activa la interpretación de secuencias de escape
\a alerta (beep)
\b elimina el carácter anterior (backspace)
\c suprime el salto de línea (como n)
\n salto de línea
\r retorno de carro
\t tabulador horizontal
\\ barra hacia atrás (\)
39
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 \03334m Hola

40
echo códigos (ii)
acciones descripción y parámetros
m modifica el estilo de la fuente
m 0 modo por defecto (letras negras, fondo blanco)
m 1 negrita
m 5 parpadeo
m 7 intercambia el color de fondo y el de las letras
m 11 acepta caracteres ASCII extendidos (asciitable.com)
m 25 deshabilita el parpadeo
m 27 deshabilita el intercambio de colores
m 30-37 establece el color de las letras (31 rojo, etc.)
m 40-47 establece el color de fondo
41
echo codigos (iii)
acciones descripción
q gestiona los bloqueos del teclado
q 0 apaga todos los bloqueos del teclado
q 1 encience el bloqueo de scroll, apaga el resto
q 2 enciende el bloqueo de números, apaga el resto
q 3 enciende el bloqueo de mayúsculas, apaga el resto
7s Almacena la posición del cursor y sus atributos
8u Recupera la posición del cursor y sus atributos ojo 7s y 8u no funcionan en todos los terminales, es más recomentable usar tput sc y tput rc
H,f Establece la posición del cursor xy posición para el cursor
42
echo ejemplos
43
Gestion E/S read
  • Entrada de consola read var
  • En ksh también se puede hacer así
  • read fich?Introduce nombre de fichero

44
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

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

Símbolo Descripción
La expr. reg. anterior aparece 0 veces
. Cualquier carácter (1 ocurrencia)
. 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
46
Expresiones regulares (II)
  • Más expresiones regulares

Símbolo Descripción
La línea acaba con la expr. reg anterior
La línea empieza con la expr. reg. siguiente
Líneas en blanco
Líneas sin los caracteres entre corchetes
\(\) Marca expr. regulares, para luego repetirlas con \n, donde n es la n-ésima expr. marcada
\ Interpretar literalmente el símbolo especial siguiente
47
Expresiones regulares (III)
  • Extensión POSIX

Símbolo Descripción
? La expr. reg. anterior aparece 0 ó 1 vez hc?at ? at, hat, cat
La expr. reg. anterior aparece 1 veces hcat ? hat, cat, hhat, chat, __________hcat, ccchat
Aparece la expr. anterior o la posterior catdog ? cat, dog
48
Condiciones
  • if lista_condiciones1
  • then lista_comandos1
  • elif lista_condiciones2
  • then lista_comandos2
  • else lista_comandosN
  • fi

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

-eq, Igual a
-lt Menor que
-gt Mayor que
-le Menor o igual que
-ge Mayor o igual que
50
Test
Ficheros
-f fich Verdadero si fich existe y es un fichero
-r fich Verdadero si fich existe y se puede leer
-w fich Verdadero si fich existe y se puede escribir
-x fich Verdadero si fich existe y se puede ejecutar
-d fich Verdadero si fich existe y es un directorio
-s fich Verdadero si fich existe y tiene tamaño mayor que cero
51
Test
Cadenas
-n cad Verdadero si cad no es una cadena nula
-z cad Verdadero si cad sí es una cadena nula
cad1cad2 Verdadero si las cadenas son iguales
cad1!cad2 Verdadero si las cadenas son distintas
cad Verdadero si cad existe y no tiene valor nulo
52
Test
Operadores booleanos
-a AND
-o OR
  • 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

53
Case
  • Expansión de if (similar al switch de C o java)
  • case param in
  • patron1 patron2 ) lista_comandos1
  • patron2 patron3 ) lista_comandos2
  • esac

54
Case
55
Ejercicio
  • Hacer un script similar a mv, move, con la
    siguiente sintaxis
  • move filename
  • Deberá
  • Chequear si hay argumento y salirse si no,
    mostrando la sintaxis correcta
  • Chequear que el argumento es un fichero
  • Preguntar si se quiere mover el fichero a otro
    directorio o cambiarle el nombre
  • 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)

56
Ejercicios
  • Modificar move para que el paso 3 se haga
    mediante case
  • Hacer un programa showLines que muestre num
    líneas de un fichero empezando en start
  • showLines start num file
  • 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

57
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 )

58
for (ii)
59
for (iii)
  • Sintaxis como en C
  • for (( expr1 expr2 expr3 ))
  • do
  • done
  • Ejemplo
  • for ((  i 0   i lt 5  i  ))do  echo Hola
    i veces"done

60
While
  • Ejecutamos lista_comandos2 mientras la siguiente
    entrada de lista_comandos1 tenga éxito (código de
    salida 0)
  • while lista_comandos1
  • do lista_comandos2
  • done

61
Until
  • Como while, pero se ejecuta hasta que la
    condición sea verdadera, en vez de mientras la
    condición no sea falsa
  • until lista_comandos1
  • do lista_comandos2
  • done

62
Ejemplos while - until
63
Detalles
  • echo G produce un beep
  • break rompe un bucle for o while
  • a comienzo de línea para añadir un comentario
  • devuelve el identificador único de la shell

64
Ejercicios
  • 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

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

66
Funciones
  • nombreFuncion() listaComandos
  • Valor de retorno return n
  • Llamada nombreFuncion parametros
  • parametros es una lista separada por espacios
  • OJO Los parámetros posicionales (1, 2, ) se
    convierten en los parámetros de la función que se
    llama, perdiéndose los valores originales.
  • OJO Una funcion debe declararse al principio del
    fichero, o al menos antes de su primera llamada

67
Funciones (II)
No hay que declarar parámetros
Toma los parámetros como si fuera el script
principal
Los valores que se devuelven son numéricos y
siguen el mismo código de retorno
No olvidar el
68
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.sh
  • La función se invoca como si estuviera en nuestro
    script

69
expr
  • expr expresion1 operador expresion2
  • expr se puede sustituir por (( ))
  • Realiza operaciones aritméticas

operador acción
, - Suma, resta
\,/, Multiplicación, división, resto
,!,\gt,\gt, \lt,\lt Comparación de enteros
70
expr
  • Y operaciones con cadenas

expresión acción
expr c1 c2 Nº de caracteres en que coinciden c1 y c2 (pueden ser expresiones regulares)
expr length c1 Nº de caracteres de c1
expr index c1 c Posición de la primera ocurrencia del carácter c en c1
expr substr c1 start length Subcadena de c1 que empieza en la posición start y de longitud length
71
Ejercicios
  • Hacer un script fact que devuelva el factorial de
    un número que se pasa como argumento
  • Sintaxis fact num

72
ejercicios
  • Programar una función box con la siguiente
    sintaxis
  • box(x,y,alto,ancho)
  • Debe dibujar un cuadrado en pantalla como en el
    siguiente ejemplo box(20,5,7,40)

73
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

74
Depuración
  • sh v script
  • Escribe cada linea de código que ejecuta
  • totexpr 1 2
  • echo tot

sh -v suma.sh 4 5totexpr 1 2expr 1
2 echo tot9
75
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
  • totexpr 1 2
  • echo tot

sh -x suma.sh 4 5 expr 4 5 tot9 echo
99
76
Programación avanzada en bash
77
  1. Variables locales y globales
  2. Señales
  3. getopts
  4. Utilidades esenciales

78
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

vechBus echo vechBus /bin/bash echo
vech vechCar echo vechCar exit echo
vechBus
vechBus echo vechBus export vech
/bin/bash echo vechBus exit echo
vechBus
79
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

80
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 avisar de ello, 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

81
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

82
ids. de señal
nº de señal ocurre cuando
0 salida de la shell
1 hangup (colgar)
2 interrupt (ctrlC)
3 quit
9 kill (no se puede coger con trap)
15 terminate (kill que se puede coger con trap)
Existen muchas más señales (segmentation fault,
bus error, power fail, etc) , pero generalmente,
estas son las que se busca controlar
83
Señales ejercicio
  • Hacer un programa ages que
  • Acepte un único parámetro, el nombre de un
    fichero
  • Indefinidamente
  • Pregunte por un nombre y luego por una edad
  • Añada el nombre y la edad a un fichero temporal
    temp
  • Pregunte si se quieren añadir más ficheros
  • Si no se van a añadir más ficheros, vuelca temp
    al fichero que se pasó como parámetro
  • Ejecutar el programa, meter un par de nombres y
    luego pulsar CTRLC

84
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 CTRLC
    para que temp se borre en ese caso.

85
señales ejercicios (iii)
  • Modificar el programa fantasticCar para que
    gestione correctamente su terminación
  • Deberá escuchar por la señal de terminación y
    termine el programa dejando todos los leds como
    estuvieran y despidiéndose con Buenos días,
    Michael

86
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
  • Ejemplos para optstring
  • nasgrt
  • -n argn a s g r argr t
  • -n argn r argr -asgt

87
getopts (II)
  • Si una opción requiere de argumento, se almacena
    en OPTARG
  • OPTIND es el índice del siguiente parámetro
  • Ejemplo

usage civilState n name a age -s
while getopts nas optdo  case "opt"
in    n) na"OPTARG"    a)
age"OPTARG"    s) singley    esacdone
88
getopts ejercicios
  • Modificar el programa move para que los
    parámetros sean recogidos mediante getopts
  • usage move f file -d dir filename
  • 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

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

90
Ficheros
  • Vamos a trabajar sobre dos ficheros sencillos

sname (nombres)
smark (patrimonio en mill.)
Sr.No Name11 Vivek12 Renuka13 Prakash14 Ashish
15 Rani
Sr.No Mark11 6712 5513 9614 3615 67
91
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-B Campos o columnas A hasta B inclusive
  • A- Campo o columna A hasta el final de la línea
  • A,B Campos o columnas A y B

92
(No Transcript)
93
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 55
13 Prakash 13 9614 Ashish 14 3615 Rani 15 67
cut f2 smark gt temp paste sname temp rm temp
94
join
  • Pega líneas de dos ficheros, por columnas, sólo
    si tienen campo de la primera columna con el
    mismo valor
  • 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
95
tr
  • Cambiar un rango de caracteres a otro distinto
  • tr pattern1 pattern2

tr "h2" "3x" lt sname11   Vivek1x   Renuka13
  Prakas314   As3is315   Rani
tr "a-z" "A-Z" holaHOLA
96
tr (ii)
  • Opciones

opciones descripción
-s elimina espacios en las secuencias encontradas
-c añade pattern2 a pattern1 en vez de sustituirlo
-d elimina pattern1 (no se necesita pattern2)
97
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

98
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

99
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

100
awk y sed
101
  • awk
  • patrones
  • acciones
  • variables
  • scripting
  • nawk
  • sed
  • substituciones
  • delimitadores
  • marcadores
  • ocurrencias
  • scripting
  • restricciones

102
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.htmluh-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

103
sed - substitución
  • sed s/word1/word2/ fileingtfileout
  • Substituye word1 por word2 en filein y lo escribe
    en fileout
  • Si no se especifica fileout, lo escribe en
    consola
  • Ejemplo sed s/gold/stone/ coins.txtgt
  • La substitución es la operación más común para la
    que se usa sed
  • word1 y word2 pueden ser expresiones regulares

104
sed - delimitadores
  • El delimitador (/) puede cambiarse por cualquier
    otro carácter que no aparezca en las palabras
  • Ejemplo sustituir rutas de fichero
  • sed 's/usr/local/bin/common/bin' old gtnew
  • sed 's/usr/local/bin/common/bin' old gtnew
  • sed 's_/usr/local/bin_/common/bin_' old gtnew

105
  • 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 gtnew
  • 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/ / ? ?

106
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-90-9/ /g

107
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?

108
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-za-z
    //2'
  • Comparar con
  • echo "casa perro gato " sed 's/a-za-z //'
  • echo "casa perro gato " sed 's/a-za-z
    //g'
  • /n se puede combinar con g
  • echo "casa perro gato " sed 's/a-za-z
    //2g'

109
escribir a fichero
  • sed s/word1/word2/w file filein
  • No tiene mucho sentido si solo tenemos una
    expresión (es equivalente a gtfile)
  • 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.

110
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 fileingtfileout

111
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 gtfileout

112
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'

113
restricciones
  • Restringir a una línea
  • sed n s/searh/replace/options fileingtfileout
  • Restringir a un rango de líneas
  • sed n,m s/searh/replace/options fileingtfileout
  • 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 fingtfout

114
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

115
otras acciones
acciones significado
q quit (terminar la ejecución)
p print (imprime por pantalla la salida de sed)
w write (escribe a fichero la salida de sed)
116
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

117
ejercicios (ii)
  • 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

118
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

119
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

120
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
121
sintaxis
  • Aplicar a un fichero un patrón awk
  • awk -Fltdelgt/search_pattern/ awk_actions
    filename
  • Aplica awk_actions a todas las líneas de filename
    que cumplan con search_pattern
  • -Fltdelgt 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

122
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
    todas las líneas del fichero
  • Las secuencias de búsqueda pueden llevar
    metacaracteres

123
metacaracteres
meta caracter significado
. Cualquier carácter (uno)
El carácter anterior aparece 0 veces
Coincide con el comienzo de línea
Coincide con el final de línea
\ El carácter siguiente no es metacaracter
Coincide con alguna de los caracteres entre
Coincide con la expresión exacta entre
El carácter anterior aparece 1 veces
? El carácter anterior aparece 0 ó 1 vez
Coincide con el patrón a su izquierda o derecha
124
ejemplos de búsqueda
patrón resultado
/The/ The
/The/ The Bourne Ultimatum, The, Thelema"
/The/ Bourne Ultimatum, The, The, Pathe
/\/
/Tthe/ The the
/a-z/ plane house bourne
/a-zA-Z0-9/ bourne Bourne oceanic815
a-z Bourne 815oceanic
/Germany/ Germany Germanys politics
125
ejemplos de búsqueda (ii)
patrón resultado
/wh./ who why wh3
/wh/ w wh whh whhh
/./ Cualquier cadena de caracteres
/wh?/ w wh
/wh/ wh whh whhh
/-?0-9/ Cualquier entero (con o sin signo)
/-?0-9/ // La línea coincide exactamente
/-?0-9/ -? Posible signo inicial
/-?0-9/ 0-9 Cualquier cadena de números
126
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 (,!,gt,lt,gt,lt)
  • Operaciones aritméticas avanzadas (sqrt, log,
    exp, int)
  • Salida por pantalla (print y printf)
  • Procesamiento de cadenas (substr, split, index,
    length)
  • Estructuras de control (ifelse, for, while)
  • For se puede usar como en bash for(var in lista)
    o como en C

127
acciones
acción descripción
substr(str,start, length) substr("unforgettable",6,3) ? get
split(str, array ,sep) split(jaybob,c,) ? c1jay, c2bob
index(str, str) index(gorbachov, bach) ? 4 index(gorbachov, z) ? 0
next salta a la siguiente línea de texto
length(str) devuelve la longitud de la cadena
break, continue, exit Como en shell y C
128
print y printf
acción descripción
print imprime la linea actual
print cad1,cad2 imprime cad1 cad2
print cad1 cad2 imprime cad1cad2
printf() imprime siguiendo la sintaxis de C d, f, o, x n.m \n, \t
129
variables
  • No tienen tipo ni hay que declararlas
  • Se asignan como en los programas de la shell
  • Variables especiales

variable descripción
1, 2, 3 Variable de campo, da el valor de la columna 1, 2, 3
0 Contiene el valor de toda la línea
NR Número de líneas de entrada
NF Número de columnas
NF Valor de la última columna
130
variables especiales (ii)
variable descripción
FILENAME Nombre del fichero de entrada
FS 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/)
RS Separador de filas. Por defecto es newline, refiriéndose a \n
OFS, ORS Como los anteriores pero para el fichero de salida
OFMT Formato numérico. Por defecto .6g
131
arrays
  • Sólo tienen una dimensión
  • El acceso se identifica por indices
  • array1, array2, array3
  • Los índices van de 1 a N
  • Podemos usar como índices cadenas
  • arrayRoberto, arrayAntonio, arrayLuis
  • 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

132
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 gt goldYear.txt

133
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(NFgt0) print coins.txt
  • Contar el número de líneas en el fichero
  • awk END print NR coins.txt
  • wc coins.txt

134
Ejemplos
  • Imprimir el tamaño medio de los ficheros de
    nuestro directorio actual
  • ls -l awk 'count5 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
  • a1 b1
  • count0
  • while(countlt10)
  • print a taa ab bbta
  • '

135
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 NFgt0 split(0, c) for(i in c) print i
    1
  • awk BEGIN FSA-Za-z
  • for(i1iltNFi) print i 1

136
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

137
Ejemplo programa awk findDup
  • Buscar palabras seguidas duplicadas en un fichero
  • BEGIN dups0 w"xy-zzy"
  • for( n1 nltNF n)
  • if ( w n )
  • print w, "", 0
  • dups 1
  • w n
  • END if (dups 0)
  • print "No duplicates found."

138
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

139
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?

140
ejercicios bases de datos
  • Trabajando sobre el fichero cars.txt
  • Buscar todos los coches de la marca volvo
  • Mostrar la columna 3, seguida de la 1
  • Mostrar todas las entradas que contengan una h
    en la primera columna
  • Mostrar todas las entradas cuya primera columna
    empiece con una h
  • 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?

141
ejercicios (ii)
  • Mostrar las entradas cuya columna 5 tiene un
    valor numérico menor o igual a 100
  • Mostrar todas las entradas desde la primera que
    contenga toyota hasta la primera que contenga
    chevrolet
  • Mostrar todos los usuarios del sistema que no
    tengan como shell por defecto /bin/sh

142
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

143
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
  • file1
  • num2
  • 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

144
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

145
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

146
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

147
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

148
shell y awk en la historia de la programación
  • http//www.oreilly.com/news/graphics/prog_lang_pos
    ter.pdf

149
referencias
  • Tutoriales utilizados
  • shell scripting
  • http//www.cyberciti.biz/nixcraft/linux/docs/uniql
    inuxfeatures/lsst/
  • http//tldp.org/LDP/abs/html/index.html
  • sed
  • http//www.grymoire.com/Unix/Sed.htmluh-1
  • awk
  • http//cs.sru.edu/whit/cpsc207/notes/awkegs.html
  • http//www.vectorsite.net/tsawk_1.htmlm1

150
referencias (ii)
  • Libros
  • Shells Users 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.
Write a Comment
User Comments (0)
About PowerShow.com