Como posso extrair os números no arquivo usando sed ou qualquer outra ferramenta?

5

Eu tenho um arquivo com esse formato

[ 2014/05/01 10:48:26 | 13963 | DEBUG ] It took 11.16837501525879 seconds to complete the process

Portanto, tenho milhares de linhas como esta e gostaria de "extrair" a parte 11.16837501525879
Eu tentei:

 sed -e 's/^.* (\d+\.\d*)//g' logfile.txt > out.txt  

mas eu recebo:

sed: -e expression #1, char 21: invalid reference  on 's' command's RHS  

O que posso fazer aqui?

    
por Jim 02.05.2014 / 14:28

3 respostas

8

sed usa Basic Regular Expressions por padrão e BREs não sabe sobre \d . Aqui estão algumas outras abordagens:

  1. sed

    sed -r 's/.* ([0-9]+\.*[0-9]*).*?//' logfile.txt > outfile.txt
    

    O -r é necessário para evitar a fuga dos parênteses.

  2. perl

    perl -pe 's/.* (\d+\.*\d*).*/$1/' logfile.txt > outfile.txt
    
  3. grep

    grep -Po '.* \K\d+\.*\d*' logfile.txt > outfile.txt
    

Todos eles usam sua abordagem básica, que preenche os todos conjuntos de dígitos na linha que são precedidos por um espaço. Dependendo de quantos conjuntos de números podem aparecer na linha, se as linhas de entrada forem sempre do formato que você mostra, uma abordagem mais segura seria:

grep -Po 'took \K\d+\.*\d*' logfile.txt 
    
por 02.05.2014 / 14:45
3

Parênteses de agrupamento devem ser invertidos em sed. Além disso, o sed não suporta \d . Além disso, você também deve remover as palavras após o número:

sed -e 's/^.* \([0-9]\+\.[0-9]*\) .*//g'

BTW, você tem certeza de que o ponto está sempre presente, mas os números decimais são opcionais? 12. não parece um valor esperado.

    
por 02.05.2014 / 14:37
0

Você pode usar o awk para imprimir a 11ª coluna.

awk '{ print $11 }' logfile.txt > output
    
por 10.02.2017 / 16:25