Com o GNU grep, você pode combinar dois recursos para obter o que deseja:
- a opção
-o
para imprimir apenas a parte correspondente da linha;
- Expressões regulares Perl e suas asserções de aparência de largura zero para limitar o que pode aparecer antes e depois do jogo.
zgrep -Pi -o '(?<=total time: )([0-9.]+)(?= *ms)' *
Como alternativa, você pode chamar Perl.
perl -MPerlIO::gzip -e 'for (@ARGV) {
open IN, (/\.gz$/ ? "<:gzip" : "<"), $_ or die "$_: $!";
$name = $_;
while (<IN>) {
if (/total time: ([0-9.]+) *ms/i) {print "$name:$1\n"}
}
close IN
}' *
Sem essas ferramentas, você pode iterar os arquivos manualmente e chamar sed
para retirar tudo, menos o que lhe interessa.
for x in *; do
case "$x" in
*.gz) <"$x" gunzip;;
*) cat "$x";;
esac | sed -n -e 's/^.*total time: \([0-9.]*\) *ms.*$//p'
done