Tracks
/
jq
jq
/
Ejercicios
/
Analizador de líneas de log
Analizador de líneas de log

Analizador de líneas de log

Ejercicio de aprendizaje

Introducción

Strings

Recuerda que jq admite los mismos tipos de datos que JSON. JSON describe las strings como:

Una cadena es una secuencia de cero o más caracteres Unicode, encerrada entre comillas dobles y que usa escapes con barra invertida.

Secuencias de escape

Dentro de una string, usa el carácter de barra invertida para incrustar caracteres "especiales":

  • \" una comilla doble literal,
  • \\ una barra invertida literal,
  • caracteres de espacio en blanco \n, \t, \r, \f, \b
  • caracteres Unicode \uAAAA donde A es un dígito hexadecimal

Longitud de una string

Para encontrar el número de caracteres, usa la función length.

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

Subcadenas

La notación de rebanada se puede usar para extraer subcadenas. La sintaxis es .[i:j]. La subcadena devuelta tiene longitud j - i y va desde el índice i (incluido) hasta el índice j (excluido). Cualquiera de los índices puede ser negativo, y en ese caso se cuenta hacia atrás desde el final de la string. Cualquiera de los índices se puede omitir, y en ese caso hace referencia al inicio o al final de la string. Los índices empiezan en cero.

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

Concatenación

Usa + para unir strings:

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

Usa add cuando tengas un array de strings:

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

Dividir y unir

Para dividir se usa la función split/1 o el operador /:

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

La inversa de split/1 es join/1.

Convertir una string en un array de caracteres es algo que se necesita con frecuencia. Hay dos formas de hacerlo:

  1. dividir por una string vacía

    "Hi friend 😀" / ""   # => ["H","i"," ","f","r","i","e","n","d"," ","😀"]
    
  2. usar explode para obtener un array de puntos de código

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

    implode es la inversa de explode.

Encontrar el índice de una subcadena

Usa la función index/1; el índice empieza en cero.

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

Si la subcadena no está en la string, el resultado es null

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

Interpolación de strings

Dentro de una string, la secuencia \(expression) incrusta el resultado de esa expresión en la string:

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

Conversión de mayúsculas y minúsculas

Usa las funciones ascii_downcase y ascii_upcase.

Expresiones regulares

jq tiene un gran soporte para expresiones regulares: ese será el tema de una lección posterior.

Instrucciones

En este ejercicio vas a procesar entradas de registro.

Cada línea de registro es un string con el siguiente formato: "[<LEVEL>]: <MESSAGE>".

Hay tres niveles de registro diferentes:

  • INFO
  • WARNING
  • ERROR

Tienes tres tareas, y cada una tomará una línea de registro y te pedirá que hagas algo con ella. Hay muchas formas de resolver estas tareas: elige tus técnicas favoritas de los ejemplos anteriores y mira qué se te ocurre.

1. Obtén el mensaje de una línea de registro

Implementa la función message para devolver el mensaje de una línea de registro:

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

Se deben eliminar los espacios en blanco que haya al principio o al final:

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

2. Obtén el nivel de registro de una línea de registro

Implementa la función log_level para devolver el nivel de registro de una línea de registro, el cual debe devolverse en minúsculas:

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

3. Dale otro formato a una línea de registro

Implementa la función reformat que le da otro formato a la línea de registro, poniendo el mensaje primero y el nivel de registro después, entre paréntesis:

"[INFO]: Operation completed" | reformat
# => "Operation completed (info)"
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
jq Exercism

¿Todo listo para empezar Analizador de líneas de log?

Regístrate en Exercism para aprender y dominar jq con 12 conceptos75 ejercicios y mentoría humana real, todo gratis.