martes, 20 de enero de 2015

Buscador para archivos base de datos CVS

   Hola, de nuevo con un script en bash. Es muy simple, sirve para buscar dentro de un archivo CVS en texto plano separados por algún caracter especial, bien "#", ";", etc.. depende de como lo hayamos construido o exportado desde Excall por ejemplo, vete a saber...
 
  El procedimiento es el siguiente:
En esta primera pantalla una vez lo hemos ejecutado con
$ sh busca.sh
o bien
$ ./busca.sh
si le hemos dado permisos de ejecucion   "chmon +x busca.sh"
Se trata de escribir el path incluido el archivo en la entrada para texto, pero se puede ir autocomplementando con la barra espaciadora una vez de ha metido los dos o tres primeros caracteres del directorio o archivo. Una vez pillado el funcionamiento es bastante sencillo. A continuación se trata de :
elegir el separador que tenemos en nuestro archivo de base de datos, en este caso es un ",", pero se trata de introducir el que tenemos como separador de campos en nuestro archivo. Despues:
Metemos la cadena a buscar en nuestra base de datos, puede ser un nombre (como en este caso), un teléfono, ciudad, etc... depende de lo que queramos buscar ¿verdad?:

En esta pantalla elegimos las campos que queremos que nos muestre la búsqueda, como máximo son 9, aunque el archivo tenga mas campos, solo elegir hasta 9, y son muchos!!! mejor dos a tres, solo lo que nos interese.
Y nos dará la salida de la búsqueda, simple....
Y aquí el codigo:

#!/bin/bash

# (c) sierra21
function archivo(){
FILE=`dialog --stdout --title "Por favor elige un archivo" --fselect $HOME/ 14 48`
case $? in
 0)
        if [ -f $FILE ];then
            clear
        else
            archivo
        fi
;;
 1)
  echo "Cancel presionado."
        exit 0
;;
 255)
  echo "Caja cerrada."
        exit 0
;;
esac
}

function separador(){
SEPA=`dialog --stdout --title "Elije el separador de campos del archivo" --inputbox "Elije separador" 0 0 ""`
case $? in
 0)
        if [ -z $FILE ];then
            separador
        else
            clear
        fi
;;
 1)
  echo "Cancel presionado."
        exit 0
;;
 255)
  echo "Caja cerrada."
        exit 0
;;
esac
}

function busqueda(){
BUSQUEDA=`dialog --stdout --title "Texto a buscar en el archivo" --inputbox "Texto" 0 0 ""`
case $? in
 0)
        if [ -z $BUSQUEDA ];then
            busqueda
        else
            clear
        fi
;;
 1)
  echo "Cancel presionado."
        exit 0
;;
 255)
  echo "Caja cerrada."
        exit 0
;;
esac
}

archivo
separador
busqueda

let campos=`cat $FILE | awk -F $SEPA '{ print NF }'|head -n 1`
campos_dialog="cat $FILE |head -n 1|awk -F $SEPA '{print "

for i in  $(seq 1 $campos) ; do
    campos_dialog=${campos_dialog}" \" $i \\\"\""\$$i" ""\"\\\"\"  \" on\"  "
done
campos_dialog=${campos_dialog}\}\'\|sed' '\'s/^\\s//\'
campos_final=$(eval ${campos_dialog})
campos_fin=`echo $campos_final |sed 's/\s/_/g'|sed 's/1_/1 /g'|sed 's/_on_2_/ on 2 /g'|sed 's/_on_3_/ on 3 /g'|sed 's/_on_4_/ on 4 /g'|sed 's/_on_5_/ on 5 /g'|sed 's/_on_6_/ on 6 /g'|sed 's/_on_7_/ on 7 /g'|sed 's/_on_8_/ on 8 /g'|sed 's/_on_9_/ on 9 /g'|sed 's/_on/ on/g'`

dialog --checklist "Que campos quieres ver de los registros? Max 9" 0 0 $campos $campos_fin 2> /tmp/salida.txt
#camp=`cat /tmp/salida.txt |awk -F " " '{ print NF }'`
read g g2 g3 g4 g5 g6 g7 g8 g9 <<<$(IFS=" "; echo `cat /tmp/salida.txt |sed 's/"//g'`)

parte=""
if [[ -n $g ]]; then
    parte=${parte}""\$$g"\"\t\""
fi
if [[ -n $g2 ]]; then
    parte=${parte}""\$$g2"\"\t\""
fi
if [[ -n $g3 ]]; then
    parte=${parte}""\$$g3"\"\t\""
fi
if [[ -n $g4 ]]; then
    parte=${parte}""\$$g4"\"\t\""
fi
if [[ -n $g5 ]]; then
    parte=${parte}""\$$g5"\"\t\""
fi
if [[ -n $g6 ]]; then
    parte=${parte}""\$$g6"\"\t\""
fi
if [[ -n $g7 ]]; then
    parte=${parte}""\$$g7"\"\t\""
fi
if [[ -n $g8 ]]; then
    parte=${parte}""\$$g8"\"\t\""
fi
if [[ -n $g9 ]]; then
    parte=${parte}""\$$g9"\"\t\""
fi
clear
echo "---------------------------------------------------------"
cat $FILE |grep -i "$BUSQUEDA" |awk -F $SEPA '{print '"$parte"'}'
echo "---------------------------------------------------------"


Esto es todo, un saludo, bye!

No hay comentarios:

Publicar un comentario