Académique Documents
Professionnel Documents
Culture Documents
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
Grfica vs Texto
Grfica Sencilla Fcil uso
Usuario base
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
C Shell (csh)
Sintaxis como el lenguaje C
No compatible con la familia Bourne
Capacidades interactivas
Pausar/reiniciar procesos Historia de comandos Operaciones matemticas
Distribuciones
bash
csh
ksh
linux
freebsd
solaris
mac os X
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
$$ 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
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
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
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
Parmetros
Un script puede tener parmetros de entrada igual que cualquier comando
script par1 par2 par3
$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
echo cadena
descripcin
Evita el salto de lnea (til si se espera un parmetro de entrada) Elimina el significado especial del siguiente carcter
` `
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 (\)
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
30-37 establece el color de las letras (31 rojo, etc.) 40-47 establece el color de fondo
8u
H,f
echo: ejemplos
Entrada de consola:
read var
exit cdigo_fin
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]
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
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
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
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.
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
Detalles
echo ^G produce un beep break rompe un bucle for o while
Ejercicios
1. Hacer un script gp (groupcopy), que copie todos los ficheros del directorio actual al directorio especificado, con la siguiente sintaxis:
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 ;
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 (( ))
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)
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:
Depuracin de scripts
sh x script Sustituye cada $var por su valor
Seales
getopts
Utilidades esenciales
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
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
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
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
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|'
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
restricciones
Restringir a una lnea
sed n 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
awk (ii)
AWK Aho, Weinberg & Kernigan
Kernigan es autor, junto con Ritchie, de C
silver 10
ingot
gold
gold gold
1
1
1984 Switzerland
1979 RSA
ingot
Krugerrand Krugerrand
gold
Panda
Liberty dollar Liberty 5-dollar piece
silver 1 gold
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
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])
index(str, str)
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
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/)
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
Ejemplos
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
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;} }'
Programas awk
Un programa awk tiene el siguiente aspecto: search_pattern1 {awk_actions1} search_pattern2 {awk_actions2}
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 (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
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
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 (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
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
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.