Grep mantiene (genera) el archivo .txt completo si una línea contiene una cadena

Grep mantiene (genera) el archivo .txt completo si una línea contiene una cadena

Yo sé eso

grep -rhI "# Active" > out.txt 

generará cualquier línea que contenga # Activeel directorio buscado, pero quiero el contenido completo del archivo .txt, por ejemplo

ejemplo.txt

Line1 
Line2
Line3 # Active
Line4
Line5
etc

Entonces, si busco, # Activequiero que no solo genere la línea que # Activecontiene 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

-qsuprime 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, grepse devuelve el código de éxito 0que equivale averdaderoy eso permite catejecutar el comando.

Respuesta2

Normalmente, grep solo mostrará la línea coincidente:

$ grep -rhI "# Active"
Line3 # Active

Para ver el archivo completo, agregue la -zbandera:

$ grep -rhIz "# Active"
Line1 
Line2
Line3 # Active
Line4
Line5
etc

-zes 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 -zsignifica algo más.

Las otras opciones de grep

-rle dice a grep que busque archivos y directorios de forma recursiva.

-Ile dice a grep que ignore los archivos binarios

-hle dice a grep que imprima la coincidencia sin el nombre del archivo adjunto.

Respuesta3

sedalternativa:

sed -e 'H;1h;/PATTERN/!d;x;:do' -e 'n;b do' infile

Este script funciona acumulando líneas en el hbúfer antiguo (y eliminándolas) hasta que se encuentra una línea coincidente, momento en el que xcambia 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á.

información relacionada