Linux/Unix Shell Scripting - Consulta sobre script

 
Vista:

Consulta sobre script

Publicado por Alfonso (5 intervenciones) el 03/07/2008 12:44:04
Buenos Dias, tengo un pequeño problemilla con un script que tengo echo. El script tiene que recorrer un fichero de unas 250.000 lineas buscado unos valores en concreto. El script ya lo tengo echo pero el problema es que se eterniza recorriendo el fichero. Os pego parte del codigo que realiza este script y haber si alguien me puede decir como realizar este mismo proceso pero de una manera más productiva( o sea más rapida).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# <-- Inicio del Script
#!/bin/bash
nomfic=$1
fecha=$(date +%y-%m-%d)
# <-- Estos son los valores a buscar
valor1="valor1"
valor2="valor2"
valor3="valor3"
Valor4="valor4"
Valor5="valor5"
valor6="valor6"
valor7="valor7"
valor8="valor8"
valor9="valor9"
valor10="valor10"
valor11="valor11"
# <-- Iniciamos el recorrido por el fichero y vamos comprobado valores hasta encontrar los validos
while read line ; do
    echo ${line} | grep $valor1
    case $? in
        0)
            echo ${line} >> Resultado-$fecha.txt
        ;;
 
    esac
    echo ${line} | grep $valor2
    case $? in
        0)
            echo ${line} >> Resultado-$fecha.txt
        ;;
 
    esac
    echo ${line} | grep $valor3
    case $? in
        0)
            echo ${line} >> Resultado-$fecha.txt
        ;;
 
    esac
    echo ${line} | grep $valor4
    case $? in
        0)
            echo ${line} >> Resultado-$fecha.txt
        ;;
 
    esac
    echo ${line} | grep $valor5
    case $? in
        0)
            echo ${line} >> Resultado-$fecha.txt
        ;;
 
    esac
    echo ${line} | grep $valor6
    case $? in
        0)
            echo ${line} >> Resultado-$fecha.txt
        ;;
 
    esac
    echo ${line} | grep $valor7
    case $? in
        0)
            echo ${line} >> Resultado-$fecha.txt
        ;;
 
    esac
    echo ${line} | grep $valor8
    case $? in
        0)
            echo ${line} >> Resultado-$fecha.txt
        ;;
 
    esac
    echo ${line} | grep $valor9
    case $? in
        0)
            echo ${line} >> Resultado-$fecha.txt
        ;;
 
    esac
 
    echo ${line} | grep $valor10
    case $? in
        0)
            echo ${line} >> Resultado-$fecha.txt
        ;;
 
    esac
    echo ${line} | grep $valor10
    case $? in
        0)
            echo ${line} >> Resultado-$fecha.txt
        ;;
 
    esac
# <-- Contador de Lineas recorridas 
    echo $(( `cat cont` + 1 )) > cont
 
    echo "*******************"
    cat cont
 
# <-- Fichero pasado como parametro.
 
done <<< "`cat $nomfic`"

Pues lo que quiero es poder realizar este script pero que sea mas efectivo a la hora de recorrer el fichero.

Muchas Gracias por adelantado.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Consulta sobre script

Publicado por Manolo (8 intervenciones) el 04/07/2008 17:57:52
Como son solo 11 o digamos, una cantidad fija de string de caracteres a buscar te sugeriria hacer los siguientes ...

...
...
lista=`cat fichero.txt|grep $valor1 > archivo-valor1.txt`
lista=`cat fichero.txt|grep $valor2 > archivo-valor2.txt`
...
...
lista=`cat fichero.txt|grep $valor11 > archivo-valor11.txt`

No demora tanto si fichero.txt no es muy grande. No sera muy estetico pero funciona correctamente. Si te fijas, tus 11 resultados de búsquedas están en 11 archivos diferentes.

Espero te haya ayudado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Consulta sobre script

Publicado por Alfonso (5 intervenciones) el 07/07/2008 09:18:33
Gracias por la ayuda, pero necesito que me lo saque ordenado cronologicamente en un solo fichero.....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Consulta sobre script

Publicado por Iván Garcerant (27 intervenciones) el 09/07/2008 03:34:02
Saludos.

No te copio la idea muy bien... ¿te puedes explicar un poco mejor para poder ayudarte?

Por lo poco que entiendo parece que puedes hacer un script de Awk... con él vas a poder hacer el bucle sobre las líneas y tomar decisiones diferentes para cada línea en función de si coinciden o no con el valor (patrón) dado.

¿Podrías poner el planteamiento del problema?

Iván.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Consulta sobre script

Publicado por Alfonso (5 intervenciones) el 09/07/2008 08:39:10
OK, vamos a ver si explico la idea. Tengo un log generado por un programa, en el cual se van acumulando numerosas lineas ( tantas como unas 250.000 lineas a las 24 horas de uso) y necesito depurarlas buscando unos patrones. El tema viene cuando quiero mantener la cronologia, ya que con el actual script que tengo se eterniza en procesar ese numero de lineas.

No se si me habre explicado bien o no. Si no es asi dimelo. De todas formas voy a ver lo deL AWK que me dices para ver si me es valido. Un saludo y gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Consulta sobre script

Publicado por Iván Garcerant (27 intervenciones) el 09/07/2008 21:47:53
Saludos.

Con Awk (así como con Perl, Python o Ruby) vas a poder analizar el archivo línea a línea, con mayor libertad sobre lo que hagas en cada una de ellas. También, por ser Awk una herramienta especifica de esta tarea, te va a resultar más sencillo su uso que cualquiera de los otros lenguajes que te menciono y por supuesto, tendrás mejores tiempos de respuesta que la versión de Shell Script.

La estructura del lenguaje Awk es en verdad simple: parejas /patrón/ {código} Te pongo un ejemplo:

#!/usr/bin/awk -f

/ivan/ {
#acciones para procesar una línea con "ivan"
}

/garcerant/ {
#acciones para procesar una línea con "garcerant"
}

#end.

Si bien el código es solo una sucesión de parejas patrón-acción, hay un bucle implícito en él. Veras, cuando se llama a este script (que has puesto en un archivo y dado permiso de ejecutable) lo puedes usar como filtro, a la manera de grep, sed o sort.

Awk abre el archivo y lo lee registro a registro. Si no dices lo contrario, un registro es una línea de texto. Cada registro es entonces comparado con el conjunto de patrones y para cada patrón que coincida se ejecuta la acción asociada.

Hay otros detalles a saber, como por ejemplo las estructuras de control, la salida formateada, los bloques BEGIN y END entre otros muchos detalles.

Te confieso, que a mí me gusta mucho el Awk y que por mucho tiempo todo lo hacía en él. De hecho me mantuve tanto tiempo en este lenguaje que nunca le vi verdadero uso a Perl el cual incluso hoy en día, utilizo muy poco.

Bueno, cualquier cosa pregunta. En tanto tenga visitas de aquí al blog me voy a acordar de visitar este foro... que me está empezando a gustar en verdad.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Consulta sobre script

Publicado por Alfonso (5 intervenciones) el 10/07/2008 09:19:24
Pues muchas gracias, Ivan la verdad que la explicacion es estupenda. Voy a probar y comento resultados. Gracias de nuevo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Consulta sobre script

Publicado por Alfonso  (5 intervenciones) el 11/07/2008 13:05:43
Es aco......., un fichero como el que antes yo tarda en procesar varias horas con mi script, con el awk se lo come en 10 seg. Increible. Muchas gracias de nuevo a todos. Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar