Se o seu grep
for compatível, você poderá usar a opção -z
para fazer com que o arquivo inteiro seja sugado:
$ grep -ozE 'define[^}]*host_name yyyyyyyyy991.+?}.' file
define host{
host_name yyyyyyyyy991
use aix-server
alias
hostgroups +bu-automotiveprd,screen-automotiveprd2
address YYY.YYY.YYY.YYY
}
As opções grep
usadas são (da página man
do GNU grep
):
-z, --null-data
Treat input and output data as sequences of lines, each terminated by a
zero byte (the ASCII NUL character) instead of a newline. Like the -Z or
--null option, this option can be used with commands like sort -z to
process arbitrary file names.
-o, --only-matching
Print only the matched (non-empty) parts of a matching line, with each
such part on a separate output line.
-E, --extended-regexp
Interpret PATTERN as an extended regular expression (ERE, see below).
A expressão regular procura a palavra define
, seguida por 0 ou mais caracteres que não }
( [^}]*
), depois host_name yyyyyyyyy991
e depois tudo até o primeiro }
( .+?
) mais o próximo caractere (o final .
) que corresponderá à nova linha.
Pessoalmente, no entanto, eu faria esse tipo de coisa usando o modo de parágrafo do perl:
$ perl -00 -ne 'print if /yyyyyyyyy991/' file
define host{
host_name yyyyyyyyy991
use aix-server
alias
hostgroups +bu-automotiveprd,screen-automotiveprd2
address YYY.YYY.YYY.YYY
}
O -00
informa perl
para ler o arquivo de entrada como parágrafos, portanto cada registro é um parágrafo (definido por 2 caracteres \n
consecutivos) em vez de uma linha. Então, o -ne
significa "Leia cada registro de entrada e aplique o script dado por -e
a ele". O próprio script simplesmente imprime todos os registros correspondentes ao padrão desejado.