Trilhas
/
jq
jq
/
Exercícios
/
Analisador de linhas de log
Analisador de linhas de log

Analisador de linhas de log

Exercício de aprendizagem

Introdução

Strings

Lembre-se de que o jq dá suporte aos mesmos tipos de dados que o JSON. O JSON descreve as strings assim:

Uma string é uma cadeia de zero ou mais caracteres Unicode, envolta em aspas duplas, usando escapes com barra invertida.

Sequências de escape

Dentro de uma string, use o caractere de barra invertida para inserir caracteres "especiais":

  • \" uma aspa dupla literal,
  • \\ uma barra invertida literal,
  • caracteres de espaço em branco \n, \t, \r, \f, \b
  • caracteres Unicode \uAAAA, em que A é um dígito hexadecimal

Comprimento de string

Para saber o número de caracteres, use a função length.

$ jq -cn --args  '$ARGS.positional[] | length' "Hello world!" "❄🌡🤧🤒🏥🕰😀"
12
7

Substrings

A notação de slice pode ser usada para extrair substrings. A sintaxe é .[i:j]. A substring retornada tem comprimento j - i, retornando caracteres do índice i (inclusive) até o índice j (exclusive). Qualquer um dos índices pode ser negativo; nesse caso, ele conta de trás para frente a partir do fim da string. Qualquer um dos índices pode ser omitido; nesse caso, ele se refere ao início ou ao fim da string. Os índices começam em zero.

"abcdefghij"[3:6]   # => "def"
"abcdefghij"[3:]    # => "defghij"
"abcdefghij"[:-2]   # => "abcdefgh"

Concatenação

Use + para juntar strings:

"Hello" + " " + "world!"
# => "Hello world!"

Use add quando tiver um array de strings:

["Hello", " ", "world!"] | add
# => "Hello world!"

Dividir e juntar

Para dividir, use a função split/1 ou o operador /:

"Hello beautiful world!" | split(" ")   # => ["Hello", "beautiful", "world!"]
"Hello beautiful world!" / " "          # => ["Hello", "beautiful", "world!"]

O inverso de split/1 é join/1.

Muitas vezes é preciso converter uma string em um array de caracteres. Há duas formas de fazer isso:

  1. dividir em uma string vazia

    "Hi friend 😀" / ""   # => ["H","i"," ","f","r","i","e","n","d"," ","😀"]
    
  2. explode em um array de pontos de código

    "Hi friend 😀" | explode   # => [72,105,32,102,114,105,101,110,100,32,128512]
    

    implode é o inverso de explode.

Encontrar o índice de uma substring

Use a função index/1; o índice começa em zero.

"hello" | index("el")'   # => 1

Se a substring não estiver na string, o resultado é null

"hello" | index("elk")   # => null

Interpolação de strings

Dentro de uma string, a sequência \(expression) insere o resultado dessa expressão na string:

"The current datetime is \(now | strflocaltime("%c"))"   # => "The current datetime is Wed Nov 16 17:06:33 2022"

Conversão de maiúsculas e minúsculas

Use as funções ascii_downcase e ascii_upcase.

Expressões regulares

O jq tem um suporte rico a expressões regulares: esse será o tema de uma lição mais adiante.

Instruções

Neste exercício, você vai processar entradas de log.

Cada linha de log é uma string formatada da seguinte forma: "[<LEVEL>]: <MESSAGE>".

Há três níveis de log diferentes:

  • INFO
  • WARNING
  • ERROR

Você tem três tarefas, e cada uma delas vai receber uma linha de log e pedir que você faça algo com ela. Há muitas maneiras de resolver essas tarefas. Escolha suas técnicas favoritas nos exemplos acima e veja o que você consegue fazer.

1. Obtenha a mensagem de uma linha de log

Implemente a função message para retornar a mensagem de uma linha de log:

"[ERROR]: Invalid operation" | message
# => "Invalid operation"

Qualquer espaço em branco no início ou no final deve ser removido:

"[WARNING]:  Disk almost full\r\n" | message
# => "Disk almost full"

2. Obtenha o nível de log de uma linha de log

Implemente a função log_level para retornar o nível de log de uma linha de log, que deve ser retornado em minúsculas:

"[ERROR]: Invalid operation" | log_level
# => "error"

3. Reformate uma linha de log

Implemente a função reformat que reformata a linha de log, colocando a mensagem primeiro e o nível de log depois dela entre parênteses:

"[INFO]: Operation completed" | reformat
# => "Operation completed (info)"
Editar via GitHub O link abre em uma nova janela ou aba
jq Exercism

Tudo pronto para começar Analisador de linhas de log?

Crie sua conta no Exercism para aprender e dominar jq com 12 conceitos75 exercícios e mentoria humana de verdade, tudo de graça.