Estoy realmente sorprendido por la funcionalidad de GREP en shell, antes solía usar el método de subcadena en java, pero ahora uso GREP para ello y se ejecuta en cuestión de segundos, es tremendamente más rápido que el código java que solía escribir. (aunque según mi experiencia podría estar equivocado)
Dicho esto, no he podido averiguar cómo está sucediendo. tampoco hay mucho disponible en la web.
Puede alguien ayudarme con esto?
Respuestas:
Asumiendo que su pregunta se refiere
GNU grep
específicamente. Aquí hay una nota del autor, Mike Haertel:Esta respuesta es un subconjunto de la información extraída de aquí .
fuente
Para agregar a la excelente respuesta de Steve.
Puede que no sea muy conocido, pero grep casi siempre es más rápido cuando se busca una cadena de patrón más larga que una corta, porque en un patrón más largo, Boyer-Moore puede saltar hacia adelante en pasos más largos para lograr velocidades sublineales aún mejores :
Ejemplo:
¡La forma más larga es un 35% más rápida!
¿Cómo? Boyer-Moore construye una tabla de salto hacia adelante a partir de la cadena de patrones, y siempre que hay una falta de coincidencia, elige el salto más largo posible (del último carácter al primero) antes de comparar un solo carácter en la entrada con el carácter en la tabla de salto.
Aquí hay un video que explica a Boyer Moore (Crédito a kommradHomer)
Otro error común (para GNU grep) es que
fgrep
es más rápido quegrep
.f
infgrep
no significa 'rápido', significa 'fijo' (ver la página de manual), y dado que ambos son el mismo programa, y ambos usan Boyer-Moore , no hay diferencia de velocidad entre ellos cuando se busca fijo- cadenas sin caracteres especiales regexp. La única que usar la razónfgrep
es cuando hay un char especial expresión regular (como.
,[]
, o*
) No quiero que sea interpretado como tal. E incluso entoncesgrep -F
se prefiere la forma más portátil / estándar defgrep
.fuente
xs.txt
contiene 100000000 'x, y lo hacegrep yx xs.txt
, entonces en realidad no puede encontrar una coincidencia antes que si lo hacegrep yxxxxxxxxxxxxxxxxxxx xs.txt
. La mejora de Boyer-Moore-Horspool a Boyer-Moore mejora el salto adelante en ese caso, pero probablemente no serán solo tres instrucciones de máquina en el caso general.grep/fgrep/egrep
eran todos enlaces duros al mismo ejecutable se han ido. Ellos (y otras extensiones como lasz*grep
bz*grep
utilidades que se descomprimen sobre la marcha) son ahora pequeños envoltorios de shellgrep
. Algunos comentarios históricos interesantes sobre el cambio entre un solo ejecutable y envoltorios de shell se pueden encontrar en este compromiso: git.savannah.gnu.org/cgit/grep.git/commit/…