Percursos
/
jq
jq
/
Exercícios
/
Analisador de Linhas de Registo
Analisador de Linhas de Registo

Analisador de Linhas de Registo

Exercício de aprendizagem

Introdução

Strings

Lembra-te de que o jq suporta os mesmos tipos de dados que o JSON. O JSON descreve as strings da seguinte forma:

Uma string é uma sequência de zero ou mais carateres Unicode, delimitada por aspas duplas e recorrendo a sequências de escape com barra invertida.

Sequências de escape

Dentro de uma string, usa a barra invertida para introduzir carateres "especiais":

  • \" uma aspa literal,
  • \\ uma barra invertida literal,
  • carateres de espaço em branco \n, \t, \r, \f, \b
  • carateres Unicode \uAAAA, em que A é um algarismo hexadecimal

Comprimento de uma string

Para saberes o número de carateres, usa 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 devolvida tem comprimento j - i e vai buscar os carateres desde o índice i (inclusive) até ao índice j (exclusive). Qualquer dos índices pode ser negativo; nesse caso, conta de trás para a frente a partir do fim da string. Qualquer dos índices pode ser omitido; nesse caso, refere-se 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

Usa o + para juntar strings:

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

Usa add quando tens um array de strings:

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

Dividir e juntar

Para dividir, usa 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.

É frequente precisares de converter uma string num array de carateres. Há duas formas de o fazer:

  1. dividir por uma string vazia

    "Hi friend 😀" / ""   # => ["H","i"," ","f","r","i","e","n","d"," ","😀"]
    
  2. explode num array de codepoints

    "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

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

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

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

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

Interpolação de strings

Dentro de uma string, a sequência \(expression) incorpora 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

Usa as funções ascii_downcase e ascii_upcase.

Expressões regulares

O jq tem um grande suporte para expressões regulares: este será o tema de uma lição mais à frente.

Instruções

Neste exercício vais processar entradas de registo.

Cada linha de registo é uma string com o seguinte formato: "[<LEVEL>]: <MESSAGE>".

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

  • INFO
  • WARNING
  • ERROR

Tens três tarefas, cada uma delas recebe uma linha de registo e pede-te para fazer algo com ela. Há muitas formas de resolver estas tarefas. Escolhe as tuas técnicas preferidas dos exemplos acima e vê o que consegues fazer.

1. Obter a mensagem de uma linha de registo

Implementa a função message para devolver a mensagem de uma linha de registo:

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

Quaisquer espaços em branco no início ou no fim devem ser removidos:

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

2. Obter o nível de registo de uma linha de registo

Implementa a função log_level para devolver o nível de registo de uma linha de registo, que deve ser devolvido em minúsculas:

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

3. Reformular uma linha de registo

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

"[INFO]: Operation completed" | reformat
# => "Operation completed (info)"
Editar via GitHub A ligação abre numa nova janela ou separador
jq Exercism

Estás pronto para começar Analisador de Linhas de Registo?

Inscreve-te no Exercism para aprenderes e dominares jq com 12 conceitos75 exercícios, e mentoria humana real, tudo grátis.