Con grep, quiero seleccionar todas las líneas que coinciden con un patrón, y que no coinciden con otro patrón. Quiero poder usar una sola invocación de greppara poder usar la --after-contextopción (o --before-context, o --context).
-vno es viable aquí, ya que niega todos los patrones que paso al grepusar la -eopción.
Ejemplo
Quiero buscar líneas coincidentes needle, ignorando líneas coincidentes ignore me, con una línea de contexto siguiente.
Aquí está mi archivo de entrada:
one needle ignore me
two
three
four needle
five
La salida que quiero es:
four needle
five
Como puede ver, esta solución ingenua no funciona:
$ cat file | grep --after-context=1 needle | grep -v 'ignore me'
two
---
four needle
five

ackSugeriría usar awk en su lugar, ya que maneja IO multilínea mejor. Ya sea 1) canalizar los resultados a awk GNU con
--\ncomo separador de registro, o 2) hacer todo el juego en awk.Opción 1
Salida:
Tenga en cuenta que esta opción busca en todo el registro
ignore me, estableceFS=1y$1compara para comparar solo con la primera línea.opcion 2
fuente
ignore meen el archivo entonces, awk no funciona--\ndelimitador entre cada grupo coincidente, que no está allí si los grupos son adyacentes entre sí. La forma en que se deben manejar los grupos adyacentes es específica de la tarea, por lo que esto no es necesariamente incorrecto. La opción 2 no depende del separador y no se ve afectada.