grep padrão nas próximas duas linhas e descarte o padrão com uma linha

grep padrão nas próximas duas linhas e descarte o padrão com uma linha

Eu tenho um arquivo mais ou menos assim:

dn: danan

cn: Danian

cn: danian1


nome: danian2

cn: danian2


nome: danian3

cn: danian3

cn: danian4

tudo o que quero fazer é usar grep no padrão "dn:" e imprimir apenas as próximas 2 linhas, mas quando executo grep -A 2 "dn:" o resultado é tudo no arquivo, só quero imprimir as próximas 2 linhas não a próxima linha

Responder1

Isso pode funcionar:

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

Definimos dn:como um separador de registros. Os campos em um registro são delimitados por um caractere de nova linha \n.

Caso você tenha duas linhas seguindo uma linha começando com dn:, antes de um novo registro começar com dn:, você terá 3 vezes um "\n" levando a 4 campos no registro. É por isso que verificamos se existem mais de 3 campos no registro ( NF>3). Se for esse o caso, imprimimos o registro inteiro, mas precisamos acrescentar o arquivo dn:.

Observe que NF>3encontrará todos os registros com mais de duas linhas seguintes em um registro. Se você quiser apenas aqueles com exatamente dois, altere para NF==3.

Se os blocos forem delimitados por uma linha em branco (como parece em um de seus comentários posteriores), use isto:

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

Responder2

Eu executo o comando acima e funciona perfeitamente,

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

os blocos delimitados estão em branco, funciona perfeitamente.

informação relacionada