Isto é bastante simples com, e. perl
se for uma opção. Analise o registro em pares de valores-chave e, em seguida, extraia / combine o campo desejado:
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
#set record separator to 'end bracket'.
local $/ = '}';
#iterate our data based on that delimiter.
#note - <> is a magic filehandle, in that it reads either pipe
#from stdin, or a file argument specified on command like (e.g. like awk/sed)
while (<>) {
#extract key-value pairs with a multi line regex for this 'block'
my %fields = m/(\w+)\s+(.*)$/gm;
print Dumper \%fields; #to see what we captured for debugging.
#test a particular field against a regex. Note - this matches
#both in your example.
if ( $fields{service_description} =~ m/Multi Lookup/ ) {
print "This record matches\n";
}
}
Cada registro acima é colocado em campos e é um perl
hash
contendo:
$VAR1 = {
'define' => 'service {',
'use' => 'standard_service_template',
'check_period' => '24x7',
'host_name' => 'dns_vips',
'service_description' => 'Multi Lookup ',
'active_checks_enabled' => '1',
'passive_checks_enabled' => '1',
'notification_interval' => '10',
'notification_period' => '24x7',
'contact_groups' => 'mailgrp',
'max_check_attempts' => '3',
'notifications_enabled' => '1',
'notification_options' => 'w,r,c',
'normal_check_interval' => '5',
'retry_check_interval' => '1'
};
Isso pode ser compactado em um único liner, se desejado, mas tenho que ser um pouco mais específico sobre o que você está realmente querendo como saída.
por exemplo.
perl -ne 'BEGIN { $/ = "}" } %f = m/(\w+)\s+(.*)$/gm; print if $f{service_description} =~ m/Multi Lookup/'
Ou talvez ainda mais simples:
perl -ne 'BEGIN { $/ = "}" } print if m/service_description.*Multi Lookup/'