Estoy intentando crear una búsqueda grep que deba incluir el término y excluir otro término. Intento utilizar varias opciones de "patrón" -E pero no ha funcionado.
Aquí hay un ejemplo de un comando que probé.
grep -Ei "\,17\:31" | grep -Eiv "10\.10\.210\.154" file.csv
pero los resultados de salida solo coinciden con la segunda restricción grep -Eiv "10.10.210.154"
Respuesta1
Suponiendo que desea buscar \,17\:31
pero no desde IP10\.10\.210\.154
Puedes usar esto.
grep -Ei "\,17\:31" file.csv | grep -Eiv "10\.10\.210\.154"
Respuesta2
Nota:la otra respuestadebería funcionar pero no explica nada; De ahí mi respuesta explicativa.
Le dijiste al segundo grep
que leyera file.csv
, y así lo hace. Ignora su entrada estándar porque esto es lo que grep
hace cuando opera en archivos.
En efecto, el segundo grep
actúa como si el primero no estuviera allí. Sale después de procesar el archivo e imprimir su resultado (si corresponde).
El primero grep
espera entrada (normalmente desde el teclado, si se ejecuta en un shell interactivo). Puede tomar muchas líneas e incluso imprimir muchas líneas (coincidentes) en su salida estándar, hasta que el buffer de canalización decida pasar la salida al segundo grep
. Luego, si el segundo grep
ya no existe, grep
se notifica al primero que la tubería está rota; sale.
O puede presionar Ctrl+ Dpara indicar el final de la entrada; o puedes presionar Ctrl+ Cpara matar al primero grep
(y al segundo, si todavía está vivo). Pero esto no solucionará su flujo de datos.
Un flujo de datos adecuado es así: necesita que el primero grep
lea el archivo y luego canalice el resultado al segundo:
grep -Ei "\,17\:31" file.csv | grep -Eiv "10\.10\.210\.154"
# or
<file.csv grep -Ei "\,17\:31" | grep -Eiv "10\.10\.210\.154"
Esta última sintaxis tiene al menos una ventaja, explicada al final deesta otra respuesta mia.