BASH – Archivo de bloqueo.-

Evitar problemas de concurrencia

Si dos copias del script son iniciadas al mismo tiempo, es posible (aunque difícil, estas operaciones duran pocos milisegundos) que las dos copias lleguen al mismo tiempo al código que comprueba que el archivo $LOCK_FILE exista. Si esto sucede, ambas copias del script pueden determinar que el archivo no existe, y continuar su ejecución.

Esta clase de problemas en donde dos programas compiten por un recurso, sin que podamos determinar cuál de ellos lo obtiene, se conocen como race conditions («condiciones de carrera»). En muchos casos, cuando es posible, los evitamos usando operaciones atómicas [3].

Para este problema en particular, veremos dos variantes.

1.mkdir

Con mkdir tenemos una solución al problema, siempre que estemos dispuestos a usar un directorio y no un archivo como $LOCK_FILE. La orden

tiene dos resultados posibles: si el directorio no existe, será creado, y mkdir saldrá con un código de éxito. Si el directorio existe, mkdir fallará y no habrá cambios en el sistema.

2.noclobber

BASH tiene una opción llamada noclobber, que hace que si intentamos redirigir salida (vía >) a un archivo que ya existe, la redirección falle. Basta entonces con escribir algo como:

Para desactivar noclobber (como hacemos con las opciones de bash que modifican su comportamiento y usamos para una parte específica de nuestro script), debemos añadir una línea conteniendo set +C. Otra opción es utilizar una subshell, de tal manera que la shell que corre nuestro script no se vea afectada por el cambio, y por tanto no sea necesario desactivar nada:

Con estas mejoras, así es como nuestro script se ve ahora:

Publicado en Unix - Linux | Deja un comentario

BASH – SCRIPT para monitoreo de archivo LOG.-

Con este SCRIPT monitoreo en linea un archivo LOG, en el cual se controlan los tiempos de ejecución de las distintas fases, contranstandolas contra los tiempos estimados de ejecución de cada una de la fases. Si alguna es excedida en el tiempo de ejecución, el SCRIPT procede a emitir una alerta, la cual puede consistir en enviar un MAIL o grabar la información en un archivo de registro.- Probado en servidor AIX.

Publicado en Unix - Linux | 11 comentarios

UNIX – Comando SED trucos y tips utiles.-

Substitución

Substituir «foo» por «bar» en todas las líneas
Sólo en la 1ra ocurrencia

sed ‘s/foo/bar/’

Sólo en la 3ra ocurrencia

sed ‘s/foo/bar/3’

En todas las ocurrencias

sed ‘s/foo/bar/g’

Sólo en la penúltima ocurrencia

sed ‘s/\(.*\)foo\(.*foo\)/\1bar\2/’

Sólo en la última ocurrencia

sed ‘s/\(.*\)foo/\1bar/’

Substituir «foo» por «bar» sólo en las líneas que contienen “plop”

sed ‘/plop/ s/foo/bar/g’

Substituir «foo» por «bar» menos en las líneas que contienen “plop”

sed ‘/plop/! s/foo/bar/g’

Substituir «Foo» o «foo» por “bar” en todas las líneas

sed ‘s/[Ff]oo/bar/g’

Substituir «azul», «blanco» o “rojo” por “verde”

sed ‘s/azul\|blanco\|rojo/verde/g’

Visualización

La 1ra línea (head -1)

sed q

Las 5 primeras líneas (head -5)

sed ‘5q’

sed ‘1,5!d’

La última línea (tail -1)

sed -n ‘$p’

sed ‘$!d»

Las 5 últimas líneas (tail -5)

sed -e :a -e ‘$q;N;6,$D;ba’

Las 2 últimas líneas (tail -2)

sed ‘$!N;$!D’

Sólo las líneas que coinciden con un patrón o expresión regular

sed -n ‘/patrón/p’

sed ‘/regexp/!d’

Sólo las líneas que no coinciden con un patrón o expresión regular

sed -n ‘/patrón/!p’

sed ‘/regexp/d’

La línea anterior a un patrón o expresión regular

sed -n ‘/patrón/{g;1!p;};h’

La línea que sigue a un patrón o expresión regular

sed -n ‘/regexp/{n;p;}’

Eliminación
Espacio y tabulación

Eliminar los espacios y las tabulaciones
Al inicio de línea

sed ‘s/^[ \t]*//

sed ‘s/^\s*//’ # Uso del parámetro «\s»

Al final de la línea

sed ‘s/[ \t]*$//’

Al inicio y al final de la línea

sed ‘s/^[ \t]*//;s/[ \t]*$//’

Línea vacía

Eliminar las líneas vacías
Todas las líneas vacías

sed ‘/^$/d’

sed ‘/./!d’

Sólo las del encabezado

sed ‘/./,$!d’

sed -nr ‘/./,$s/(.*)/\1/p’

Sólo las del final

sed -e :a -e ‘/^\n*$/ {$d;N;ba’ -e ‘}’

Intervalo regular

Eliminar una línea a intervalos regulares
Todas la líneas pares

sed ‘1~2d’

Todas la líneas impares

sed ‘2~2d’

Todas las n líneas a partir de la línea n

sed ‘3~2d’ # Todas les 2 líneas a partir de la línea 3

Diversos
Unir líneas

Unir líneas de 2 en 2

sed ‘$!N;s/\n//’

Unir líneas de 3 en 3

sed ‘$!N;s/\n//;$!N;s/\n//;’

Si una línea termina en un backslash (\), agregar la línea siguiente y reemplazar el final de línea (/n) por un espacio

sed -e :a -e ‘/\\$/N; s/\\\n/ /; ta’

Si un línea comienza con un signo igual (=), agregarla a la línea precedente y reemplazar el signo igual (=) por un espacio

sed -e :a -e ‘$!N;s/\n=/ /;ta’ -e ‘P;D’

Visualización sin tener cuenta de las mayúsculas y minúsculas
(Mostrar únicamente las líneas que coinciden con un patrón sin tener en cuenta las mayúsculas y minúsculas)

El comando sed posee un flag – ver [ Sed – Introducción a Sed – Parte 1]- que permite buscar un patrón sin tener en cuenta las mayúsculas y minúsculas, pero este flag se aplica únicamente al comando de substitución (comando s).

A continuaron veremos un truco que permite utilizar este flag para mostrar (o no mostrar) líneas que coinciden con un patrón dado sin tener en cuenta de las mayúsculas y minúsculas.
Para ello, tan solo hay que utilizar el comando de substitución “s” asociado al [ metacaracter «&»] y al flag “I”.

Ejemplo para mostrar únicamente las líneas que contienen el termino “patron” (o Patron, PATRON, pAtron, etc.)

sed -n ‘s/patron/&/Ip’ fichero

El siguinte ejemplo permite mostrar las lineas comprendidasen tre los patrones (al principio de linea) «Revisando puertos» y «Proceso ejecucion». Muestra solo ese fragmento del archivo :

cat $salida | sed -n ‘/^Revisando puertos/,/^Proceso en ejecucion/p’

Publicado en Unix - Linux | Deja un comentario

UNIX – Comando GREP su uso y ejemplos.-

Busca en la entrada, líneas que concuerden con el patrón dado. Cualquier meta-carácter con un significado especial debe ser protegido precediéndolo con una barra inclinada inversa (\ ). Algunos patrones de grep se encierran entre ‘..’ (apóstrofos) para indicarle que no es un metacarácter del sehll. También existe en su versión zgrep para buscar en archivos comprimidos.

grep [opciones] ‘patrón’ archivos

grep «ejemplo» * listara las lineas que concuerden con la cadena ejemplo de «todos» los archivos del directorio actual.

grep -i hola pp.txt considera idénticas las mayúsculas y minúscula en la cadena de búsqueda hola. (hola=HOLA=Hola=etc.).

grep -ri «hola» ./ busca en los archivos del directorio actual y los subdirectorios la palabra hola.

grep -v hola pp.txt lista las líneas que no contengan la cadena hola del archivo pp.txt

grep -n hola pp.txt las líneas concordantes con la cadena hola del archivo pp.txt se mostrarán acompañadas del número de línea.

grep -w sobre pp.txt listara solamente aquellas líneas que contienen concordancias que forman palabras completas.

grep -A 2 hola pp.txt muestra 2 líneas de contexto después de las que concuerden con el patrón hola.

grep -B 2 hola pp.txt muestra 2 líneas de contexto antes de las que concuerden con el patrón hola.

grep -f patron.txt pp.txt obtiene el patrón de fichero patron.txt y listara líneas concordantes del archivo pp.txt

grep -s «ejemplo» * suprime los mensajes de error sobre ficheros que no existen o no se pueden leer.

grep [123] pp.txt listara las lineas que contengan los números 1, 2 o 3

grep ‘^L’ pp.txt lista las lineas de pp.txt que comiencen la línea con el carácter L, el carácter ^ denota inicio de cadena.

grep ‘h$’ pp.txt lista las líneas de pp.txt que terminen en h, el carácter $ denota fin de cadena.

grep ‘\pe’ pp.txt muestra todas las líneas de pp.txt que contengan palabras que finalicen con la cadena pe.

grep ‘xy*’ pp busca en pp una x seguida por la secuencia más larga de y.

grep ‘^[^#]’ pp.txt muestra pp.txt, ocultando las líneas que empiezan por # y las líneas vaciás.

grep -o patron archivo muestra solo la parte de la linea que coincide con el patrón.

grep –color=always ‘\bing[[:space:]]’ pp.txt | less -R la palabra ing seguida de un espacio sera coloriada y esta redirigida al comando less sin perder el color.

grep -Eio ‘([[:alnum:]_.-]+@[[:alnum:]_.-]+?\.[[:alpha:].]{2,6})’ archivo.txt muestra solo las direcciones de e-mail (no todo la linea que la contiene), del archivo.txt.

cat uu.txt | grep -oE ‘.*111111’ muestra desde el principio de la linea hasta la ocurrencia 111111
# cat uu.txt
73272028636f6e7461696e657269642054455854205051111115259204b4559204e4f54204e554c4c2c736
cat uu.txt | grep -oE ‘.*111111’
73272028636f6e7461696e65726964205445585420505111111

Si quisiéramos mostrar desde la ocurrencia hasta el final de la linea sería.
# cat uu.txt | grep -oE ‘111111.*’
1111115259204b4559204e4f54204e554c4c2c736

Para mostrar el contenido de la línea entre dos ocurrencias por ejemplo entre 6169 y 111111 sería:
# cat uu.txt | grep -oE ‘6169.*111111’
61696e65726964205445585420505111111

En caso que quisiéramos mostrar el final de la linea excluyendo la ocurrencia sería:
# cat uu.txt | awk -F111111 ‘{print $NF}’
5259204b4559204e4f54204e554c4c2c736

Publicado en Unix - Linux | Deja un comentario

BASH – Script para verificar ingreso de argumentos.-

Publicado en Unix - Linux | Deja un comentario