[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Buscar cadena de caracteres en archivos desde la consola



El día 30 de enero de 2011 11:44, fernando sainz
<fernandojose.sainz@gmail.com> escribió:
> El día 30 de enero de 2011 15:54, Manuel Soto <mrsoto@yahoo.com> escribió:
>> El día 30 de enero de 2011 09:31, fernando sainz
>> <fernandojose.sainz@gmail.com> escribió:
>>> El día 30 de enero de 2011 12:16, Camaleón <noelamac@gmail.com> escribió:
>>>> El Sat, 29 Jan 2011 18:17:46 -0430, Manuel Soto escribió:
>>>>
>>>>> El 28 de enero de 2011 13:56, Camaleón escribió:
>>>>>>
>>>>>> El Fri, 28 Jan 2011 12:06:37 -0430, Orlando Nuñez escribió:
>>>>>>
>>>>>> > Quien pueda darme una mano, hace tiempo usaba de vez en cuando un
>>>>>> > comando en la consola para buscar cadena de caracteres en archivos,
>>>>>> > pero no encuentro el comando, alguien podria ser tan amable de
>>>>>> > indicarme como hacerlo
>>>>>>
>>>>>> Yo tengo guardado un "one-liner" para eso:
>>>>>>
>>>>>> # buscar texto en archivos
>>>>>> find /ruta/a/directorio/* -type f -exec grep -H 'texto' {} \;
>>>>>>
>>>>> Hola Camaleón
>>>>>
>>>>> Con este "one-liner" crearías demasiados procesos, quien sabe si el
>>>>> mayor esfuerzo será crear tantos procesos; para eso esta el xargs
>>>>> justamente, además, mientras hace el grep sigue buscando archivos en
>>>>> procesos paralelos
>>>>
>>>> Probemos...
>>>>
>>>> stt008:~# time find /var/log/* -type f -exec grep -H 'ttyS0' {} \;
>>>> (...)
>>>> real    0m0.097s
>>>> user    0m0.048s
>>>> sys     0m0.060s
>>>>
>>>>
>>>> stt008:~# time find /var/log/* -type f | xargs grep -H "ttyS0"
>>>> (...)
>>>> real    0m0.013s
>>>> user    0m0.012s
>>>> sys     0m0.004s
>>>>
>>>>
>>>> stt008:~# time grep -H "ttyS0" /var/log/*
>>>> (...)
>>>> real    0m0.009s
>>>> user    0m0.004s
>>>> sys     0m0.004s
>>>>
>>>>
>>>> Pues sí, es el más lento de todos :-)
>>>>
>>>> Saludos,
>>>>
>>>> --
>>>> Camaleón
>>>>
>>>>
>>>>
>>>
>>> No tan deprisa forastera...  :-)
>>>
>>>
>>> Olvidaste  que el sistema operativo usa cache de disco....
>>> (Repite esas pruebas en otro orden con la máquina reiniciada...)
>>>
>>> Saludos.
>>>
>>>
>>> --
>>
>> Ok, el tema se pone interesante
>>
>> Usemos el cache de lápiz antes del de disco (análisis previo)
>>
>> A) Tiempo del recorrido del(os) directorio(s) y archivos: es igual
>> para todos los modelos. Descartable
>>
>> B) Tiempo para levantar el find: sólo en los primeros dos modelos. En
>> el modelo 3 sólo habrá 1 grep lo que equivale a 1 find, por lo que
>> podríamos pensar en despreciar el tiempo B
>>
>> C) Tiempo para leer el archivo y buscar la cadena: Es igual en todos
>> los modelos por usar grep. Lo descartamos
>>
>
>
> Entiendo que este punto es el que cambia al estar un fichero en cache
> de memoria.
>
> No se tarda lo mismo en buscar en un archivo que ya esta en memoria
> que en uno que hay que leer desde el disco.
> Lo mismo pasará con un ejecutable, si el grep se invoca multiples
> veces ya estará en memoria después de la primera.
>
> Saludos.
>
>
>
>
>> D) Tiempo para levantar el grep y dar inicio y cierre del proceso:
>>    En el modelo 1 habrá tantos grep como archivos se encuentren
>>    En el modelo 2 habrá 1 grep por cada vez que la línea de comando
>> se haga grande. supongamos que caben el la línea de comando la palabra
>> grep y 10 archivos, se habría reducido a 10% las llamadas al grep. Hay
>> que agregar que cuando el xargs está consumiendo CPU preparando la
>> linea de comando y ejecutando al grep el find sigue buscando sin parar
>>
>> E) Tiempo para que el find escriba el nombre del archivo en el pipe y
>> el xargs lo lea. bastante despreciable
>>
>> F) Tiempo para levantar el xargs. Debe ser similar a 1* D
>>
>> Modelo 1: c + D * n
>> Modelo 2: c + D * 2 + E
>> Modelo 3: c
>>
>> Siendo:
>>   c = tiempo mínimo común
>>   n = número de archivos
>>
>> Con uno o 2 archivos el modelo 1 debe ser más rápido que el modelo 2.
>> Si sólo quieres hacer una búsqueda recursiva el modelo 3 debe ser el
>> más rápido
>>
>> Para hacer una operación X recursiva el modelo 2 es el más genérico y
>> rápido, por experiencia propia en miles de archivos, sólo que debes
>> manejar bien los nombres con espacios.
>>
>> MS
>>
>>
>> --

Si la máquina es mono usuario puedes desperdiciar el CPU haciendo uso
de Cache, caso contrario, lo mejor es hacer el menor número de
operaciones, por ejemplo, fork + exec

Todo depende del contexto, por ejemplo, tareas repetitivas (búsquedas)
en ambientes multiusuario o con carga importante de procesos
productivos

MS


Reply to: