grep excluir varias cadenas


116

Estoy tratando de ver un archivo de registro usando tail -fy quiero excluir todas las líneas que contienen las siguientes cadenas:

"Nopaging the limit is"`  and `"keyword to remove is"

Puedo excluir una cadena como esta:

tail -f admin.log|grep -v "Nopaging the limit is"

Pero, ¿cómo excluyo las líneas que contienen string1o string2.

Respuestas:


107

Dos ejemplos de filtrado de varias líneas con grep:

Pon esto en filename.txt:

abc
def
ghi
jkl

comando grep usando la opción -E con una tubería entre tokens en una cadena:

grep -Ev 'def|jkl' filename.txt

huellas dactilares:

abc
ghi

Comando usando la opción -v con tubería entre tokens rodeados por parens:

egrep -v '(def|jkl)' filename.txt

huellas dactilares:

abc
ghi

15
Me sorprende que nadie haya hablado sobre el grep -v -e def -e jklmétodo, que en mi humilde opinión es más claro…
Frizlab

4
O mejor aún: ¡ grep -Fv -e def -e jklque es aún más rápido!
Frizlab

11
Con el indicador -F, puede usar nuevas líneas como delimitadores en lugar de tuberías. Esto permite el uso de la salida del comando como filtro más fácilmente, por ejemplo:grep -vF $(pgrep myprocess)
Phlarx

45
grep -Fv -e 'Nopaging the limit is' -e 'keyword to remove is'

-F coincide con cadenas literales (en lugar de regex)

-v invierte el partido

-e permite múltiples patrones de búsqueda (todos literales e invertidos)


1
Esta es la respuesta correcta: la única que evita tanto las grep -vinstancias múltiples como el requisito artificial de una expresión regular (permite que las cadenas múltiples se especifiquen limpiamente en argumentos separados). Imagínense construir esa expresión regular mediante programación en un script para cadenas que podrían contener cualquier cosa ...
user2394284

En realidad, ninguna de estas son respuestas correctas porque al no pasar palabras clave para excluir, excluirá todo en lugar de nada.
Győri Sándor

37

Otra opción es crear una lista de exclusión, esto es particularmente útil cuando tiene una lista larga de cosas para excluir.

vi /root/scripts/exclude_list.txt

Ahora agregue lo que le gustaría excluir

Nopaging the limit is
keyword to remove is

Ahora use grep para eliminar líneas de su archivo de registro de archivos y ver la información no excluida.

grep -v -f /root/scripts/exclude_list.txt /var/log/admin.log

1
No me di cuenta de que podrías usar -vcon -f(o que este último incluso existía).
Sridhar Sarnobat

muy muy util!
samaspin

Tenga en cuenta que no tiene que crear un archivo temporal para la lista de exclusión. En bash puede utilizar la sustitución de procesos. Esto es útil si la lista de exclusión es algo dinámica y tendría que generarla antes de cada uso solo para usarla una vez:grep -v -f <(gen_exclusions.sh) /var/log/admin.log
Miroslav


15
tail -f admin.log|grep -v -E '(Nopaging the limit is|keyword to remove is)'

11

Puede usar grep regular como este:

tail -f admin.log | grep -v "Nopaging the limit is\|keyword to remove is"


1
Esta respuesta funcionó para mí en MacOSX. Escapar de la tubería es clave
Rebecca Dessonville

5

Los greps se pueden encadenar. Por ejemplo:

tail -f admin.log | grep -v "Nopaging the limit is" | grep -v "keyword to remove is"

1
El problema aquí es que en lugar de un proceso que se filtraría, tendría que ejecutar N procesos secuencialmente, donde cada uno de ellos filtra algo. Podría ralentizar las cosas significativamente.
Artem Oboturov
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.