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.