Archivo para 29 septiembre 2011

progbar y progbar2: barras de progreso en bash

Para añadir algo de animación a los scripts que pueden tardar en ejecutarse, nada mejor que una barra de progreso personalizada.
En este ejemplo, la barra rebota al estilo gnome y Kitt (coche fantástico).

#!/bin/bash
# progbar: una barra de progreso en bash
# por ratoncio
# ver. 0.1
SPEED=0.1
DEL="\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08"
PID=$1
while [ -d /proc/$PID ];do
    echo -en "0-------" && sleep $SPEED && echo -en $DEL
    echo -en "-0------" && sleep $SPEED && echo -en $DEL
    echo -en "--0-----" && sleep $SPEED && echo -en $DEL
    echo -en "---0----" && sleep $SPEED && echo -en $DEL
    echo -en "----0---" && sleep $SPEED && echo -en $DEL
    echo -en "-----0--" && sleep $SPEED && echo -en $DEL
    echo -en "------0-" && sleep $SPEED && echo -en $DEL
    echo -en "-------0" && sleep $SPEED && echo -en $DEL
    echo -en "------0-" && sleep $SPEED && echo -en $DEL
    echo -en "-----0--" && sleep $SPEED && echo -en $DEL
    echo -en "----0---" && sleep $SPEED && echo -en $DEL
    echo -en "---0----" && sleep $SPEED && echo -en $DEL
    echo -en "--0-----" && sleep $SPEED && echo -en $DEL
    echo -en "-0------" && sleep $SPEED && echo -en $DEL
done
echo -en $DEL"        "$DEL
exit 0

Se lanza el proceso en segundo plano y la barra de progreso en función del PID del proceso
sleep 5s & progbar $!

Se puede incluir como función en un script o usarse de forma externa (como está en este ejemplo)

El siguiente ejemplo es una versión modificada algo más personalizable en la que se puede pasar como parámetro la longitud deseada de la barra.

#!/bin/bash
# una barra de progreso en bash
# por ratoncio
# ver. 0.2

if [ $# -gt 1 ];then
    BARLENGTH=`echo $2-1|bc`
    SPEED=0.1
    DELCAR="\\x08"
    PID=$1
    BARCAR="-"
    CAR="0"
    CONT=0
    SWITCH=0
    for i in `seq 0 $BARLENGTH`;do
        BAR=$BAR$BARCAR
        DEL=$DEL$DELCAR
    done
    
    while [ -d /proc/$PID ];do
        if [ $SWITCH -eq 0 ];then
            echo -en "${BAR:0:$CONT}$CAR${BAR:$CONT+1:$BARLENGTH}" && sleep $SPEED && echo -en $DEL
            CONT=`echo $CONT + 1|bc`
        else
            echo -en "${BAR:0:$CONT}$CAR${BAR:$CONT+1:$BARLENGTH}" && sleep $SPEED && echo -en $DEL
            CONT=`echo $CONT - 1|bc`
        fi
        if [ $CONT -eq $BARLENGTH -o $CONT -eq 0 ];then
            if [ $SWITCH -eq 0 ];then
                SWITCH=1
            else
                SWITCH=0
            fi
        fi 
    done
    echo -en $DEL"        "$DEL
    exit 0
else
        echo "progbar <pid> <longitudbarra>"
        exit 1
fi

Se lanza el proceso en segundo plano y la barra de progreso en función del PID del proceso y de la longitud deseada (en el ejemplo, 10)
sleep 5s & progbar $! 10

Anuncios

seltxt: script para seleccionar un texto entre dos tokens

#!/bin/bash
# script para seleccionar texto entre dos tokens.
# por ratoncio
# selecc tokeninicio tokenfin ficheroseleccion
SELECCION=0
while read linea;do
    echo "$linea"|grep -q "$1"
    if [ $? -eq 0 ];then
        SELECCION=1
    fi
    if [ $SELECCION -eq 1 ];then
        echo "$linea"|grep -q "$2"
        if [ $? -eq 0 ];then
            SELECCION=0
        fi
        echo "$linea"
    fi
done < "$3"

Por ejemplo, para seleccionar una tabla dentro de un fichero html se haría así:

./seltxt "<table" "</table>" fichero.html

Análisis frecuencial de caracteres en un texto.

Esto lo usé hace poco para un juego de romper una criptografía muy básica.
El alfabeto básico se guarda en el fichero alf y el fichero a analizar en fich.

Generar el alfabeto:

echo {a..z}|sed 's/\ /\n/g' > alf

Genera el alfabeto básico inglés.

Sustituir letras con tilde:

cat fich|sed 's/á/a/g' > fich2;mv fich2 fich
cat fich|sed 's/Á/A/g' > fich2;mv fich2 fich

Se hace lo mismo con el resto de vocales con tilde.

Análisis frecuencial:

while read linea;do echo -en "$linea: ";cat fich|grep -io "$linea"|wc -l;done<alf

En inglés y español la letra e tiene estadísticamente el mayor número de apariciones.

Contar los espacios del texto:

cat fich| grep -o " "|wc -l