Yo sé eso
grep -rhI "# Active" > out.txt
generará cualquier línea que contenga # Active
el directorio buscado, pero quiero el contenido completo del archivo .txt, por ejemplo
ejemplo.txt
Line1
Line2
Line3 # Active
Line4
Line5
etc
Entonces, si busco, # Active
quiero que no solo genere la línea que # Active
contiene estos archivos .txt, sino también todas las demás líneas, por ejemplo.
salida.txt
Line1
Line2
Line3 # Active
Line4
Line5
etc
Respuesta1
Para versiones que no son GNU grep
, que es poco probable que tengan -z
, o si se requiere portabilidad...
grep -q pattern file && cat file
-q
suprime cualquier salida pero, como es habitual, el estado de salida se establece en función de si se encontró o no una coincidencia de patrón. Con una coincidencia de patrón, grep
se devuelve el código de éxito 0
que equivale averdaderoy eso permite cat
ejecutar el comando.
Respuesta2
Normalmente, grep solo mostrará la línea coincidente:
$ grep -rhI "# Active"
Line3 # Active
Para ver el archivo completo, agregue la -z
bandera:
$ grep -rhIz "# Active"
Line1
Line2
Line3 # Active
Line4
Line5
etc
-z
es una extensión GNU que le dice a grep que no use una nueva línea como separador de 'línea' sino que use un carácter NUL en su lugar. Dado que los archivos de texto generalmente no tienen caracteres NUL, esto tiene el efecto de indicarle a grep que lea el archivo completo como si fuera una sola 'línea'. En consecuencia, si hay una coincidencia, se imprime el archivo completo.
En las versiones BSD/OSX de grep, la opción de entrada NUL no está disponible y -z
significa algo más.
Las otras opciones de grep
-r
le dice a grep que busque archivos y directorios de forma recursiva.
-I
le dice a grep que ignore los archivos binarios
-h
le dice a grep que imprima la coincidencia sin el nombre del archivo adjunto.
Respuesta3
sed
alternativa:
sed -e 'H;1h;/PATTERN/!d;x;:do' -e 'n;b do' infile
Este script funciona acumulando líneas en el h
búfer antiguo (y eliminándolas) hasta que se encuentra una línea coincidente, momento en el que x
cambia los búferes y se ejecuta n
(es decir, imprime y obtiene la siguiente línea) hasta que no hay más entradas.
Respuesta4
Si desea hacerlo en varios archivos:
cat `grep -rIl "# Active" *`
Grep devolverá la lista de nombres de archivos y cat los imprimirá.