Como faço grep para ocorrências de “[numberLargerThan5000] ms”?

3

Eu tenho um arquivo .log onde cada entrada está no formulário

2018-09-28T10:53:48,006 [Jetty-6152  ] INFO  [correlationId] my.package.service:570 - Inbound request: 1.2.3.4 - GET - 12342ms - 200 - /json/some/resource
2018-09-28T11:53:48,006 [Jetty-6152  ] INFO  [correlationId] my.package.service:570 - Inbound request: 1.2.3.4 - GET - 204ms - 200 - /json/other/resource

Como encontro todas as entradas em que a solicitação levou mais de cinco segundos? que é a entrada contém o texto "[numberGreaterThan5000] ms"?

    
por CodePrimate 30.09.2018 / 10:49

2 respostas

2

Acho que isso deve ser feito:

grep -E '([5-9][0-9]{3}|[0-9]{5,})ms' | grep -v 5000ms

Como funciona?

  1. Ele usa -E , então o regex é do formato "moderno" (também chamado de estendido). Isso torna a digitação mais fácil no nosso caso, já que podemos salvar alguns \ chars.
  2. O (...|...)ms procura duas alternativas seguidas pela string ms . Isso é necessário porque regex não pode comparar números, então eu não posso dizer algo como >= 5000 .
  3. A primeira alternativa é [5-9][0-9]{3} , que corresponderá a qualquer string que comece com um número de 5 a 9 seguido por 3 ocorrências de números de 0 a 9. Esses são todos os números > = 5000 e < 10000.
  4. A segunda alternativa corresponderá a uma string de 5 ou mais dígitos, ou seja, qualquer número > = 10000.
  5. No final, enviamos o resultado para grep -v 5000ms para filtrar qualquer ocorrência de 5000ms porque você disse maior que 5000. Se quiser maior ou igual, deixe isso de lado.

Onde aprender mais?

Leia man 1 grep e man 7 regex .

    
por 30.09.2018 / 11:22
1

Geralmente, você deve evitar criar comparações numéricas a partir de expressões regulares - use algo como awk ou perl que possa fazer comparações numéricas reais, por exemplo,

gawk -v x=5000 'match($0,/([0-9]+)ms/,a) && a[1]+0 > x' file.log

ou

perl -ne 'print if /(\d+)ms/ && $1 > 5000' file.log
    
por 30.09.2018 / 16:13