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.

Jeets
fuente

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
Eric Leschinski
fuente
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)

Wisbucky
fuente
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
rezizter
fuente
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
22
egrep -v "Nopaging the limit is|keyword to remove is"
Stefan Podkowinski
fuente
15
tail -f admin.log|grep -v -E '(Nopaging the limit is|keyword to remove is)'
hs.chandra
fuente
11

Puede usar grep regular como este:

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

Mikhail
fuente
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"
Fidel
fuente
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