Extraindo apenas um único grupo de uma expressão regular

3

Estou tentando obter uma lista de números de alguns arquivos de log hackeados usando o zgrep. Então, estou usando:

zgrep -ie "total time: .* ms" *

Isso retorna toda a linha que me interessa. Eu apenas gostaria do número. (após o tempo total, mas antes do 'ms') Existe alguma maneira de obter essas informações sem processamento adicional?

    
por Jeremy 27.11.2013 / 01:36

2 respostas

4

Se o seu grep é o GNU grep e assumindo que o número que você está procurando é o único número na linha:

zgrep -ioEe '[0-9]+(\.[0-9]+)?' *

Se não, você sempre pode filtrar a saída de zgrep :

zgrep -ie 'total time: .* ms' * | sed 's/.*total time: \(.*\) ms.*//'
    
por 27.11.2013 / 01:39
0

Com o GNU grep, você pode combinar dois recursos para obter o que deseja:

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
    
por 28.11.2013 / 02:13