Eu suponho que você tenha um arquivo com as várias strings que você está procurando. Algo parecido com isto:
fck=35 fmd
fck=78 fcv
bnv=12 fcv
Para cada um desses, você deseja pesquisar o arquivo e, se uma linha corresponder a qualquer um dos padrões, você deseja o primeiro valor fmd
após a string correspondente. Se assim for, eu faria isso em perl da seguinte forma:
#!/usr/bin/env perl
## Open the list of search patterns.
## The script expects it to be the 1st argument.
open(my $list,"$ARGV[0]");
## Read the file and save the patterns
## in the %pat hash.
while (<$list>) {
## remove trailing newlines
chomp;
## separate the search pattern from the target
my @fields=split(/\s+/);
## Save the search pattern and accompanying target in
## in the hash (%pats).
$pats{$fields[0]}=$fields[1];
}
## Open the list of search patterns.
## The script expects it to be the 2nd argument.
open(my $file,"$ARGV[1]");
## Read the file
while (<$file>) {
## split the line on ';' into the @fields array
my @fields=split(/;/);
## This is the string that will be printed for
## the current line.
my $outstring="";
## Check each of the search patterns against
## each of the fields.
foreach my $pat(keys(%pats)) {
## Add the pattern to the outstring
$outstring.="$pat;";
## save all all 1st fmd values that follow
## this pattern.
my @matches= ( /$pat.+?($pats{$pat}=[^;]+)/g );
## Add this pattern's matches to the output string.
$outstring.= join(";",@matches) . ";";
}
## Print the output string for this line
print "$outstring\n";
}
Se você salvar o script acima como, por exemplo, parser.pl
no seu $PATH
e torná-lo executável ( chmod 755 ~/bin/parser.pl
), poderá executá-lo da seguinte forma:
$ parser.pl list.txt file.txt
bnv=12;;fck=35;fmd=1422745568,;fck=78;;
bnv=12;;fck=35;fmd=1421428238,;fck=78;;
bnv=12;;fck=35;fmd=1421687191 fmd=1111111111;fck=78;fcv=de724a544277d79c14d19809fe51ab71;