Vous êtes sur la page 1sur 150

Programacin en Shell

Rodrigo Santamara Vicente Dpto. Informtica y Automtica

Contenidos

1. 2.

3.
4. 5.

Introduccin a la shell Programacin bsica en bash Programacin avanzada sed y awk Referencias

Introduccin a la Shell

1.Qu
2.Tipos

es una shell?
de shell

3.Usos

de la shell
de entorno

4.Variables

Qu es una shell?
Interfaz entre el Sistema Operativo y el usuario Dos tipos
Grfica Lnea de Comandos
CLI (Command Line Interface) intrprete 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.

Shell Grfica

Shell de Lnea de Comandos

Generalmente con shell nos referimos a una CLI de Unix

Grfica vs Texto
Grfica Sencilla Fcil uso
Usuario base

Lnea de Comandos Ciertas operaciones son ms rpidas


Usuario experto

Procesamiento de imagen, video, etc.

Transferencia o procesamiento de datos

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

Bourne Shell (sh)


La ms antigua No tiene caractersticas interactivas
Historia de comandos Autocompletar nombres de ficheros

No tiene estructuras complejas de programacin


Funciones Case

C Shell (csh)
Sintaxis como el lenguaje C
No compatible con la familia Bourne

Capacidades interactivas
Pausar/reiniciar procesos Historia de comandos Operaciones matemticas

Korn Shell (ksh)


Sustituye y es compatible con Bourne

Caractersticas interactivas como C, pero mejoradas


Aade edicin de lneas de la historia Ejecucin ms rpida

Distribuciones

bash

csh

ksh

linux

freebsd

solaris

mac os X

AIX, HP-UX, BSD

POSIX shell
Similar a ksh y utilizada por HP-UX 95% compatible con Bourne shell Como ksh, integra caractersticas de la csh, mejoradas (histrico de comandos, autocomplecin, operaciones aritmticas) Las diferencias con bourne shell son menores Las diferencias entre POSIX y ksh son mnimas:
http://docs.hp.com/en/B2355-90046/ch15s03.html

Multiplicidad de las shells


Ante el mismo sistema operativo, podemos tener varias shells activas al mismo tiempo
Grficas y de texto (Linux) De texto en distintos terminales

$$ indica el PID de la shell en ejecucin ps para ver los PID de todos los procesos en ejecucin $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

Usos de la sh
Intrprete de comandos: ejecutar comandos desde el intrprete Scripts: ejecutar secuencias de comandos desde un fichero Programas: control del flujo de ejecucin de secuencias de comandos (bucles, condiciones, variables, etc.) desde un fichero

Intrprete de comandos
Sintaxis tpica
comando [-]opciones parmetros

Opciones: dependen de cada comando y alteran su funcionamiento Parmetros: variables de entrada que necesita el comando, separadas por espacios
ps fu ls file.txt grep *.txt ../folder

Procesamiento secuencial
El sistema completa cada comando antes de ejecutar el siguiente:
date ps fu who

Procesamiento secuencial
date; ps fu; who

Procesamiento no Secuencial
Cada programa se ejecuta sin esperar a que el anterior termine date & ps -fu & who
date

ps who

ps

date who

Redireccin de E/S
> Escribe la salida estndar a fichero < Lee la entrada estndar de fichero >> Aade la salida estndar a un fichero existente > y >> crean el fichero si no existe < da error si el fichero no existe

Tuberas (pipes)
Conectan la salida de un programa a la entrada del siguiente
ls | more ls > temp; more < temp

Shell script

Simplemente, poner en un fichero rdenes que se puedan ejecutar en el intrprete de comandos Para editar el fichero, se puede usar cualquier editor (tpicamente vi) Ejemplo: editar un fichero con la lnea:
date; who; ps uf; du /home sh nombreScript

Ejecutar con:

Trucos

Si se usa vi, lo ideal es tener dos consolas abiertas, una para edicin y otra para ejecucin Para poder ejecutar un fichero como script, debemos tener permisos de ejecucin
chmod +x nombreFichero

Otros modos de ejecucin:


./nombreScript nombreScript si se encuentra en el PATH

Fichero .profile
Script(s) que se ejecuta automticamente al hacer login Se encuentran en el directorio raz del usuario Establece el entorno de trabajo
sh
.profile

bash
.bash_profile .bash_login .profile .bashrc

ksh
.profile .kshrc

csh
.profile .cshrc

Variables de entorno
PATH
HOME LOGNAME PWD OSTYPE PS1 SHELL

Directorios para la bsqueda de parmetros, separados por (:) Directorio raz de nuestra cuenta
Nombre de cuenta con el que hemos accedido al sistema Directorio de trabajo actual Tipo de Sistema Operativo Configuracin del prompt de consola Shell que estamos usando

Variables de entorno
Para acceder al valor $VAR Para imprimir 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

Programacin bsica en Bourne Shell

1.
2. 3. 4. 5. 6. 7. 8. 9.

Introduccin
Variables Parmetros E/S Condiciones Bucles Funciones Operaciones aritmticas Depuracin

Programacin Shell
Scripts donde introducimos conceptos propios de la programacin
Variables Parmetros Condiciones Bucles Funciones Operaciones aritmticas

Los comandos disponibles de la shell actan como nuestra biblioteca de funciones

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
1. Porque nos lo mandan (como es el caso) 2. Porque sabemos programar: el esfuerzo necesario para aprender es muchsimo menor 3. Porque en nuestro trabajo nos va a ser til:
Administradores: tareas complejas o automatizables Hackers: tareas rpidas Programadores usuarios: tareas que se repiten

Cundo programar en shell?

Llamadas frecuentes a funciones del sistema Llamadas repetitivas a una funcin del sistema Programas cortos
Si un programa pasa de una pgina, probablemente la shell no sea la mejor solucin

Cuanto mejor conozcamos la shell y sus comandos, ms la usaremos y mayor til ser la programacin en shell

Variables
Adems de las variables de entorno podemos declarar variables locales al script No tienen tipo, no hay que declararlas o inicializarlas previamente
Asignacin: Acceder al valor: variable=valor $variable

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

Parmetros
Un script puede tener parmetros 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 parmetros separados por espacios

Parmetros (II)
Nmero de parmetros: $# Si tenemos ms de 9 parmetros, tenemos que usar desplazamientos: shift [n]
Donde n es el nmero de pasos que desplazamos Si no se especifica n, se comporta como shift 1

Gestin E/S: echo


Salida por consola:
Caracteres especiales -n \

echo cadena
descripcin

Evita el salto de lnea (til si se espera un parmetro de entrada) Elimina el significado especial del siguiente carcter


` `

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

echo: secuencias de escape


secuencias de escape -e \a \b \c \n \r \t \\ descripcin

activa la interpretacin de secuencias de escape alerta (beep) elimina el carcter anterior (backspace) suprime el salto de lnea (como n)
salto de lnea retorno de carro tabulador horizontal barra hacia atrs (\)

echo: cdigos de escape

Se introducen con la secuencia de escape \033 Cada cdigo tiene la sintaxis: [parametroAccin
parmetro es un nmero accin es una letra

Ejemplo:
echo e \033[34m Hola

echo: cdigos (ii)


acciones m descripcin y parmetros modifica el estilo de la fuente 0 modo por defecto (letras negras, fondo blanco) 1 negrita 5 parpadeo 7 intercambia el color de fondo y el de las letras 11 acepta caracteres ASCII extendidos (asciitable.com) 25 deshabilita el parpadeo 27 deshabilita el intercambio de colores

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

echo: codigos (iii)


acciones descripcin q gestiona los bloqueos del teclado 0 apaga todos los bloqueos del teclado 1 encience el bloqueo de scroll, apaga el resto

2 enciende el bloqueo de nmeros, apaga el resto


3 enciende el bloqueo de maysculas, apaga el resto 7s Almacena la posicin del cursor y sus atributos

8u
H,f

Recupera la posicin del cursor y sus atributos


ojo: 7s y 8u no funcionan en todos los terminales, es ms recomentable usar tput sc y tput rc

Establece la posicin del cursor x;y posicin para el cursor

echo: ejemplos

Gestion E/S: read

Entrada de consola:

read var

En ksh tambin se puede hacer as:


read fich?Introduce nombre de fichero:

Gestin E/S: exit


Salida del script:
0 1 2

exit cdigo_fin

terminado con xito error interno error por sintaxis de llamada

$? Devuelve el cdigo de salida del ltimo comando ejecutado

Expresiones regulares
Manejar con soltura las expresiones regulares es fundamental para programar en shell y manejar comandos como grep, sed o awk.
Smbolo
* . .* [ ]

Descripcin
La expr. reg. anterior aparece 0+ veces Cualquier carcter (1 ocurrencia) Cualquier cadena de caracteres Cualquier carcter de los especificados entre corchetes, o un rango si separados por - [a-z] [0-9] [a-z,A-Z] [Tt]

Expresiones regulares (II)


Ms expresiones regulares
Smbolo
$ ^ ^$ [^]

Descripcin
La lnea acaba con la expr. reg anterior La lnea empieza con la expr. reg. siguiente Lneas en blanco Lneas sin los caracteres entre corchetes

\(\)
\

Marca expr. regulares, para luego repetirlas con \n, donde n es la n-sima expr. marcada Interpretar literalmente el smbolo especial siguiente

Expresiones regulares (III)


Extensin POSIX
Smbolo
? +

Descripcin
La expr. reg. anterior aparece 0 1 vez [hc]?at at, hat, cat La expr. reg. anterior aparece 1+ veces [hc]+at hat, cat, hhat, chat, __________hcat, ccchat Aparece la expr. anterior o la posterior cat|dog cat, dog

Condiciones
if lista_condiciones1 then lista_comandos1 elif lista_condiciones2 then lista_comandos2 else lista_comandosN fi

Test

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


-eq, = -lt -gt -le -ge Igual a Menor que Mayor que Menor o igual que Mayor o igual que

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 tamao mayor

que cero

Test

Cadenas

-n cad -z cad

Verdadero si cad no es una cadena nula Verdadero si cad s es una cadena nula

cad1==cad2 Verdadero si las cadenas son iguales cad1!=cad2 Verdadero si las cadenas son distintas

cad

Verdadero si cad existe y no tiene valor nulo

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 ms prximo

Case
Expansin de if (similar al switch de C o java)
case param in patron1 [ | patron2] ) lista_comandos1 ;; patron2 [ | patron3] ) lista_comandos2 ;; esac

Case

Ejercicio

1.
2. 3. 4.

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 operacin (mv)

Ejercicios
1. Modificar move para que el paso 3 se haga mediante case 2. Hacer un programa showLines que muestre num lneas 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, segn la hora que sea. El programa debe ejecutarse automticamente al abrir un terminal

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 parmetros de entrada al script ($1 $2 )

for (ii)

for (iii)
Sintaxis como en C:
for (( expr1; expr2; expr3 )) do done

Ejemplo:
for (( i = 0 ; i <= 5; do echo Hola $i veces" done i++ ))

While

Ejecutamos lista_comandos2 mientras la siguiente entrada de lista_comandos1 tenga xito (cdigo de salida 0):
while lista_comandos1 do lista_comandos2 done

Until

Como while, pero se ejecuta hasta que la condicin sea verdadera, en vez de mientras la condicin no sea falsa
until lista_comandos1 do lista_comandos2 done

Ejemplos while - until

Detalles
echo ^G produce un beep break rompe un bucle for o while

# a comienzo de lnea para aadir un comentario


$$ devuelve el identificador nico de la 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

Ejercicios

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

Funciones
nombreFuncion() {listaComandos;}
Valor de retorno: return n Llamada: nombreFuncion parametros
parametros es una lista separada por espacios
OJO: Los parmetros posicionales ($1, $2, ) se convierten en los parmetros de la funcin que se llama, perdindose los valores originales. OJO: Una funcion debe declararse al principio del fichero, o al menos antes de su primera llamada

Funciones (II)
No hay que declarar parmetros Toma los parmetros como si fuera el script principal Los valores que se devuelven son numricos y siguen el mismo cdigo de retorno

No olvidar el ;

Alcance y Biblioteca de funciones


Cualquier variable declarada en un punto o funcin del programa es acessible en cualquier otro punto o funcin
No hay definicin de alcance ms que para los parmetros posicionales $1, $2,

Las funciones de un script puede utilizarse en otros scripts utilizando el comando . ./script.sh La funcin se invoca como si estuviera en nuestro script

expr
expr expresion1 operador expresion2 expr se puede sustituir por (( ))

Realiza operaciones aritmticas

operador accin +, Suma, resta \*,/,% Multiplicacin, divisin, resto =,!=,\>,\>=, Comparacin de enteros \<,\<=

expr
Y operaciones con cadenas
expresin
expr c1 : c2
expr length c1 expr index c1 c expr substr c1 start length

accin

N de caracteres en que coinciden c1 y c2 (pueden ser expresiones regulares) N de caracteres de c1 Posicin de la primera ocurrencia del carcter c en c1 Subcadena de c1 que empieza en la posicin start y de longitud length

Ejercicios
Hacer un script fact que devuelva el factorial de un nmero que se pasa como argumento
Sintaxis: fact num

ejercicios
Programar una funcin 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)

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

Depuracin
sh v script Escribe cada linea de cdigo que ejecuta:

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

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

Depuracin de scripts
sh x script Sustituye cada $var por su valor

Muestra cada lnea de cdigo que se va ejecutando


Precedida de +, o de ++ si es un subcomando de la lnea
tot=`expr $1 + $2` echo $tot

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

Programacin avanzada en bash

1. Variables locales y globales


2.
3. 4.

Seales
getopts

Utilidades esenciales

Variables globales y locales


Las variables declaradas en un programa son locales, y por tanto no estarn disponibles en otras shells Para hacer global: export var
$ vech=Bus $ echo $vech Bus $ /bin/bash $ echo $vech $ vech=Car $ echo $vech Car $ exit $ echo $vech Bus $ vech=Bus $ echo $vech Bus $ export vech $ /bin/bash $ echo $vech Bus $ exit $ echo $vech Bus

Ejecucin condicional
comando1 && comando2
Ejecuta comando2 slo si comando1 se ejecut con xito

comando1 || comando2
Ejecuta comando2 slo 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 &

Seales
Un programa puede terminar de manera forzosa debido a un error en el SO o a la interrupcin por parte del usuario Para avisar de ello, se utilizan seales Si, por ejemplo, un programa modifica ficheros delicados o crea ficheros temporales, etc. debe manejar la gestin de seales para evitar dejar ficheros incompletos o innecesarios

Trap
trap {comandos} {lista de ids. de seal}

Ejecuta la lista de comandos cuando se produce alguna de las seales especificadas Una vez incluida, se mantiene a la escucha para el resto del programa Es bueno tratar estas seales en una funcin, que ser la que se incluya en trap como comando

ids. de seal
n de seal
0 1 2 3 9 15

ocurre cuando
salida de la shell hangup (colgar) interrupt (ctrl+C) quit kill (no se puede coger con trap) terminate (kill que se puede coger con trap)

Existen muchas ms seales (segmentation fault, bus error, power fail, etc) , pero generalmente, estas son las que se busca controlar

Seales: ejercicio
Hacer un programa ages que
1. Acepte un nico parmetro, el nombre de un fichero 2. Indefinidamente:
1. 2. 3. 4. Pregunte por un nombre y luego por una edad Aada el nombre y la edad a un fichero temporal temp Pregunte si se quieren aadir ms ficheros Si no se van a aadir ms ficheros, vuelca temp al fichero que se pas como parmetro

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

Seales: ejercicio (II)


Qu ocurre? temp no se ha borrado y no se ha generado el fichero final Hacer tratamiento de la seal generada por CTRL+C para que temp se borre en ese caso.

seales: ejercicios (iii)


Modificar el programa fantasticCar para que gestione correctamente su terminacin
Deber escuchar por la seal de terminacin y termine el programa dejando todos los leds como estuvieran y despidindose con Buenos das, Michael

getopts
getopts optstring var1 Recoge las opciones que se le hayan pasado al script y que coincidan con la sintaxis en optstring, almacenndolos en var1 Si un parmetro en optstring va seguido de : quiere decir que requiere de un argumento Ejemplos para optstring:
n:asgr:t -n argn a s g r argr t -n argn r argr -asgt

getopts (II)
Si una opcin requiere de argumento, se almacena en $OPTARG $OPTIND es el ndice del siguiente parmetro Ejemplo: usage: civilState n name a age -s while getopts n:a:s opt
do case "$opt" in n) na="$OPTARG";; a) age="$OPTARG";; s) single=y ;; esac done

getopts: ejercicios
1. Modificar el programa move para que los parmetros 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 parmetro (p. ej, vi), comprobando si existe antes

Utilidades esenciales
Linux provee una serie de utilidades esenciales para agilizar el trabajo:
Ficheros de datos Informacin del sistema Administracin del sistema

Ficheros
Vamos a trabajar sobre dos ficheros sencillos
sname (nombres) Sr.No Name 11 Vivek 12 Renuka 13 Prakash 14 Ashish 15 Rani smark (patrimonio en mill.) Sr.No Mark 11 67 12 55 13 96 14 36 15 67

cut
Extraccin de columnas o campos: cut
cut [opciones] [fichero ...] Opciones
-c lista Trata cada carcter como una columna -f lista Campos delimitados por tabuladores -d SEP Utiliza el carcter SEP como separador en vez del tabulador

lista es una secuencia de nmeros 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 lnea A,B Campos o columnas A y B

paste
Pegar lneas de ficheros por columnas paste file1 file2 Como separador, aade un tabulador $ paste sname smark 11 Vivek 11 67 12 Renuka 12 55 13 Prakash 13 96 14 Ashish 14 36 15 Rani 15 67 Ejercicio: Generar un fichero con cdigos, patrimonio y nombres, pero sin repetir el cdigo de persona
cut f2 smark > temp; paste sname temp; rm temp

join
Pega lneas de dos ficheros, por columnas, slo si tienen campo de la primera columna con el mismo valor
join file1 file2

$join sname smark 11 Vivek 67 12 Renuka 55 13 Prakash 96 14 Ashish 36 15 Rani 67 Si uno de los campos no existe en alguno de los ficheros, no lo aade

tr
Cambiar un rango de caracteres a otro distinto
tr pattern1 pattern2 $ tr "h2" "3x" < sname 11 Vivek 1x Renuka 13 Prakas3 14 As3is3 15 Rani $ tr "[a-z]" "[A-Z]" hola HOLA

tr (ii)
Opciones
opciones
-s -c -d

descripcin
elimina espacios en las secuencias encontradas aade pattern2 a pattern1 en vez de sustituirlo elimina pattern1 (no se necesita pattern2)

uniq
Elimina lneas duplicadas adyacentes
uniq file
-c indica el nmero de veces que aparece duplicada

Su salida es el mismo fichero sin lneas duplicadas adyacentes Si queremos eliminar todas las lneas duplicadas
sort file | uniq

Ejercicios con ficheros


Hacer un script listWords que recoja todas las palabras de file1 y las ordene en una lista de palabras (sin repetir), segn 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 opcin v, en cuyo caso la ordenacin se llevar a cabo segn palabras que rimen
truco: usar rev

ejercicios
Un digrama es un conjunto de dos palabras. Realizar un script que liste, en orden, el nmero de ocurrencias de cada digrama en un fichero que se pase como parmetro
listDigrams file1 file2

awk y sed

a) sed
1.
2. 3. 4. 5. 6.

b) awk
1. 2. 3. 4.

substituciones
delimitadores marcadores ocurrencias scripting restricciones

patrones
acciones

variables
scripting

5.

nawk

sed
stream editor: edicin 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 slo se usa una expresin, se puede quitar el e: sed expr1 filename Si no se pone filename, se usa la entrada estndar

sed - substitucin
sed s/word1/word2/ filein>fileout 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.txt> La substitucin es la operacin ms comn para la que se usa sed word1 y word2 pueden ser expresiones regulares

sed - delimitadores
El delimitador (/) puede cambiarse por cualquier otro carcter que no aparezca en las palabras 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

&
& indica la cadena correspondiente al patrn buscado til cuando no sabemos exactamente qu estamos buscando (expresiones regulares):
Poner parntesis a cualquier palabra en minscula sed 's/[a-z]*/(&)/' old >new Duplicar el primer nmero de cada lnea
echo "123 abc" | sed 's/[0-9]*/& &/' echo "abc 123" | sed 's/[0-9]*/& &/ ? echo "abc 123 456" | sed 's/[0-9]*/& &/ ?

substitucin global
sed slo modifica la primera ocurrencia de la expresin buscada en cada lnea para modificar todas las ocurrencias
s/pattern1/pattern2/g
echo "abc 123 456" | sed 's/[0-9][0-9]*/& &/g

flags (marcadores)
Podemos marcar los patrones con \(\) Un patrn marcado se puede repetir con \1, \2 segn el orden en que se hayan marcado (hasta \9) Quedarnos con la primera palabra de cada lnea:
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?

ocurrencias
/n especifica a qu ocurrencia del patrn nos referimos Eliminar la segunda palabra de cada lnea 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'

escribir a fichero
sed s/word1/word2/w file filein
No tiene mucho sentido si solo tenemos una expresin (es equivalente a >file)

Es muy til si tenemos varias expresiones y queremos que la accin de cada una vaya a un fichero diferente En caso de que se usen varias opciones tras el ltimo /, w debe ser la ltima.

sed scripting
Cuando tenemos muchas expresiones sed, es cmodo hacer un sedscript:
#Este script cambia vocales minsculas a maysculas 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

sed en shell script


Dentro de un shell script, podemos usar igualmente sed. Podemos utilizar varias lneas 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

paso de argumentos a sed en shell script


Deberemos jugar con las comillas para que no tome el argumento como una expresin regular: sed -n 's/'$1'/&/g'

Para evitar problemas de sintaxis en el caso de que el parmetro contenga espacios:


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

restricciones
Restringir a una lnea
sed n s/searh/replace/options filein>fileout

Restringir a un rango de lneas


sed n,m s/searh/replace/options filein>fileout

La ltima lnea del fichero se identifica con $ Restriccin con patrones: la bsqueda va de la primera lnea en la que se encuentre p1 hasta la primera en que se encuentre p2
sed /p1/,/p2/ s/searh/replace/options fin>fout

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 ms complejas que bsquedas y sustituciones simples, awk es ms potente y ms fcil de utilizar

otras acciones

acciones significado q quit (terminar la ejecucin) p print (imprime por pantalla la salida de sed) w write (escribe a fichero la salida de sed)

Ejercicios
1. Sustituir todas las vocales minsculas de un fichero por vocales maysculas 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

ejercicios (ii)
5. Queremos cambiar todos los ficheros con extensin *.txt a *.tex. Hacer mv *.txt *.tex no funciona Por qu? Hacer un script basename que realice esta funcin

awk
Se puede ver como
Utilidad para realizar procesamiento sencillo de texto Lenguaje de programacin para procesamiento complejo de texto

Basado en C Utilizado para


Generacin de informes Manejo de Bases de Datos pequeas Traducir formatos de fichero Realizar operaciones matemticas en ficheros numricos

awk (ii)
AWK Aho, Weinberg & Kernigan
Kernigan es autor, junto con Ritchie, de C

AWK es un lenguaje interpretado


Relativamente lento Fcil de apreder

AWK cuando no haya una solucin ms sencilla:


grep para buscar texto head/tail para quedarnos con partes de texto cat, paste, join para unir ficheros sed para hacer bsquedas/reemplazos tr, unique, sort para transformaciones bsicas

Fichero de ejemplo: coins.txt


metal weight_in_ounces gold gold 1 1 1986 USA date_minted American Eagle Franz Josef 100 Korona country_of_origin description

1908 Austria-Hungary 1981 USA

silver 10

ingot

gold
gold gold

1
1

1984 Switzerland
1979 RSA

ingot
Krugerrand Krugerrand

0.5 1981 RSA

gold

0.1 1986 PRC


1986 USA

Panda
Liberty dollar Liberty 5-dollar piece

silver 1 gold

0.25 1986 USA

sintaxis
Aplicar a un fichero un patrn awk
awk [-F<del>]/search_pattern/ {awk_actions} filename

Aplica awk_actions a todas las lneas de filename que cumplan con search_pattern -F<del> especifica el carcter 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 Bsicamente ambas opciones son lo mismo, la segunda se usa cuando el patrn awk se hace muy largo o lo tenemos en un fichero

patrones de bsqueda
awk busca en el fichero de entrada todas las lneas que contengan el patrn de bsqueda Patrones de bsqueda
/seq/ BEGIN END busca lneas que contengan seq busca la primera lnea busca la ltima lnea
var ~ /seq/ busca variables (ver +abajo) que contengan seq

Si no se especifica patrn de entrada, devuelve todas las lneas del fichero Las secuencias de bsqueda pueden llevar metacaracteres

metacaracteres
meta caracter . * ^ $ \ [ ] { } + ? | significado

Cualquier carcter (uno) El carcter anterior aparece 0+ veces Coincide con el comienzo de lnea Coincide con el final de lnea El carcter siguiente no es metacaracter Coincide con alguna de los caracteres entre [] Coincide con la expresin exacta entre {} El carcter anterior aparece 1+ veces El carcter anterior aparece 0 1 vez Coincide con el patrn a su izquierda o derecha

ejemplos de bsqueda
patrn
/The/

resultado

The /^The/ The Bourne Ultimatum, The, Thelema" /The$/ Bourne Ultimatum, The, The, Pathe /\$/ $ /[Tt]he/ The the /[a-z]/ plane house bourne /[a-zA-Z0-9]/ bourne Bourne oceanic815 ^[^a-z] Bourne 815oceanic /{^Germany}/ Germany Germanys politics

ejemplos de bsqueda (ii)


patrn /wh./ /wh*/ /.*/ /wh?/ /wh+/
/^[+-]?[0-9]+$/

resultado who why wh3 w wh whh whhh Cualquier cadena de caracteres w wh wh whh whhh Cualquier entero (con o sin signo) /^$/ La lnea coincide exactamente [-+]? Posible signo inicial [0-9]+ Cualquier cadena de nmeros

acciones
awk /search_pattern/ {awk_actions} filename

Podemos tener cualquier tipo de accin que ofrezca awk como lenguaje de programacin (~C)
Asignacin de variables y arrays (=) Operaciones aritmticas simples (+,-,*,/,%, ++, --, ^) Comparaciones aritmticas (==,!=,>,<,>=,<=) Operaciones aritmticas 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

acciones
accin
substr(str,start, length) split(str, array [,sep])

descripcin substr("unforgettable",6,3) get

index(str, str)

next length(str) break, continue, exit

split(jay:bob,c,:) c[1]=jay, c[2]=bob index(gorbachov, bach) 4 index(gorbachov, z) 0 salta a la siguiente lnea de texto
devuelve la longitud de la cadena Como en shell y C

print y printf
accin print descripcin imprime la linea actual

print imprime cad1 cad2 cad1,cad2 print cad1 imprime cad1cad2 cad2 printf() imprime siguiendo la sintaxis de C: %d, %f, %o, %x %n.m \n, \t

variables
No tienen tipo ni hay que declararlas Se asignan como en los programas de la shell Variables especiales:
variable descripcin $1, $2, $3 Variable de campo, da el valor de la columna 1, 2, 3 $0 Contiene el valor de toda la lnea NR Nmero de lneas de entrada NF Nmero de columnas $NF Valor de la ltima columna

variables especiales (ii)

variable FILENAME FS

descripcin Nombre del fichero de entrada Separador de columnas. Por defecto es white space, refirindose a [ ] y \t
Tambin se puede modificar con la opcin de comando F seguido del delimitador (-F:, -F/)

RS OFS, ORS OFMT

Separador de filas. Por defecto es newline, refirindose a \n Como los anteriores pero para el fichero de salida Formato numrico. Por defecto %.6g

arrays
Slo tienen una dimensin 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

Ejemplos

Imprimir todas las lneas con la palabra gold


awk /gold/ coins.txt

Imprimir todas las lneas 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 lneas de coins.txt que contengan la palabra gold a un fichero goldYear.txt
awk /gold/ {print $3} coins.txt > goldYear.txt

Ejemplos
Hacer doble espaciado en coins.txt (poner una lnea en blanco tras cada lnea)
awk {print ; print } coins.txt

Hacer doble espaciado SIN duplicar lneas en blanco


awk {print ; if(NF>0) print } coins.txt

Contar el nmero de lneas en el fichero


awk END {print NR} coins.txt wc coins.txt

Ejemplos
Imprimir el tamao medio de los ficheros de nuestro directorio actual ls -l | awk '{count+=$5} END {print count/(NR-1)} Generar los 10 primeros nmeros 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;} }'

Scripts con awk


Hacer un script que se llame words, que escriba cada palabra en el fichero pasado como parmetro en una nueva lnea
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

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

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." }

Ejercicios
1. Modificar findDup para que muestre el nmero de lnea en el que se produce el duplicado 2. Modificar findDup para que no cuente la ltima palabra de la lnea anterior

Condiciones
En vez de patrones de bsqueda, podemos usar condiciones. Ejemplo: buscar lneas con el n diez en su segundo campo, e imprimir la lnea siguiente BEGIN {flag = 0} $2 == 10 {flag = 1; next} flag == 1 {print; flag = 0; next} Cmo modificar para que acepte cualquier nmero en vez del 10 como parmetro?

ejercicios: bases de datos


Trabajando sobre el fichero cars.txt
1. Buscar todos los coches de la marca volvo 2. Mostrar la columna 3, seguida de la 1 3. Mostrar todas las entradas que contengan una h en la primera columna 4. 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; slo para aquellas entradas cuya seguna columna empieza por m o t. Se observa algo raro?

ejercicios (ii)
6. Mostrar las entradas cuya columna 5 tiene un valor numrico 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

script con awk

En shell script, los parmetros de la funcin estn en $1, $2, $3 En awk, $1, $3, $3 expresan campos!

Si queremos usar parmetros del script en llamadas a awk, antes tenemos que almacenarlos en otras variables

Ejemplo awk script


Ejemplo: hacer un script que, mediante awk, devuelva un campo de un fichero. Campo y fichero deben ser parmetros 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 podramos pasarle los parmetros de la script

Ejercicios awk scripts


Un palndromo es una palabra que es igual si se escribe de izquierda a derecha que al revs. Buscar todos los palndromos que se encuentran en un texto. El script tendr la sintaxis:
palindrome filein fileout

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 nmero de letras file es el fichero de entrada

nawk
awk est diseado para hacer programas cortos pero mucha gente lo adopt como lenguaje de programacin al uso y desarrollaba con l nawk (new awk) trata de incorporar herramientas para una mejor gestin de programas largos
Funciones Entrada: getline Trigonometra: sin, cos, atan2, rand, srand Manejo de cadenas: match, sub

otras versiones e implementaciones


bkw: versin de Brian Kernigan de awk gawk: implementacin GNU de awk
No funciona en todos los sistemas xgawk: projecto SourceForge que extiene awk con la carga de bibliotecas dinmicamente

mawk: implementacin muy rpida de awk por Mike Brennan, basado en un intrprete de cdigo binario
awka: traductor de awk a C basado en mawk.

tawk: compilador de awk para DOS y Windows de Thompson Automation Software jawk: implementacin de awk en Java

shell y awk en la historia de la programacin


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

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

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, AddisonWesley.

Vous aimerez peut-être aussi