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 grep
para poder usar la --after-context
opción (o --before-context
, o --context
).
-v
no es viable aquí, ya que niega todos los patrones que paso al grep
usar la -e
opció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
ack
Sugeriría usar awk en su lugar, ya que maneja IO multilínea mejor. Ya sea 1) canalizar los resultados a awk GNU con
--\n
como 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=1
y$1
compara para comparar solo con la primera línea.opcion 2
fuente
ignore me
en el archivo entonces, awk no funciona--\n
delimitador 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.