Eu não usaria grep
usaria perl
:
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
my %values = do { local $/; <> } =~ m/(\w+\@\w+).*?hl:load_avg=([\d\.]+)/gms;
print Dumper \%values;
print $values{'abax55@lp55cs008'}
Eu provavelmente posso refiná-lo se você puder fornecer um formato de registro mais específico. Mas você pode analisar toda a estrofe em um bloco com bastante facilidade, porque cada novo 'bloco' não tem espaços em branco no início (é ainda mais fácil se houver um delimitador claro entre os registros, como uma linha em branco, mas sem ver sua saída não posso dizer o que isso seria).
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
my $current_host = '';
my %values;
#<> reads stdin or files specified on command line.
#if that doesn't work for you, you can "open" a specific file, or
#use qx() or backticks to run a a command.
while ( <> ) {
#match a regex and capture the result if it's valid.
if ( m/^(\w+\@\w+)/ ) { $current_host = $1 };
#lines that start with whitespace are the values.
if ( m/^\s+(\w+:\w+)=([\d\.]+)/ ) {
#$1 and $2 are captured via the brackets
$values{$current_host}{$1} = $2;
}
}
#for debug:
print Dumper \%values;
#to print a specific key:
my $target_key = 'hl:load_avg';
foreach my $host ( sort keys %values ) {
print "$host - $target_key=",$values{$host}{$target_key},"\n";
}