grep patrón siguientes dos líneas y descartar el patrón con una línea

grep patrón siguientes dos líneas y descartar el patrón con una línea

Tengo un archivo parecido a este:

nombre del nombre: danan

CN: Danian

CN: danian1


nombre del nombre: danian2

CN: danian2


nombre del nombre: danian3

CN: danian3

CN: danian4

todo lo que quiero hacer es grep el patrón "dn:" e imprimir solo las 2 líneas siguientes, pero cuando ejecuto grep -A 2 "dn:" el resultado es todo lo que está en el archivo, solo quiero imprimir las 2 líneas siguientes no la siguiente 1 línea

Respuesta1

Esto podría funcionar:

$ awk -v RS="dn: " -v FS="\n" -v ORS="" 'NF>3 {print "dn:",$0}' input.txt

Lo definimos dn:como separador de registros. Los campos de un registro están delimitados por un carácter de nueva línea \n.

En caso de que tenga dos líneas después de una línea que comienza con dn:, antes de que un nuevo registro comience con dn:, tendrá 3 veces un "\n" que conducirá a 4 campos en el registro. Por eso comprobamos si hay más de 3 campos en el registro ( NF>3). Si ese es el caso, imprimimos el registro completo, pero debemos anteponer el archivo dn:.

Tenga en cuenta que NF>3encontrará todos los registros con más de dos líneas siguientes en un registro. Si desea solo aquellos con dos exactos, cámbielo a NF==3.

Si los bloques están delimitados por una línea en blanco (como parece en uno de sus comentarios posteriores), utilice esto en su lugar:

$ awk -v RS="\n\n" -v FS="\n" -v ORS="\n\n" 'NF>2 {print $0}' input.txt

Respuesta2

Ejecuto el comando anterior y funciona perfectamente,

awk -v RS="\n\n" -v FS="\n" -v ORS="\n\n" 'NF>2 {print $0}' 

Los bloques delimitados están en blanco, funciona perfectamente.

información relacionada