23 votos

grep para "término" y excluir "otro plazo"

Estoy tratando de construir un grep de búsqueda que busca un término, pero exludes líneas que tienen un segundo término. Yo quería usar múltiples -e "pattern" opciones, pero que no ha funcionado.

Aquí está un ejemplo de un comando que he intentado y el mensaje de error generado.

grep -i -E "search term" -ev "exclude term"
grep: exclude term: No such file or directory

Pareciera que para mí que el -v se aplica a todos los términos de búsqueda / patrones. Como este funciona, pero luego no incluir search term en los resultados.

grep -i -E "search term" -ve "exclude term"

37voto

Thor Puntos 3198

A y expresiones con grep se necesitan dos invocaciones:

grep -Ei "search term" | grep -Eiv "exclude term"

Si los términos que usted está buscando no son regulares las expresiones fijas cadena coincidente (-F) que es más rápido:

grep -F "search term" | grep -Fv "exclude term"

12voto

Dennis Puntos 31149

Corto de invocar grep dos veces, sólo hay una forma en que puedo pensar para lograr esto. Involucra Expresiones Regulares Compatibles con Perl (PCRE) y alguna de las más chapucero para mirar alrededor afirmaciones.

Para buscar foo excluyendo a los partidos que contienen bar, se puede utilizar:

grep -P '(?=^((?!bar).)*$)foo'

He aquí cómo funciona:

  • (?!bar) coincide con cualquier cosa que no bar sin consumir los caracteres de la cadena. A continuación, . consume un solo carácter.

  • ^((?!bar).)* repite lo anterior desde el inicio de la cadena (^) al final de la misma ($). Se producirá un error si bar se encuentra en cualquier punto dado, ya (?!bar) no coincidirá.

  • (?=^((?!bar).)*$) asegura que la cadena coincide con el patrón anterior, sin consumir los caracteres de la cadena.

  • foo busca foo como de costumbre.

He encontrado este hack en la expresión Regular para que coincida con la cadena no contiene una palabra?. En Bart Kiers de respuesta, usted puede encontrar una manera mucho más detallada explicación de cómo la negativa de look-ahead opera.

1voto

nelaar Puntos 3051

De mis experimentos no de costura para hacer una gran diferencia si usted tubo su excluir términos a través de la grep o sed. Sed tiene algunas otras útiles texto de reemplazo de características que utilizo a menudo para mejor filtro de la salida de la de los archivos de registro. Así que voy a usar sed como puedo combinar un buen número de filtros en sed.

wc /var/log/tomcat/tomcat.2013-01-14.registro.1 
1851725

 /usr/bin/time grep-i -E "(roles loginmanager)" /var/log/tomcat/tomcat.2013-01-14.registro.1 | sed-e "/login OK/d" -e "/Login vencida/d" | wc
24.05 usuario 0.15 sistema 0:25.27 transcurrido el 95% de la CPU (0avgtext+0avgdata 3504maxresident)k
0inputs+0outputs (0major+246minor)pagefaults 0swaps
 5614 91168 1186298

 /usr/bin/time grep-i -E "(roles loginmanager)" /var/log/tomcat/tomcat.2013-01-14.registro.1 | sed-e "/login OK/d" -e "/Login vencida/d" | wc
23.50 usuario 0.16 sistema 0:24.48 transcurrido el 96% de la CPU (0avgtext+0avgdata 3504maxresident)k
0inputs+0outputs (0major+246minor)pagefaults 0swaps
 5614 91168 1186298

 /usr/bin/time grep-i -E "(roles loginmanager)" /var/log/tomcat/tomcat.2013-01-14.registro.1 | grep -v -e "inicio de sesión ACEPTAR" -e "inicio de Sesión caducado" | wc
23.08 usuario 0.14 sistema 0:23.55 transcurrido el 98% de la CPU (0avgtext+0avgdata 3504maxresident)k
0inputs+0outputs (0major+246minor)pagefaults 0swaps
 5614 91168 1186298

 /usr/bin/time grep-i -E "(roles loginmanager)" /var/log/tomcat/tomcat.2013-01-14.registro.1 | grep -v -e "inicio de sesión ACEPTAR" -e "inicio de Sesión caducado" | wc
23.50 usuario 0.15 sistema 0:25.27 transcurrido el 93% de la CPU (0avgtext+0avgdata 3488maxresident)k
0inputs+0outputs (0major+245minor)pagefaults 0swaps
 5614 91168 1186298

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: