Respuestas:
Puede hacerlo usando la opción -v
(for --invert-match
) de grep como:
grep -v "unwanted_word" file | grep XXXXXXXX
grep -v "unwanted_word" file
filtrará las líneas que tienen unwanted_word
y grep XXXXXXXX
solo listará líneas con patrón XXXXXXXX
.
EDITAR:
Según su comentario, parece que desea enumerar todas las líneas sin el unwanted_word
. En ese caso, todo lo que necesitas es:
grep -v 'unwanted_word' file
-v 'unwanted_word' --after N
no ayuda porque INCLUYE la línea y N líneas después.
-v
o --invert-match
seleccione líneas no coincidentes. En tu caso grep -v 'unwanted_word' file
o grep --invert-match 'unwanted_word' file
.
git status -s |grep -v "folder_I_dont_care"
sun
, excepto cuando es así sunrise
, grep sun|grep -v sunrise
salta la línea que contiene ambos sun
y sunrise
al mismo tiempo, eso no es lo que quiero. grep -P 'sun(?!rise)'
es mucho mejor.
Entendí la pregunta como "¿Cómo hago coincidir una palabra pero excluyo otra?", Para lo cual una solución es dos greps en serie: primer grep encontrando la "palabra1" deseada, segundo grep excluyendo "word2":
grep "word1" | grep -v "word2"
En mi caso: necesito diferenciar entre "plot" y "#plot", que la opción "palabra" de grep no hará ("#" no es alfanumérico).
Espero que esto ayude.
word1
.
Si grep
admite la expresión regular de Perl con la -P
opción que puede hacer (si es bash; si es tcsh, deberá escapar de !
):
grep -P '(?!.*unwanted_word)keyword' file
Manifestación:
$ cat file
foo1
foo2
foo3
foo4
bar
baz
Hagamos ahora una lista de todos foo
exceptofoo3
$ grep -P '(?!.*foo3)foo' file
foo1
foo2
foo4
$
grep -v -P
también funciona sin negación en la expresión regular.
!
" . ¡Gracias, gracias, gracias! ¡Eso es lo que quería!
La solución correcta es usar grep -v "word" file
, con su awk
equivalente:
awk '!/word/' file
Sin embargo, si tiene una situación más compleja en la que desea, por ejemplo, XXX
aparecer y YYY
no aparecer, entonces awk
resulta útil en lugar de canalizar varios grep
s:
awk '/XXX/ && !/YYY/' file
# ^^^^^ ^^^^^^
# I want it |
# I don't want it
Incluso puedes 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.
grep -P
solución en archivos grandes.
grep -P
significa usar Perl regexp, por lo que cargar ese paquete será mucho más costoso de lo normal grep
.
grep proporciona la opción '-v' o '--invert-match' para seleccionar líneas no coincidentes.
p.ej
grep -v 'unwanted_pattern' file_name
Esto generará todas las líneas del archivo nombre_archivo, que no tiene 'patrón_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 desde el directorio actual y pasarlo al segundo grep para filtrar el 'unwanted_pattern'. '|' - pipe le dirá a 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').
Tengo un directorio con un montón de archivos. Quiero encontrar todos los archivos que NO contienen la cadena "speedup", así que utilicé con éxito el siguiente comando:
grep -iL speedup *
grep -Rv "word_to_be_ignored" . | grep "word_to_be_searched"