Consulta Shell Script

Temas sobre programación ( php, c, sql, html, perl, python, ruby, java, bash, etc ) y recursos ( herramientas, frameworks, hosting, cms, etc )

Moderadores: akodo, maiku

Responder
ServH
Forista Nuevo
Forista Nuevo
Mensajes: 3
Registrado: Mié Mar 28, 2012 11:48 am

Consulta Shell Script

Mensaje por ServH » Mié Mar 28, 2012 11:59 am

Hola, me pongo en contacto con esta comunidad porque me hayo estancado en un proyecto y no encuentro la manera de solucionar dicha tarea.
Os paso a explicar con detalle cual es mi objetivo, como voy, y que tipo de necesidad tengo.

He desarrollado un script que para comparar archivos de diferentes directorios y que este obtenga aquel que se parezca según los parámetros que yo le he añadido.

Este script al finalizar me entrega un fichero que yo llamo datos.txt y en el me pasa una linea como la siguiente

Código: Seleccionar todo

Files 2.0.1-RC1/wp-includes/js/tinymce/langs/en.js and 2.0.4/wp-includes/js/tinymce/langs/en.js differ
Ahora lo que yo quiero hacer mediante cut, es cortar las lineas de la siguiente forma: Quiero conseguir que simplemente me saque la versión, que en este caso sería 2.0.1-RC1 quiero que me saque el directorio, /wp-includes/.../langs/en.js y después quiero hacer un cheksum de dicho archivo. Todo eso lo se hacer, mi problema viene cuando quiero transformar todo esto en un bucle que me recorra linea por linea y me saque lo que necesito a otro archivo que quedará de la siguiente forma. VERSION | RUTA | MD5

Si me podeís iluminar un poco el camino os lo agradeceré muchísimo.

Un saludo a la comunidad. Gracias de antemano.
Avatar de Usuario
mcun
Administrador
Administrador
Mensajes: 3888
Registrado: Lun Abr 19, 2010 12:30 am
Ubicación: En una de las nalgas del culo del mundo (según la Bersuit Vergarabat)
Contactar:

Re: Consulta Shell Script

Mensaje por mcun » Mié Mar 28, 2012 5:39 pm

Hola ServH, bienvenido a Espacio Linux

Por lo que cuentas tu problema o bien es de diseño o un problema de implementación.

Dos cosas se me ocurren, o los datos no tiene un patrón único, osea que las lineas no tienen el mismo formato o no estas implementando bien el bluce.

para el diseño, es necesario que sepas que tan consistentes son los datos. para saber como extraerlos.

Digamos que para extraer los datos separando la cadena por los / deberías tener siempre la misma cantidad de /
De lo contrario los resultados son inconsistentes.

Otra opción son las expresiones regulares, estas son mas fiables, aunque mas trabajosas.


En cuanto al diseño es deseable que programes funciones que hagan una sola cosa y que la hagan bien,
esto significa que tu deberías tener una función que extraiga los datos recibiendo un parámetro ( una ruta al fichero por ej ) y
luego meterla en el bluce.

si pones el código completo del script y datos.txt sera mas fácil ayudarte.
Los programadores de verdad no documentan. La documentación es para los idiotas que no pueden leer un volcado de memoria.

Trusted Network and Developer | Lee el Reglamento !! |WIKI-EL | Twitter @mr_mcun
Debian + TTY | ArchLinux + awesome | openSUSE + Gnome-Shell | Linux User #508809
ServH
Forista Nuevo
Forista Nuevo
Mensajes: 3
Registrado: Mié Mar 28, 2012 11:48 am

Re: Consulta Shell Script

Mensaje por ServH » Vie Mar 30, 2012 9:49 am

Voy a mostraros un poco hasta donde tengo avanzado.

Esto es el contenido del fichero diffs.

Código: Seleccionar todo

Files 2.0.1-RC1/wp-includes/js/tinymce/langs/en.js and 2.0.4/wp-includes/js/tinymce/langs/en.js differ
Files 2.0.1-RC1/wp-includes/js/tinymce/plugins/wordpress/langs/en.js and 2.0.4/wp-includes/js/tinymce/plugins/wordpress/langs/en.js differ
Only in 2.0.7-RC2/wp-includes/js/tinymce/plugins/inlinepopups: editor_plugin.js
Only in 2.0.7-RC2/wp-includes/js/tinymce/plugins/inlinepopups: editor_plugin_src.js
Only in 2.0.7-RC2/wp-includes/js/tinymce/plugins/inlinepopups: readme.txt
Files 2.0.11-RC3/wp-includes/js/colorpicker.js and 2.1/wp-includes/js/colorpicker.js differ
Only in 2.1/wp-includes/js: crop
Files 2.0.11-RC3/wp-includes/js/dbx.js and 2.1/wp-includes/js/dbx.js differ
Only in 2.0.11-RC3/wp-includes/js: dbx-key.js
Files 2.0.11-RC3/wp-includes/js/fat.js and 2.1/wp-includes/js/fat.js differ
Only in 2.1/wp-includes/js: prototype.js
Files 2.0.11-RC3/wp-includes/js/quicktags.js and 2.1/wp-includes/js/quicktags.js differ
Only in 2.1/wp-includes/js: scriptaculous
Files 2.0.11-RC3/wp-includes/js/tinymce/langs/en.js and 2.1/wp-includes/js/tinymce/langs/en.js differ
Files 2.0.11-RC3/wp-includes/js/tinymce/license.txt and 2.1/wp-includes/js/tinymce/license.txt differ
Files 2.0.11-RC3/wp-includes/js/tinymce/plugins/autosave/editor_plugin.js and 2.1/wp-includes/js/tinymce/plugins/autosave/editor_plugin.js differ
Files 2.0.11-RC3/wp-includes/js/tinymce/plugins/autosave/editor_plugin_src.js and 2.1/wp-includes/js/tinymce/plugins/autosave/editor_plugin_src.js differ
Only in 2.0.11-RC3/wp-includes/js/tinymce/plugins/autosave/langs: cs.js
Files 2.0.11-RC3/wp-includes/js/tinymce/plugins/autosave/langs/en.js and 2.1/wp-includes/js/tinymce/plugins/autosave/langs/en.js differ
Only in 2.0.11-RC3/wp-includes/js/tinymce/plugins/autosave/langs: sv.js
Files 2.0.11-RC3/wp-includes/js/tinymce/plugins/directionality/editor_plugin.js and 2.1/wp-includes/js/tinymce/plugins/directionality/editor_plugin.js differ
Files 2.0.11-RC3/wp-includes/js/tinymce/plugins/directionality/langs/en.js and 2.1/wp-includes/js/tinymce/plugins/directionality/langs/en.js differ
Files 2.0.11-RC3/wp-includes/js/tinymce/plugins/inlinepopups/css/inlinepopup.css and 2.1/wp-includes/js/tinymce/plugins/inlinepopups/css/inlinepopup.css differ
Only in 2.1/wp-includes/js/tinymce/plugins/inlinepopups: editor_plugin.js
Files 2.0.11-RC3/wp-includes/js/tinymce/plugins/inlinepopups/jscripts/mcwindows.js and 2.1/wp-includes/js/tinymce/plugins/inlinepopups/jscripts/mcwindows.js differ
Only in 2.1/wp-includes/js/tinymce/plugins: paste
Only in 2.1/wp-includes/js/tinymce/plugins: spellchecker
Files 2.0.11-RC3/wp-includes/js/tinymce/plugins/wordpress/editor_plugin.js and 2.1/wp-includes/js/tinymce/plugins/wordpress/editor_plugin.js differ
Files 2.0.11-RC3/wp-includes/js/tinymce/plugins/wordpress/images/help.gif and 2.1/wp-includes/js/tinymce/plugins/wordpress/images/help.gif differ
Only in 2.1/wp-includes/js/tinymce/plugins/wordpress/images: toolbars.gif
Files 2.0.11-RC3/wp-includes/js/tinymce/plugins/wordpress/langs/en.js and 2.1/wp-includes/js/tinymce/plugins/wordpress/langs/en.js differ
Only in 2.1/wp-includes/js/tinymce/plugins/wordpress: popups.css
Esto es solo una muestra contiene mas comparaciones, pero para que os hagais una idea.

Y esto que os pego ahora es el script que yo he empezado hacer.

Código: Seleccionar todo

#! /bin/bash

while read line
do
	version= cut -d " " -f 2
	direc= cut -d "/" -f 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
done < "wp-diffs"
Esta recien empezado, pero tampoco se salir mucho mas de ahi, se que me falta un grep para quitarle el Files, y algunos parametros mas, quería probar el sed, pero esque voy perdido.

Necesito por ahora, que solamente me separe el texto, se quede por un lado la version y por otro el directorio, y eso despues volcarlo a otro fichero nuevo, eso es relativamente sencillo no tengo problema.

Si de esta forma queda mas claro agradeceré cualquier guia.

Un saludo.
Avatar de Usuario
neurus
Forista Legendario
Forista Legendario
Mensajes: 1801
Registrado: Dom Oct 10, 2004 7:00 am

Re: Consulta Shell Script

Mensaje por neurus » Vie Mar 30, 2012 10:31 am

No voy a pelearme con todo el script. Sólo te muestro cómo sacar la versión por un lado y el directorio por otro. Supongamos que el archivo "archivo.txt" tiene esta línea:

Código: Seleccionar todo

Files 2.0.1-RC1/wp-includes/js/tinymce/langs/en.js and 2.0.4/wp-includes/js/tinymce/langs/en.js differ
Lo que hace falta es cambiar el delimitador por defecto (tabulador). Usamos como delimitador (-d) la barra diagonal y ordenamos imprimir el primer campo (-f de field).

Código: Seleccionar todo

cut -d / -f 1   archivo.txt
Resultado:

Código: Seleccionar todo

Files 2.0.1-RC1
Y ahora debes decidir entre un trabajo fino (contando las barras, restándole uno y luego usar esa variable como el número máximo de campos, o hacerlo a lo bestia:
Ejemplo a lo bestia (difícilmente haya un directorio con 100 niveles de profundidad).

Código: Seleccionar todo

cut -d / -f 2-100 archivo.txt
Resultado:

Código: Seleccionar todo

wp-includes/js/tinymce/langs/en.js and 2.0.4/wp-includes/js/tinymce/langs/en.js differ
Edit:
Veo que hay un "differ" al final, que probablemente no debería aparecer. Si más o menos tienes bajo control qué términos aparecerán al final, puedes eliminarlos con sed:

Código: Seleccionar todo

cut -d / -f 2-100   archivo.txt|sed  s/differ//g
O también con awk (en realidad, todo esto podía hacerse con awk, pero tú querías cut):

Código: Seleccionar todo

cut -d / -f 2-100  archivo.txt|awk '{print $1}'
O también con un segundo cut:

Código: Seleccionar todo

cut -d / -f 2-100   archivo.txt|cut -d " " -f 1
resultado:

Código: Seleccionar todo

wp-includes/js/tinymce/langs/en.js
Como imprime a partir del segundo campo, le falta la barra inicial. Supongo que sabes cómo agregarla, si hiciera falta.
En fin, que te diviertas.
ServH
Forista Nuevo
Forista Nuevo
Mensajes: 3
Registrado: Mié Mar 28, 2012 11:48 am

Re: Consulta Shell Script

Mensaje por ServH » Vie Mar 30, 2012 11:02 am

Muchísimas gracias neurus

Más o menos tenía en un papel planteado varios cut para probar de esa forma. No te preocupes por lo del diff y demás cosas que no deberían aparecer, eso lo tengo claro, simplemente necesitava ver como dejaba limpia la línea, pudiendo coger aquello que considero necesario.

Con estos datos me doy por ayudado, podeís poner si así lo creeis conveniente el tema por solucionado.


Gracias de nuevo por el trabajo desinteresado que mostraís.
Avatar de Usuario
neurus
Forista Legendario
Forista Legendario
Mensajes: 1801
Registrado: Dom Oct 10, 2004 7:00 am

Re: Consulta Shell Script

Mensaje por neurus » Vie Mar 30, 2012 12:18 pm

Nota: no había visto tu script de ejemplo (pensé que el script era el ladrillo interminable de arriba, y lo pasé por alto).

En tu ejemplo, me parece que no eres consciente de que estás enviando los resultados a dos variables, por lo que, a menos que hagas inemdiatamente un echo $variable, el trabajo quedaría en nada: ninguna salida, ningún dato.

Aquí:
version= cut -d " " -f 2
Estás asignando el resultado de cut...etc, a la variable versión. Y me parece que ni siquiera lo estás haciendo bien, porque esa sintaxis es cuanto menos, sospechosa. Cuando se usa un comando en un contexto en el que se espera otra cosa, debe encerrárselo entre $() o ` ` (estos son acentos).
Y si debes enviar esa variable a alguna parte, deberías usar inmediatamente debajo (antes de reescribirla) un echo $version o echo $version >> archivodestino.txt.

Además, tal como está enunciado ese script va a funcionarte sólo una de las sentencias (o imprimes la versión o imprimes el directorio). Deberías dar un echo $line por cada sentencia.

En definitiva, el corazón del script, bien hecho, es así:

Código: Seleccionar todo

echo "$line"|cut -d / -f 1 >> version.txt
echo "$line" |cut -d / -f 2-100 |cut -d " " -f 1 >>directorio.txt
Luego es cuestión de limpiarlo (haciendo una prueba rápida con el texto que pasaste, veo muchas líneas y campos extra). Pero eso debería ser trivial.

Un truco útil: encabezar el script con #!/bin/sh -x te proporciona en la salida estandar datos útiles sobre qué está haciendo el script.

Y acabo de darme cuenta de que está el Files adelante, pero ya te mostré cómo se quita eso con un segundo cut.

Por cierto, la costumbre es que sea el propio usuario quien edite el título agregándole [solucionado].

Saludos.
Avatar de Usuario
mcun
Administrador
Administrador
Mensajes: 3888
Registrado: Lun Abr 19, 2010 12:30 am
Ubicación: En una de las nalgas del culo del mundo (según la Bersuit Vergarabat)
Contactar:

Re: Consulta Shell Script

Mensaje por mcun » Vie Mar 30, 2012 5:07 pm

ServH Si consideras que el tema fue resuelto, por favor edita el primer post y agrégale al título (SOLUCIONADO) para que la ayuda que recibiste le sea útil a otros usuarios mediante el uso del buscador. Muchas Gracias
Los programadores de verdad no documentan. La documentación es para los idiotas que no pueden leer un volcado de memoria.

Trusted Network and Developer | Lee el Reglamento !! |WIKI-EL | Twitter @mr_mcun
Debian + TTY | ArchLinux + awesome | openSUSE + Gnome-Shell | Linux User #508809
Responder
  • Similar Topics
    Respuestas
    Vistas
    Último mensaje