regex - varias - ¿Cómo puedo excluir una palabra con grep?
grep varios patrones (8)
Entendí la pregunta como "¿Cómo coincido una palabra pero excluyo otra?", Para la cual una solución es dos errores en serie: primero grep para encontrar la "palabra1" deseada, segundo grep excluyendo "palabra2":
grep "word1" | grep -v "word2"
En mi caso: necesito diferenciar entre "plot" y "#plot" que la opción de "palabra" de grep no sirve ("#" no es alfanumérico).
Espero que esto ayude.
Necesito algo como:
grep ^"unwanted_word"XXXXXXXX
Invertir coincidencia utilizando grep -v:
grep -v "unwanted word" file pattern
La opción -v
le mostrará todas las líneas que no coinciden con el patrón.
grep -v ^unwanted_word
La solución correcta es usar grep -v "word" file
, con su equivalente awk
:
awk ''!/word/'' file
Sin embargo, si tiene una situación más compleja en la que desea, digamos, que XXX
aparezca y que YYY
no aparezca, entonces awk
es útil en lugar de colocar varias grep
s:
awk ''/XXX/ && !/YYY/'' file
# ^^^^^ ^^^^^^
# I want it |
# I don''t want it
Incluso se puede decir algo más complejo. Por ejemplo: quiero esas líneas que contienen XXX
o YYY
, pero no ZZZ
:
awk ''(/XXX/ || /YYY/) && !/ZZZ/'' file
etc.
Si su grep
admite la expresión regular de Perl con la opción -P
, puede hacerlo (si bash; si tcsh necesitará escapar de la !
):
grep -P ''(?!.*unwanted_word)keyword'' file
Manifestación:
$ cat file
foo1
foo2
foo3
foo4
bar
baz
Ahora vamos a enumerar todos foo
excepto foo3
$ grep -P ''(?!.*foo3)foo'' file
foo1
foo2
foo4
$
También puedes hacerlo usando la opción -v
de grep como:
grep -v "unwanted_word" file | grep XXXXXXXX
grep -v "unwanted_word" file
filtrará las líneas que tienen la grep XXXXXXXX
y grep XXXXXXXX
mostrará solo las líneas con el patrón XXXXXXXX
.
EDITAR:
A partir de su comentario, parece que desea enumerar todas las líneas sin la unwanted_word
. En ese caso todo lo que necesitas es:
grep -v ''unwanted_word'' file
Tengo un directorio con un montón de archivos. Quiero encontrar todos los archivos que NO contienen la cadena "speedup", por lo que usé con éxito el siguiente comando:
grep -iL speedup *
grep proporciona la opción ''-v'' o ''--invert-match'' para seleccionar líneas no coincidentes.
p.ej
grep -v ''unwanted_pattern'' file_name
Esto dará salida a todas las líneas del archivo nombre_archivo, que no tiene ''patrón_deshecho no deseado''.
Si está buscando el patrón en varios archivos dentro de una carpeta, puede usar la opción de búsqueda recursiva de la siguiente manera
grep -r ''wanted_pattern'' * | grep -v ''unwanted_pattern''
Aquí grep intentará enumerar todas las apariciones de ''wanted_pattern'' en todos los archivos dentro del directorio actual y lo pasará al segundo grep para filtrar el ''unwanted_pattern''. ''|'' - pipe le dirá al shell que conecte la salida estándar del programa izquierdo (grep -r ''wanted_pattern'' *) a la entrada estándar del programa derecho (grep -v ''unwanted_pattern'').