
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>3
encontrará 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.