cli (command line interface) ¿qué es una shell? introducci...

26
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 Contenidos 1. Introducción a la shell 2. Programación básica en bash 3. Programación avanzada 4. sed y awk 5. Referencias Introducci Introducci Introducci Introducción a n a n a n a la Shell la Shell la Shell la Shell 1. 1. 1. 1.¿Qu Qu Qu Qué es una shell? es una shell? es una shell? es una shell? 2. 2. 2. 2.Tipos de shell Tipos de shell Tipos de shell Tipos de shell 3. 3. 3. 3.Usos de la shell Usos de la shell Usos de la shell Usos de la shell 4. 4. 4. 4.Variables de entorno Variables de entorno Variables de entorno Variables de entorno 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 ¿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. Shell Gráfica

Upload: others

Post on 22-Jun-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: CLI (Command Line Interface) ¿Qué es una shell? Introducci ...vis.usal.es/rodrigo/documentos/shellProgramming/... · , que daría lugar a Linux • De nuevo, toma las mismas ideas

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

Co

nte

nid

os

1.Introducción a la shell

2.P

rogramación básica en bash

3.P

rogramación avanzada

4.sed y aw

k5.

Referencias

Introducci

Introducci

Introducci

Introduccióóó ón an an an a

la Shell

la Shell

la Shell

la Shell

1.1.1.1.¿¿¿ ¿Qu

QuQu

Quééé ées una shell?

es una shell?

es una shell?

es una shell?

2.2.2.2.Tipos de shell

Tipos de shell

Tipos de shell

Tipos de shell

3.3.3.3.Usos de la shell

Usos de la shell

Usos de la shell

Usos de la shell

4.4.4.4.Variables de entorno

Variables de entorno

Variables de entorno

Variables de entorno

Interfaz entre el Sistem

a Operativo y el

Usuario

Dos tiposG

ráficaLínea de C

omandos

CLI (C

omm

and Line Interface)intérprete de com

andos, terminal, consola

¿Q

es u

na s

hell?

shell (ȓǫl/) –noun 1.a hard outer covering of an anim

al, as the hard case of a m

ollusk, or either half of the case of a bivalve mollusk.

Sh

ell G

ráfic

a

Page 2: CLI (Command Line Interface) ¿Qué es una shell? Introducci ...vis.usal.es/rodrigo/documentos/shellProgramming/... · , que daría lugar a Linux • De nuevo, toma las mismas ideas

Sh

ell d

e L

ínea

de C

om

an

do

s

Generalm

ente con shellnos referim

os a una C

LIde Unix

Grá

fica v

s T

ex

to

Transferencia o

procesamiento de datos

Procesam

iento de imagen,

video, etc.

Usuario experto

Usuario base

Ciertas operaciones son m

ás rápidas o no se pueden hacer de otro

modo

Sencilla

Fácil uso

Línea de Com

andosG

ráfica

Tip

os d

e s

hell

•B

ourneshell (sh)

–1971 (Thom

pson), 1976 (Mashey)

–1977. Stephen B

ourne, Bell Labs.

•C

Shell (csh)

–1978. Bill Joy, B

erkeley•

Korn

Shell (ksh)

–1982. David K

orn, Bell Labs.

•B

ourne againshell (bash)

–1987. Brian F

ox, GN

U P

roject

Bo

urn

e S

hell (s

h)

•La m

ás antigua•

No tiene características interactivas

–H

istoria de comandos

–A

utocompletar nom

bres de ficheros–

…•

No tiene estructuras com

plejas de program

ación–

Funciones

–C

ase–

C S

hell (c

sh

)

•S

intaxis como el lenguaje C

–N

o compatible con la fam

ilia Bourne

•C

apacidades interactivas–

Pausar/reiniciar procesos

–H

istoria de comandos

–O

peraciones aritméticas

Ko

rn S

hell (k

sh

)

•S

ustituye y es compatible con B

ourne

•C

aracterísticas interactivas como C

, pero m

ejoradas–

Añade edición de líneas de la historia

–E

jecución más rápida

Page 3: CLI (Command Line Interface) ¿Qué es una shell? Introducci ...vis.usal.es/rodrigo/documentos/shellProgramming/... · , que daría lugar a Linux • De nuevo, toma las mismas ideas

Bo

urn

e a

gain

sh

ell (b

ash

)

•Juego de palabras con born-again (renacido)

•D

esarrollado para el proyecto GN

U, que daría

lugar a Linux•

De nuevo, tom

a las mism

as ideas que ksh y csh y las im

plementa sobre sh

–P

arámetros

–O

peraciones matem

áticas–

Redireccionam

iento E/S

–E

xpresiones regulares–

etc.

Dis

tribu

cio

ne

s

AIX

, HP

-UX

, B

SD

mac os X

solarisfreebsd

linux

ksh

csh

bash

PO

SIX

sh

ell

•S

imilar a ksh y utilizada por H

P-U

X•

95

%com

patible con bash•

Com

o ksh, integra características de la csh, m

ejoradas (histórico de comandos,

autocompleción, operaciones aritm

éticas…)

•Las diferencias entre P

OS

IX y ksh son m

ínimas:

–http://docs.hp.com

/en/B2355-90046/ch15s03.htm

l

Mu

ltiplic

ida

d d

e la

s s

hells

•A

nte el mism

o sistema operativo, podem

os tener varias shells activas al m

ismo tiem

po–

Gráficas y de texto (Linux)

–D

e 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 sistem

a

Uso

s d

e la

sh

•Intérprete de com

andos: ejecutar comandos

desde el intérprete•

Scripts: ejecutar secuencias de com

andos desde un fichero

•P

rogramas: control del flujo de ejecución de

secuencias de comandos (bucles, condiciones,

variables, etc.) desde un fichero

Inté

rpre

te d

e c

om

an

do

s

•S

intaxistípica

–com

an

do [-]o

pcio

ne

s p

ará

me

tros

•O

pciones: dependen de cada comando y alteran

su funcionamiento

•P

arámetros: variables de entrada que necesita el

comando, separadas por espacios

–ps –fu

–ls file.txt

–grep “*.txt” ../folder

Page 4: CLI (Command Line Interface) ¿Qué es una shell? Introducci ...vis.usal.es/rodrigo/documentos/shellProgramming/... · , que daría lugar a Linux • De nuevo, toma las mismas ideas

Pro

ce

sam

ien

to s

ec

uen

cia

l

date

ps –fu

who

•E

l sistema com

pleta cada comando antes

de ejecutar el siguiente:

Pro

ce

sam

ien

to s

ec

uen

cia

l

•date;

“ps –fu”;

who

Pro

ce

sam

ien

to n

o S

ecu

en

cia

l

•C

ada programa se ejecuta sin esperar a que el anterior

termine

date &

“ps -fu”

&who

ps

datepsw

ho

datew

ho

Red

irecció

n d

e 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

Tu

bería

s (p

ipes)

•C

onectan la salida de un programa a la entrada del

siguiente

–ls |

more ~

ls > temp; more < temp

Sh

ell s

crip

t

•P

oner en fichero órdenes que se puedan ejecutar en el intérprete de com

andos

•P

ara editar el fichero, se puede usar cualquier editor (típicam

ente vi)

•E

jemplo: editar un fichero con la línea:

•date; who; ps uf; du /home

•E

jecutar con: •

sh

nombreScript

Page 5: CLI (Command Line Interface) ¿Qué es una shell? Introducci ...vis.usal.es/rodrigo/documentos/shellProgramming/... · , que daría lugar a Linux • De nuevo, toma las mismas ideas

Tru

co

s

•S

i se usa vi, lo ideal es tener dos consolas

abiertas, una para edición y otra para ejecución•

Para poder ejecutar un fichero com

o script, debem

os tener permisos de ejecución

•chmod +x

nombreFichero

•O

tros modos de ejecución:

–./nombreScript

–nombreScript

si se encuentra en el PA

TH

Fic

hero

.pro

file

•S

cript(s) que se ejecuta automáticam

ente al hacer login

•S

e encuentran en el directorio raíz del usuario

•E

stablece el “entorno” de trabajo

.profile.c

sh

rc

.profile.k

sh

rc

.bash_profile.bash_login

.profile.b

as

hrc

.profile

csh

ksh

bash

sh

Varia

ble

s d

e e

nto

rno

Shell que estam

os usandoSHELL

Configuración del prom

pt de consolaPS1

Tipo de S

istema O

perativoOSTYPE

Directorio de trabajo actual

PWD

Nom

bre de cuenta con el que hemos

accedido al sistema

LOGNAME

Directorio raíz de nuestra cuenta

HOME

Directorios para la búsqueda de parám

etros, separados por (:)PATH

Varia

ble

s d

e e

nto

rno

•P

ara acceder al valor $VAR

•P

ara mostrar el valor

echo

$VAR

•P

ara cambiar el valor

VAR=valor

•Los cam

bios a las variables de entorno n

o se m

antienen para otras shells a no ser que se incluyan en el .p

rofile

o se utilice e

xp

ort

•E

jercicio–

Establecer en el P

AT

H la ruta de la carpeta

donde almacenarem

os los scripts

Programaci

Programaci

Programaci

Programacióóó ón n n n

bbb bááá ásica en Bourne Shell

sica en Bourne Shell

sica en Bourne Shell

sica en Bourne Shell

1.1.1.1.Introducci

Introducci

Introducci

Introduccióóó ónnn n

2.2.2.2.Variables

Variables

Variables

Variables

3.3.3.3.Par

Par

Par

Parááá ámetros

metros

metros

metros

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

5.5.5.5.Condiciones

Condiciones

Condiciones

Condiciones

6.6.6.6.Bucles

Bucles

Bucles

Bucles

7.7.7.7.Funciones

Funciones

Funciones

Funciones

8.8.8.8.Operaciones

Operaciones

Operaciones

Operaciones

aritmaritmaritmaritm

ééé éticas

ticas

ticas

ticas

9.9.9.9.Depuraci

Depuraci

Depuraci

Depuracióóó ónnn n

Page 6: CLI (Command Line Interface) ¿Qué es una shell? Introducci ...vis.usal.es/rodrigo/documentos/shellProgramming/... · , que daría lugar a Linux • De nuevo, toma las mismas ideas

Pro

gra

ma

ció

n S

hell

•S

cripts donde introducimos conceptos

propios de la programación

–V

ariables–

Parám

etros–

Condiciones

–B

ucles–

Funciones

–O

peraciones aritméticas

•Los com

andos disponibles de la shell actúan com

o nuestra biblioteca de funciones

Po

r qu

é p

rog

ram

ar e

n s

hell?

•R

equiere un cierto esfuerzo programar en

shell, así que antes debemos plantearnos si

nos va a ser útil•

Razones para program

ar en shell1.

Porque nos lo m

andan (como es el caso)

2.P

orque sabemos program

ar: el esfuerzo necesario para aprender es m

uchísimo m

enor3.

Porque en nuestro trabajo nos va a ser útil:

–A

dministradores: tareas com

plejas o automatizables

–H

ackers : tareas rápidas–

Program

adores usuarios: tareas que se repiten

Cu

án

do

pro

gra

mar e

n s

hell?

•Llam

adas frecuentes a funciones del sistema

•Llam

adas repetitivas a una función del sistema

•P

rogramas cortos

–S

i un programa pasa de una página, probablem

ente la shell no sea la m

ejor solución

•C

uanto mejor conozcam

os la shell y sus com

andos, más la usarem

os y más útil será la

programación en shell

Varia

ble

s

•A

demás de las variables de entorno podem

os declarar variables lo

cale

sal script

•N

o tienen tipo, no hay que declararlas o inicializarlas previam

ente

•A

signación:variable=valor

•A

cceder al valor: $variable

Varia

ble

s (II)

•P

ara diferenciar el valor de variables en cadenas, usam

os { }:–dir2=/home/rodrigo/curso

–cat ${dir2}/lista.txt

–E

n las shells más m

odernas ya no es necesario

•N

ormalm

ente, 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

Pará

metro

s

•U

n script puede tener parámetros de entrada

igual que cualquier comando

–script par1 par2 par3 …

•P

ara acceder a sus valores usamos

–$1, $2, $3, … $9

•$0

es el nombre del com

ando•$*, $@

devuelven todos los parámetros

separados por espacios

Page 7: CLI (Command Line Interface) ¿Qué es una shell? Introducci ...vis.usal.es/rodrigo/documentos/shellProgramming/... · , que daría lugar a Linux • De nuevo, toma las mismas ideas

Pará

metro

s (II)

•N

úmero de parám

etros:$#

•S

i tenemos m

ás de 9 parámetros, tenem

os que usar desplazam

ientos:shift [n]

–D

onde nes el núm

ero de pasos que desplazamos

–S

i no se especifica n, se com

porta como s

hift 1

Gestió

n E

/S: e

ch

o

•S

alida por consola: echo

cadena

Lo que encierra se toma literalm

ente‘’

Todo lo que está entre com

illas pierde su significado especial salvo $ y \

“”

Elim

ina el significado especial del siguiente carácter\

Todo lo que está entre acentos graves se trata com

o un com

ando` `

Evita el salto de línea

(útil si se espera un parámetro de entrada)

-n

des

crip

ció

nC

ara

cte

res

esp

ec

iale

s

ech

o: s

ecu

en

cia

s d

e e

scap

e

tabulador horizontal\t

retorno de carro\r

alerta (beep)\a

salto de línea\n

suprime el salto de línea (com

o –n

)\c

elimina el carácter anterior (backspace)

\b

barra hacia atrás (\)

\\

activa la interpretación de secuencias de escape-e

des

crip

ció

ns

ec

ue

nc

ias

d

e e

sc

ap

e

ech

o: c

ód

igo

s d

e e

sc

ap

e

•S

e introducen con la secuencia de escape \033

•C

ada código tiene la sintaxis: [parametroAcción

–parámetro

es un número

–acción

es una letra

•E

jemplo:

•echo –e

“\033[34m

Hola”

ech

o: c

ód

igo

s (ii)

11

–acepta caracteres A

SC

II extendidos (asciitable.com)

30-37

–establece el color de las letras (3

1rojo, etc.)

27

–deshabilita el intercam

bio 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 fuente

m

des

crip

ció

n y

pa

rám

etro

sa

cc

ion

es

ech

o: c

od

igo

s (iii)

Recupera la posición del cursor y sus atributos

ojo

: 7s

y 8

u n

o fu

ncio

nan

en

tod

os lo

s te

rmin

ale

s, e

s m

ás

re

co

men

tab

le u

sar t

put sc

y tput rc

8u

Establece la posición del cursor

x;y

–posición para el cursor

H,f

Alm

acena 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

des

crip

ció

na

cc

ion

es

Page 8: CLI (Command Line Interface) ¿Qué es una shell? Introducci ...vis.usal.es/rodrigo/documentos/shellProgramming/... · , que daría lugar a Linux • De nuevo, toma las mismas ideas

ech

o: e

jem

plo

sG

estio

n E

/S: re

ad

•E

ntrada de consola: read

var

•E

n ksh también se puede hacer así:

•read fich?“Introduce nombre de fichero: ”

Gestió

n E

/S: e

xit

•S

alida del script:exit

código_fin

•0

terminado con éxito

•1

error interno•

2error por sintaxis de llam

ada

•$?

Devuelve el código de salida del últim

o com

ando ejecutado

Exp

resio

nes re

gu

lare

s

•M

anejar con soltura las expresiones regulares es fu

nd

am

en

talpara program

ar en shell y manejar

comandos com

o 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*

Descrip

ció

nS

ímb

olo

Ex

pre

sio

ne

s re

gu

lare

s (II)

•M

ás expresiones regulares

Marca expr. regulares, para luego repetirlas con \n, donde n

es la n-ésima expr. m

arcada\(…\)

Líneas sin

los caracteres entre corchetes[^…]

Líneas en blanco^$

Interpretar literalmente el sím

bolo especial siguiente

\

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

^

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

Descrip

ció

nS

ímb

olo

Ex

pre

sio

ne

s re

gu

lare

s (III)

•E

xtensión PO

SIX

Aparece la expr. anterior o la posterior

cat|dog�

cat, dog

|

La expr. reg. anterior aparece 1+

veces

[hc]+at �

hat, cat, hhat, chat,

__________hcat, ccchat

+

La expr. reg. anterior aparece 0 ó

1vez

[hc]?at �

at, hat, cat

?

Descrip

ció

nS

ímb

olo

Page 9: CLI (Command Line Interface) ¿Qué es una shell? Introducci ...vis.usal.es/rodrigo/documentos/shellProgramming/... · , que daría lugar a Linux • De nuevo, toma las mismas ideas

Co

nd

icio

nes

•iflista_condiciones1

•then

lista_comandos1

•elif

lista_condiciones2

•then

lista_comandos2

•…

•else

lista_comandosN

•fi

Test

•P

ara 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, =

Test

Verdadero si f

ich

existe y tiene tamaño

mayor que cero

-s fich

Verdadero si f

ich

existe y es un directorio-d fich

Verdadero si f

ich

existe y se puede ejecutar-x fich

Verdadero si f

ich

existe y se puede escribir-w fich

Verdadero si f

ich

existe y se puede leer-r fich

Verdadero si f

ich

existe y es un fichero -f fich

Fic

hero

s

Test

Verdadero si c

ad

existe y no tiene valor nulo

cad

Verdadero si las cadenas son distintas

cad1!=cad2

Verdadero si las cadenas son iguales

cad1==cad2

Verdadero si c

ad

sí es una cadena nula-z cad

Verdadero si c

ad

no es una cadena nula -n cad

Cad

en

as

Test

OR

-o

AN

D-a

Op

era

do

res b

oo

lean

os

•O

bservaciones–

Incluir siempre un espacio despues de [ y antes de ]

–test solo vale para enteros, los reales son truncados al entero m

ás próximo

Case

•E

xpansión de if

(similar al sw

itch de C

o java)•case

param in

•patron1 [ | patron2…] )

lista_comandos1 ;;

•patron2 [ | patron3…] )

lista_comandos2 ;;

•…

•esac

Page 10: CLI (Command Line Interface) ¿Qué es una shell? Introducci ...vis.usal.es/rodrigo/documentos/shellProgramming/... · , que daría lugar a Linux • De nuevo, toma las mismas ideas

Case

Eje

rcic

io

•H

acer un script similar a m

v, move

, con la siguiente sintaxis

»move filename

•D

eberá:1.

Chequear si hay argum

ento y salirse si no, m

ostrando la sintaxis correcta2.

Chequear que el argum

ento es un fichero3.

Preguntar si se quiere m

over el fichero a otro directorio o cam

biarle el nombre

4.P

roceder en cada caso, pidiendo el nombre

nuevo para el fichero o el directorio al que se va a m

over y realizar la operación (mv

)

Eje

rcic

ios

1.M

odificar move

para que el paso 3 se haga mediante

case

2.H

acer un programa s

howLines

que muestre n

um

líneas de un fichero empezando en s

tart

–showLinesstart num file

3.H

acer un programa s

ayHello

que diga “Buenos

dias”, “Buenas tardes” o “B

uenas noches”, seguido del nom

bre del usuario, según la hora que sea. El

programa debe ejecutarse autom

áticamente al abrir

un terminal

Bu

cle

s

•F

or•for

parametro [ in

lista]

•do

lista_comandos

•done

•parametro

toma los valores de la l

ista

y para cada uno de ellos se ejecuta lista_comandos

•S

i se omite la lista, p

arametro

contiene los parám

etros de entrada al script ($1 $2 …)

for (ii)

for (iii)

•S

intaxis como en C

:–for ((

expr1; expr2; expr3 ))

–do

–…

–done

•E

jemplo:

–for ((

i = 0 ;

i <= 5;

i++

))

do

echo “Hola $i veces"

done

Page 11: CLI (Command Line Interface) ¿Qué es una shell? Introducci ...vis.usal.es/rodrigo/documentos/shellProgramming/... · , que daría lugar a Linux • De nuevo, toma las mismas ideas

Wh

ile

•Ejecutam

os lista_comandos2

mientras la

siguiente entrada de lista_comandos1

tenga éxito (código de salida 0):

•while lista_comandos1

•do lista_comandos2

•done

Un

til

•Com

o while, pero se ejecuta hasta que

la condición sea verdadera, en vez de m

ientras la condición no sea falsa (~

do…w

hile de C o java)

•until lista_comandos1

•do lista_comandos2

•done

Eje

mp

los w

hile

-u

ntil

Deta

lles

•break

rompe un bucle f

or

o while

•#

a comienzo de línea para añadir un com

entario

•$$

devuelve el identificador único de la shell

•R

ecursividad: un script puede llamarse a sí

mism

o

Eje

rcic

ios

1.H

acer un script gp

(gro

upcopy), 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

Eje

rcic

ios

2.R

ealizar un script digitalClock

que muestre

la hora cada segundo (función sleep

), siem

pre en la mism

a posición (fila 0y colum

na 69

)

Page 12: CLI (Command Line Interface) ¿Qué es una shell? Introducci ...vis.usal.es/rodrigo/documentos/shellProgramming/... · , que daría lugar a Linux • De nuevo, toma las mismas ideas

Fu

nc

ion

es

•nombreFuncion() {listaComandos;}

–Llam

ada:nombreFuncion parametros

•parametros

es una lista separada por espacios

–$1, $2, …

dentro del código de la función son los parám

etros con los que se llama a la función

•dentro de la función no se pueden referenciar los parám

etros posicionales.

–U

na función debe declararse al principio del fichero, o al m

enos antes de su primera llam

ada–

Una función puede hacerse recursiva llam

ándose a sí m

isma

Fu

ncio

nes (ii)

•Retorno de función:

–Código de retorno:

return n

–Devolver una variable:

echo $var

–Si se retorna con e

cho

, se considera un retorno con éxito (r

eturn 0

)–E

jemplo:

•ret=`factorial 3`

•echo $?

•echo $ret

factorial()

{…echo $fact

}

Fu

ncio

nes (iii)

Con return, los

valores que se devuelven son num

éricos y siguen el m

ismo

código de retorno

Tom

a los parámetros com

o si fuera el script principal

No hay que declarar

parámetros

Alc

an

ce y

Bib

liote

ca d

e fu

nc

ion

es

•C

ualquier variable declarada en un punto o función del program

a 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 com

ando–. ./script

–G

eneralmente, a los scripts que son sólo funciones tienen

las extensión .lib

•La función se invoca com

o si estuviera en nuestro script

exp

r

•expr

expresion1 operador expresion2

•expr

se puede sustituir por (( … ))

•R

ealiza operaciones aritméticas

Com

paración de enteros=

,!=,\>

,\>=

, \<

,\<=

Multiplicación, división, resto

\*,/,%S

uma, resta

+, -

acció

no

pera

do

r

exp

r

•Y

operaciones con cadenas

Posición de la prim

era ocurrencia del carácter

c en

c1

exprindexc1 c

Subcadena de c

1que em

pieza en la posición s

tarty de longitud le

ngth

expr substrc1

startlength

Nº de caracteres de c1

expr lengthc1

Nº de caracteres en que coinciden c

1y

c2

(pueden ser expresiones regulares)expr c1:c2

acció

nexp

res

ión

Page 13: CLI (Command Line Interface) ¿Qué es una shell? Introducci ...vis.usal.es/rodrigo/documentos/shellProgramming/... · , que daría lugar a Linux • De nuevo, toma las mismas ideas

Eje

rcic

ios

1.H

acer un script fact

que devuelva el factorial de un núm

ero que se pasa como argum

ento–

Sintaxis: f

act num

2.R

eescribir fact

para que utilice una función que se llam

ará factorial

3.M

odificar la función factorial

para que sea recursiva

4.U

bicar la función factorial en otro fichero (common.lib

) y reescribir fact

para que la invoque a través de la biblioteca de funciones.

wait y

sle

ep

•wait

[n]

–E

spera hasta que el proceso con id nacabe

–S

i no es especifica id, espera a que todos los procesos hijos en background term

inen–

“!” da el id del último proceso lanzado en segundo

plano �wait $!

para esperar por él

•sleep

n

–E

l script se queda bloqueado sin hacer nada durante n

segundos

Dep

ura

ció

n

•sh –v

script

•E

scribe cada linea de código que ejecuta:

–tot=

`expr $1 + $2`

–echo $tot

$ s

h -v

su

ma

.sh

4 5

tot=

`exp

r $1

+ $

2`

exp

r $1

+ $

2e

ch

o $

tot

9

Dep

ura

ció

n d

e s

crip

ts

•sh –x

script

•S

ustituye 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

$ s

h -x

su

ma

.sh

4 5

++

exp

r 4 +

5+

tot=

9+

ech

o 9

9

Programaci

Programaci

Programaci

Programacióóó ón n n n

avanzada en bash

avanzada en bash

avanzada en bash

avanzada en bash

1.1.1.1.Variables locales y globales

Variables locales y globales

Variables locales y globales

Variables locales y globales

2.2.2.2.SeSeSe Señññ ñales

ales

ales

ales

3.3.3.3.getopts

getopts

getopts

getopts

4.4.4.4.Utilidades esenciales

Utilidades esenciales

Utilidades esenciales

Utilidades esenciales

Page 14: CLI (Command Line Interface) ¿Qué es una shell? Introducci ...vis.usal.es/rodrigo/documentos/shellProgramming/... · , que daría lugar a Linux • De nuevo, toma las mismas ideas

Varia

ble

s g

lob

ale

s y

locale

s

•Las variables declaradas en un program

a son locales, y por tanto no estarán disponibles en otras shells

•P

ara hacer global:export

var

$ vech=Bus

$ echo $vech

Bus

$ exportvech

$ /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

Eje

cu

ció

n c

on

dic

ion

al

•comando1&&comando2

–E

jecuta comando2

sólo si comando1

se ejecutó con éxito

•comando1 ||

comando2

–E

jecutacomando2

sólo sicomando1

se ejecutó sin éxito

•listaComandos1 ;

listaComandos2

–S

e ejecuta primero l

istaComandos1

, luego listaComandos2

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

–o $fn $fn &

Señ

ale

s

•U

n programa puede term

inar de manera forzosa

debido a un error en el SO

o a la interrupción por parte del usuario

•P

ara controlar estos eventos, se utilizan señ

ale

s

•S

i, por ejemplo, un program

a modifica ficheros

delicados o crea ficheros temporales, etc. debe

manejar la gestión de señales para evitar dejar

ficheros incompletos o innecesarios

Tra

p

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

•E

jecuta la lista de co

man

do

scuando se produce

alguna de las se

ña

les

especificadas•

Una vez incluida, se m

antiene a la escucha para el resto del program

a•

Es bueno tratar estas señales en una función,

que será la que se incluya en trap

como

comando

ids. d

e s

al

kill (no se puede coger con trap

)9

terminate (k

ill

que se puede coger con trap

)15

quit3

interrupt (CTRL+C

)2

hangup (colgar)1

salida de la shell0

ocu

rre c

uan

do

nº d

e s

al

Existen m

uchas más señales (s

eg

me

nta

tion

fau

lt, bu

s e

rror, p

ow

er

fail, e

tc) , pero generalmente, estas son las que se busca controlar

Se

ñale

s: e

jerc

icio

•H

acer un programa a

ges

que1.

Acepte un único parám

etro, el nombre de un

fichero2.

Indefinidamente:

1.P

regunte por un nombre y luego por una edad

2.A

ñada el nombre y la edad a un fichero tem

poral temp

3.P

regunte si se quieren añadir más ficheros

4.S

i no se van a añadir más ficheros, vuelca t

emp

al fichero que se pasó com

o parámetro

3.E

jecutar el programa, m

eter un par de nombres y

luego pulsar CTRL+C

Page 15: CLI (Command Line Interface) ¿Qué es una shell? Introducci ...vis.usal.es/rodrigo/documentos/shellProgramming/... · , que daría lugar a Linux • De nuevo, toma las mismas ideas

Se

ñale

s: e

jerc

icio

(II)

•¿

Qué ocurre? t

emp

no se ha borrado y no se ha generado el fichero final

•H

acer tratamiento de la señal generada por

CTRL+C

para que temp

se borre en ese caso.

geto

pts

•getopts

optstring var1

•R

ecoge las opciones que se le hayan pasado al script y que coincidan con la sintaxis en optstring

, almacenándolos en v

ar1

•S

i un parámetro en o

ptstring

va seguido de :quiere decir que requiere de un argum

ento•

Ejem

plo de optstring:

–n:asgr:t

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

»-n argn –r argr -asgt

geto

pts

(II)

•S

i una opción requiere de argumento, se

almacena en $

OPTARG

•$OPTIND

es el índice del siguiente parámetro

•E

jemplo:

•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

geto

pts

: eje

rcic

ios

1.M

odificar el programa m

ove

para que los parámetros

sean recogidos mediante g

etopts

–usage: m

ove [–f file | -d dir] filename

2.E

scribir un script utilities

que, mediante

getopts

, comprenda la sintaxis

–usage: u

tilities –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ám

etro (p. ej, vi), com

probando si existe antes–

-?

muestra la ayuda (usage)

Utilid

ad

es e

sen

cia

les

•Linux provee una serie de utilidades esenciales para agilizar el trabajo:–

Ficheros de datos

–Inform

ación del sistema

–A

dministración del sistem

a

•D

e todas ellas, veremos las m

ás importantes

–cut

–paste

–join

–tr

–uniq

Fic

hero

s

•V

amos a trabajar sobre dos ficheros sencillos

Sr.N

oN

ame

11V

ivek12

Renuka

13P

rakash14

Ashish

15R

ani

Sr.N

oM

ark11

6712

5513

9614

3615

67

sn

am

e

(nombres)

sm

ark

(patrimonio en m

ill.)

Page 16: CLI (Command Line Interface) ¿Qué es una shell? Introducci ...vis.usal.es/rodrigo/documentos/shellProgramming/... · , que daría lugar a Linux • De nuevo, toma las mismas ideas

cu

t

Extracción de colum

nas o campos: c

ut

–cut [opciones] [fichero ...]

Opciones-c lista

Trata cada carácter com

o una columna

-f lista

Cam

pos delimitados por tabuladores

-d SEP

Utiliza el carácter S

EP

como separador en vez del

tabulador

lista

es una secuencia de números para indicar qué

campos o colum

nas se quieren cortar:A-B

Cam

pos o columnas A

hasta B inclusive

A-

Cam

po o columna A

hasta el final de la línea

A,B

Cam

pos o columnas A

y B

paste

•P

egar líneas de ficheros por columnas

•paste

file1 file2

•C

omo separador, añade un tabulador

•E

jerc

icio

: Generar un fichero con códigos, patrim

onio y nom

bres, pero sin repetir el código de persona

$ p

as

te s

nam

e s

mark

11

Viv

ek

11

67

12

Renuka

12

55

13

Pra

kash

13

96

14

Ashis

h14

36

15

Rani

15

67

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

join

•P

ega líneas de dos ficheros, por columnas, sólo para

las líneas que tienen el mism

o valor en la primera

columna (que no se repite)

–join

file1 file2

•S

i uno de los campos no existe en alguno de los

ficheros, no lo añade

$jo

in s

na

me s

ma

rk11

Viv

ek

67

12

Renu

ka

55

13

Pra

kash

96

14

Ashis

h36

15

Rani

67

tr

•C

ambiar un rango de caracteres a otro distinto

–tr

pattern1 pattern2

$ tr "h

2" "3

x" <

sn

am

e11

Viv

ek

1x

Ren

uka

13

Pra

kas3

14

As3is

315

Rani

$ tr "[a

-z]" "[A

-Z]"

holaH

OLA

tr (ii)

•O

pciones

elimina p

attern1

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

descrip

ció

no

pcio

nes

Page 17: CLI (Command Line Interface) ¿Qué es una shell? Introducci ...vis.usal.es/rodrigo/documentos/shellProgramming/... · , que daría lugar a Linux • De nuevo, toma las mismas ideas

tr (iii) -eje

mp

los

•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

un

iq

•E

limina líneas duplicadas adyacentes

–uniq

file

•-c

indica el número de veces que aparece duplicada

•S

u salida es el mism

o fichero sin líneas duplicadas a

dya

ce

nte

s

•S

i queremos elim

inar toda

slas líneas

duplicadas–

sort

file | uniq

Eje

rcic

ios c

on

fich

ero

s

•H

acer un script listWords

que recoja todas las palabras de f

ile1

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 f

ile2

–listWords file1 file2

•M

odificar el script para que acepte la opción –v

, en cuyo caso la ordenación se llevará a cabo según palabras que rim

en–

truco: usar rev

eje

rcic

ios

•U

n dig

ram

aes un conjunto de dos palabras.

Realizar un script que liste, en orden, el núm

ero de ocurrencias de cada digram

a en un fichero que se pase com

o parámetro

•listDigrams file1 file2

awk y sed

awk y sed

awk y sed

awk y sed

a)a)a)a)sed

sed

sed

sed

1.1.1.1.substitu

ciones

substitu

ciones

substitu

ciones

substitu

ciones

2.2.2.2.delimitadores

delimitadores

delimitadores

delimitadores

3.3.3.3.marcadores

marcadores

marcadores

marcadores

4.4.4.4.ocurrencias

ocurrencias

ocurrencias

ocurrencias

5.5.5.5.scripting

scripting

scripting

scripting

6.6.6.6.restric

ciones

restric

ciones

restric

ciones

restric

ciones

b)b)b)b)awk

awk

awk

awk

1.1.1.1.patrones

patrones

patrones

patrones

2.2.2.2.acciones

acciones

acciones

acciones

3.3.3.3.variables

variables

variables

variables

4.4.4.4.scripting

scripting

scripting

scripting

5.5.5.5.nawk

nawk

nawk

nawk

Page 18: CLI (Command Line Interface) ¿Qué es una shell? Introducci ...vis.usal.es/rodrigo/documentos/shellProgramming/... · , que daría lugar a Linux • De nuevo, toma las mismas ideas

sed

•stream

ed

itor: edición de textos en script–sed

–e ‘expr1’ [–e ‘expr2’ …] filename

•sed

suele estar muy m

al documentado:

–http://w

ww

.grymoire.com

/Unix/S

ed.html#uh-0

•S

i sólo se usa una expresión, se puede quitar el –e

:sed ‘expr1’ filename

•S

i no se pone filename, se usa la entrada

estándar

sed

-s

ub

stitu

ció

n

•sed ‘s/word1/word2/’

filein>fileout

•P

ara cada línea de filein

, sed busca la primera

ocurrenciade w

ord1

y la substituye por word2

, añadiendo la línea resultante a f

ileout

•word1

y word2

pueden ser expresiones regulares•

Si no se especifica f

ileout

, lo escribe en consola•

Ejem

plo: sed ‘s/gold/stone/’ coins.txt>

•La substitución es la operación m

ás común para la que

se usa sed

sed

-d

elim

itad

ore

s

•E

l delimitador (/) puede cam

biarse por cualquier otro carácter que no aparezca en las secuencias de búsqueda

•E

jemplo: 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

–C

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

&

•&

indica la cadena correspondiente al patrón buscado

•Ú

til cuando no sabemos exactam

ente qué estam

os buscando (expresiones regulares):–

Poner paréntesis a cualquier palabra en m

inúsculased 's/[a-z]*/(&)/' old >new

–D

uplicar el primer núm

ero 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]*/& &/‘ �

?

su

bstitu

ció

n g

lob

al

•sed

sólo modifica la prim

era ocurrencia de la expresión buscada en cada línea

•para m

odificar todas las ocurrencias–‘s/pattern1/pattern2/g’

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

flag

s (m

arc

ad

ore

s)

•P

odemos m

arcar los patrones con \(…\)

•U

n patrón marcado se puede repetir con \1

, \2…

según el orden en que se hayan m

arcado (hasta \9)•

Quedarnos con la prim

era palabra de cada línea:–sed 's|\([a-z]*\).*|\1|'

•C

ambiar el orden de la prim

era y la segunda palabra–sed 's|\([a-z]*\) \([a-z]*\)|\2\1|'

•E

liminar palabras duplicadas

–sed 's|\([a-z]*\)\1|\1|'

•probar con e

cho “perro perro gato”

•y con e

cho “casa perro gato”

?

Page 19: CLI (Command Line Interface) ¿Qué es una shell? Introducci ...vis.usal.es/rodrigo/documentos/shellProgramming/... · , que daría lugar a Linux • De nuevo, toma las mismas ideas

ocu

rren

cia

s

•/n

especifica a qué ocurrencia del patrón nos referim

os•

Elim

inar la segunda palabra de cada línea•

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

•C

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

escrib

ir a fic

hero

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

filein

•N

o tiene mucho sentido si solo tenem

os una expresión (es equivalente a >

file

)•

Es m

uy ú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.

sed

scrip

ting

•C

uando tenemos m

uchas expresiones sed, es cóm

odo hacer un sed

sc

ript:

•#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

•P

ara llamarlo:

sed –f script filein>fileout

sed

en

sh

ell s

crip

t

•D

entro de un shell script, podemos usar

igualmente s

ed

. Podem

os 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

pas

o d

e a

rgu

men

tos

a s

ed

en

sh

ell s

crip

t

•D

eberemos jugar con las com

illas para que no tom

e el argumento com

o una expresión regular:

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

•P

ara evitar problemas de sintaxis en el caso de

que el parámetro contenga espacios:

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

restric

cio

nes

•R

estringir a una línea–sed ‘ns/searh/replace/options’ filein>fileout

•R

estringir a un rango de líneas–sed ‘n,ms/searh/replace/options’ filein>fileout

•La últim

a 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 p

1hasta la

primera en que se encuentre p

2–sed ‘/p1/,/p2/s/searh/replace/options’ fin>fout

Page 20: CLI (Command Line Interface) ¿Qué es una shell? Introducci ...vis.usal.es/rodrigo/documentos/shellProgramming/... · , que daría lugar a Linux • De nuevo, toma las mismas ideas

otra

s o

pcio

ne

s

•sed

tiene multitud de opciones adicionales

–m

anejo de E/S

–condiciones (if, else)

–control de flujo (for, w

hile)–

etc.

•S

in embargo, para soluciones m

ás complejas

que búsquedas y sustituciones simples, a

wk

es m

ás potente y más fácil de utilizar

otra

s a

ccio

ne

s

write (escribe a fichero la salida de sed)

w

print (imprim

e por pantalla la salida de sed)p

quit (terminar la ejecución)

q

sig

nific

ad

oaccio

nes

Eje

rcic

ios

1.S

ustituir todas las vocales minúsculas de un

fichero por vocales mayúsculas

2.R

ealizar el mism

o ejercicio, pero mediante un

sedscript llamado v

owels

3.R

ealizar el mism

o ejercicio, pero en una shellscript

4.M

odificar 3 para que se acepten los nombres

de ficheros de entrada y salida como

argumentos

eje

rcic

ios (ii)

5.Q

ueremos cam

biar todos los ficheros con extensión *.txt a *.tex. H

acer mv *.txt

*.tex

no funciona ¿P

or qué? Hacer un script

basename

que realice esta función

aw

k

•S

e puede ver como

–U

tilidad para realizar procesamiento sencillo de texto

–Lenguaje de program

ación para procesamiento

complejo de texto

•B

asado en C•

Utilizado para

–G

eneración de informes

–M

anejo de Bases de D

atos pequeñas–

Traducir form

atos de fichero–

Realizar operaciones m

atemáticas en ficheros

numéricos

aw

k (ii)

•A

WK

�A

ho, Weinberg &

Kernigan

–K

ernigan es autor, junto con Ritchie, de C

•A

WK

es un lenguaje inte

rpre

tad

o–

Relativam

ente lento–

Fácil de apreder

•A

WK

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 21: CLI (Command Line Interface) ¿Qué es una shell? Introducci ...vis.usal.es/rodrigo/documentos/shellProgramming/... · , que daría lugar a Linux • De nuevo, toma las mismas ideas

Fic

hero

de

eje

mp

lo: c

oin

s.tx

t

meta

l weig

ht_

in_o

un

ces d

ate

_m

inte

d c

ou

ntry

_o

f_o

rigin

descrip

tion

gold 1 1986 US

A A

merican E

agle

gold 1 1908 Austria-H

ungary Franz Josef 100 K

orona

silver 10 1981 US

A ingot

gold 1 1984 Sw

itzerland ingot

gold 1 1979 RS

A K

rugerrand

gold 0.5 1981 RS

A K

rugerrand

gold 0.1 1986 PR

C P

anda

silver 1 1986 US

A Liberty dollar

gold 0.25 1986 US

A Liberty 5-dollar piece

sin

taxis

•A

plicar a un fichero un patrón awk

•awk [-F<del>]‘/search_pattern/ {awk_actions}’ filename

–A

plica aw

k_a

ctio

ns

a todas las líneas de filen

am

eque cum

plan con se

arc

h_

pa

ttern

–-F

<d

el>

especifica el carácter a utilizar como delim

itador de colum

nas. Por defecto, se tom

an espacios y tabuladores

•A

plicar a un fichero un programa aw

k•awk –f awk_program filename

•B

ásicamente am

bas opciones son lo mism

o, la segunda se usa cuando el patrón aw

k se hace m

uy largo o lo tenemos en un fichero

patro

ne

s d

e b

ús

qu

ed

a

•aw

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

•P

atrones de búsqueda–/seq/

busca líneas que contengan seq

•var ~ /seq/

busca variables (ver +abajo) que contengan s

eq

–BEGIN

busca la primera línea

–END

busca la última línea

•S

i no se especifica patrón de entrada, devuelve todas

las líneas del fichero•

Las secuencias de búsqueda pueden llevar m

eta

ca

racte

res

meta

cara

cte

res

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 m

etacaracter\

Coincide con el final de línea

$

Coincide con el com

ienzo de línea^

El carácter anterior aparece 0+

veces*

Cualquier carácter (uno)

.

sig

nific

ad

om

eta

cara

cte

r

eje

mp

los d

e b

úsq

ue

da

“Germ

any” “Germ

any’s politics …”

/{^Germany}/

“Bourne” “815oceanic”

^[^a-z]

“bourne” “Bourne” “oceanic815”

/[a-zA-Z0-9]/

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

“The” “the”

/[Tt]he/

“$”/\$/

“Bourne U

ltimatum

, The”, “T

he”, “Pathe”

/The$/

“The B

ourne Ultim

atum”, “T

he”, “Thelem

a"/^The/

“The”

/The/

resu

ltad

op

atró

n

eje

mp

los d

e b

úsq

ue

da (ii)

[0-9]+ C

ualquier cadena de números

[-+]? P

osible signo inicial/^…

$/ La línea coincide exactamente

Cualquier entero (con o sin signo)

/^[+-]?[0-9]+$/

“wh” “w

hh” “whhh” …

/wh+/

“w” “w

h”/wh?/

Cualquier cadena de caracteres

/.*/

“w“ “w

h” “whh” “w

hhh” …/wh*/

“who” “w

hy” “wh3” …

/wh./

resu

ltad

op

atró

n

Page 22: CLI (Command Line Interface) ¿Qué es una shell? Introducci ...vis.usal.es/rodrigo/documentos/shellProgramming/... · , que daría lugar a Linux • De nuevo, toma las mismas ideas

ac

cio

ne

s

•awk ‘/search_pattern/ {awk_actions}’ filename

•P

odemos tener cualquier tipo de acción que ofrezca

awk com

o lenguaje de programación (~

C)

–A

signación de variables y arrays(=

)–

Operaciones aritm

éticas simples (+

,-,*,/,%, +

+, --, ^)

–C

omparaciones aritm

éticas (==

,!=,>

,<,>

=,<

=)

–O

peraciones aritméticas avanzadas (sqrt, log, exp, int)

–S

alida por pantalla (print y printf)–

Procesam

iento de cadenas (substr, split, index, length)–

Estructuras de control (if…

else, for, while)

•F

or se puede usar como en bash: for(var in

lista) o como en C

accio

nes

devuelve la longitud de la cadenalength(str)

Com

o en shell y Cbreak, continue, exit

salta a la siguiente línea de textonext

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

index(“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)

descrip

ció

nacció

n

prin

t y p

rintf

imprim

e siguiendo la sintaxis de C:

%d, %

f, %o, %

x%

n.m\n, \t

printf()

imprim

e “cad1cad2”print “cad1”

“cad2”

imprim

e “cad1 cad2”print

“cad1”,”cad2”

imprim

e la linea actualprint

descrip

ció

nacció

n

varia

ble

s

•N

o tienen tipo ni hay que declararlas•

Se asignan com

o en los programas de la shell

•V

ariables especiales:

Valor de la últim

a columna

$NF

Núm

ero de columnas

NF

Núm

ero de líneas de entradaNR

Contiene el valor de toda la línea

$0

Variable de cam

po, da el valor de la colum

na 1, 2, 3 …$1, $2, $3…

descrip

ció

nvaria

ble

varia

ble

s e

sp

ecia

les

(ii)

Form

ato numérico. P

or defecto “%.6g”

OFMT

Com

o los anteriores pero para el fichero de salida

OFS, ORS

Separador de filas. P

or defecto es “new

line”, refiriéndose a “\n”RS

Separador de colum

nas. Por defecto es

“white space”, refiriéndose a “[ ]“ y “\t”

Tam

bié

n s

e p

ued

e m

od

ificar c

on

la o

pció

n d

e c

om

an

do

–F

seg

uid

o d

el d

elim

itad

or (-

F:, -F/

)

FS

Nom

bre del fichero de entradaFILENAME

descrip

ció

nvaria

ble

arra

ys

•S

ólo tienen una dimensión

•E

l acceso se identifica por indices–array[1], array[2], array[3]

–Los índices van de 1 a N

•P

odemos usar com

o índices cadenas:–array[“Roberto”], array[“Antonio”], array[“Luis”]

–E

n este sentido, se pueden utilizar los arrays como tablas

hash

•P

ara acceder a cada elemento de un array

–for (i in array)

print $i

Page 23: CLI (Command Line Interface) ¿Qué es una shell? Introducci ...vis.usal.es/rodrigo/documentos/shellProgramming/... · , que daría lugar a Linux • De nuevo, toma las mismas ideas

Eje

mp

los

•Im

primir todas las líneas con la palabra “gold”

–awk ‘/gold/’ coins.txt

•Im

primir todas las líneas de coins.txt

–awk ‘{print}’ coins.txt

•Im

primir la tercera colum

na de coins.txt–

awk ‘{print $3}’ coins.txt

•G

uardar la tercera columna de las líneas de coins.txt

que contengan la palabra “gold” a un fichero goldY

ear.txt–

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

Eje

mp

los

•H

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

•H

acer doble espaciado SIN

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

•C

ontar el número de líneas en el fichero

–awk ‘END {print NR}’ coins.txt

–wc coins.txt

Eje

mp

los

•Im

primir el tam

año medio de los ficheros de

nuestro directorio actual•

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

•G

enerar los 10 primeros núm

eros de la secuencia de F

ibonacci: 1 1

2 3

5 8

13 2

1 3

4 5

5»awk 'BEGIN

»{

»a=1; b=1;

»count=0;

»while(count++<10)

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

»}'

Scrip

ts c

on

aw

k

•H

acer un script que se llame w

ords

, que escriba cada palabra en el fichero pasado com

o parám

etro 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

Pro

gra

ma

s a

wk

•U

n programa aw

k tiene el siguiente aspecto:•search_pattern1 {awk_actions1}

search_pattern2 {awk_actions2}

•…

•search_patternN {awk_actionsN}

•S

e llama con:

•awk –f awk_program filename

Eje

mp

lo p

rog

ram

a a

wk: f

indDup

•B

uscar 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 24: CLI (Command Line Interface) ¿Qué es una shell? Introducci ...vis.usal.es/rodrigo/documentos/shellProgramming/... · , que daría lugar a Linux • De nuevo, toma las mismas ideas

Eje

rcic

ios

1.M

odificar findDup

para que muestre el

número de línea en el que se produce el

duplicado2.

Modificar f

indDup

para que no cuente la últim

a palabra de la línea anterior

Co

nd

icio

ne

s

•E

n vez de patrones de búsqueda, podemos usar

condiciones.•

Ejem

plo: buscar líneas con el nº diez en su segundo cam

po, e imprim

ir la línea siguiente•BEGIN {flag = 0}

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

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

•¿

Cóm

o modificar para que acepte cualquier

número en vez del 10 com

o parámetro?

eje

rcic

ios: b

as

es d

e d

ato

s

•T

rabajando sobre el fichero cars.txt

1.B

uscar todos los coches de la marca v

olvo

2.M

ostrar la columna 3

, seguida de la 13.

Mostrar todas las entradas que contengan una ‘h

’ en la prim

era columna

4.M

ostrar todas las entradas cuya primera colum

na em

piece con una ‘h’

5.M

ostrar la columna 2

, luego la 1, luego un ‘m

pg

’ seguido de la colum

na 3; sólo para aquellas

entradas cuya seguna columna em

pieza por mo t

. ¿

Se observa algo raro?

eje

rcic

ios (ii)

6.M

ostrar las entradas cuya columna 5

tiene un valor num

érico menor o igual a 1

00

7.M

ostrar todas las entradas desde la primera

que contenga ‘toyota

’ hasta la primera que

contenga ‘chevrolet

8.M

ostrar todos los usuarios del sistema que no

tengan como shell por defecto /

bin/sh

scrip

t co

n a

wk

•E

n shell script, los parámetros de la función

están en $1, $2, $3 …

•E

n awk, $1, $3, $3 …

expresan campos!

•S

i queremos usar parám

etros del script en llam

adas a awk, antes tenem

os que alm

acenarlos en otras variables

Eje

mp

lo a

wk s

crip

t

•E

jemplo: hacer un script que, m

ediante awk, devuelva

un campo de un fichero. C

ampo y fichero deben ser

parámetros del script»file=$1

»num=$2

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

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

•E

n estos casos, no podemos usar a

wk –f

y tener el program

a awk en otro fichero, pues no

podríamos pasarle los parám

etros de la script

Page 25: CLI (Command Line Interface) ¿Qué es una shell? Introducci ...vis.usal.es/rodrigo/documentos/shellProgramming/... · , que daría lugar a Linux • De nuevo, toma las mismas ideas

Eje

rcic

ios a

wk

scrip

ts

•U

n palíndromo es una palabra que es igual si se

escribe de izquierda a derecha que al revés. B

uscar todos los palíndromos que se encuentran

en un texto. El script tendrá la sintaxis:

–palindrome filein fileout

eje

rcic

ios (ii)

•H

acer un script que devuelva todas las palabras de un fichero (sin repetir) que tengan tantas letras com

o se le indique. El script debe tener la sintaxis

–textAnalysis –l n file

•donde n es el núm

ero de letras•

file es el fichero de entrada

naw

k

•aw

k está diseñado para hacer programas cortos

•pero m

ucha gente lo adoptó como lenguaje de

programación al uso y desarrollaba con él

•n

aw

k(n

ew aw

k) trata de incorporar herramientas

para una mejor gestión de program

as largos–

Funciones

–E

ntrada: getline–

Trigonom

etría: sin, cos, atan2, rand, srand–

Manejo de cadenas: m

atch, sub

otra

s v

ers

ion

es

e im

ple

men

tacio

ne

s

•b

kw

: versión de Brian K

ernigan de awk

•g

aw

k: im

plementación G

NU

de awk

–N

o funciona en todos los sistemas

–xgaw

k: projecto SourceF

orge que extiene awk con la carga

de bibliotecas dinámicam

ente

•m

aw

k: implem

entación muy rápida de aw

k por Mike

Brennan, basado en un intérprete de código binario

–aw

ka: traductor de aw

k a C basado en m

awk.

•ta

wk: com

pilador de awk para D

OS

y Window

s de T

hompson A

utomation S

oftware

•ja

wk: im

plementación de aw

k en Java

sh

ell y

aw

k e

n la

his

toria

d

e la

pro

gra

mació

n

http://ww

w.oreilly.com

/news/graphics/prog_lang_poster.pdf

refe

ren

cia

s

•T

utoriales utilizados–

shell scripting•

http://ww

w.cyberciti.biz/nixcraft/linux/docs/uniqlinuxfeatures

/lsst/•

http://tldp.org/LDP

/abs/html/index.htm

l

–sed•

http://ww

w.grym

oire.com/U

nix/Sed.htm

l#uh-1

–aw

k•

http://cs.sru.edu/~w

hit/cpsc207/notes/awkegs.htm

l•

http://ww

w.vectorsite.net/tsaw

k_1.html#m

1

Page 26: CLI (Command Line Interface) ¿Qué es una shell? Introducci ...vis.usal.es/rodrigo/documentos/shellProgramming/... · , que daría lugar a Linux • De nuevo, toma las mismas ideas

refe

ren

cia

s (ii)

•Libros–

Shells: U

ser’s Guide. H

ewlett P

ackard, 1991

–Linux &

Unix S

hell Program

ming. D

avid T

ansley–

Portable S

hell Program

ming. B

ruce Blinn

–U

nix

Sh

ell P

rog

ram

min

g. S

tephen G.

Kochan and P

atrick H. W

ood

–sed &

awk. D

ale Dougherty and A

rnold R

obbins–

awk P

rogramm

ing. Arnold R

obbins–

The A

WK

programm

ing language. Aho,

Kernigan y W

einberger, 1988, Addison-

Wesley.