Rutas
/
jq
jq
/
Ejercicios
/
Analizador de líneas de registro
Analizador de líneas de registro

Analizador de líneas de registro

Ejercicio de aprendizaje

Introducción

Cadenas de caracteres

Recuerda que jq admite los mismos tipos de datos que JSON. JSON describe las cadenas de caracteres así:

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

Secuencias de escape

Dentro de un string, usa el carácter de barra invertida para incluir 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 del string

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

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

Subcadenas

La notación slice se puede usar para extraer subcadenas. La sintaxis es .[i:j]. La subcadena devuelta tiene longitud j - i y contiene los caracteres desde el índice i (incluido) hasta el índice j (excluido). Cualquiera de los dos índices puede ser negativo, en cuyo caso cuenta hacia atrás desde el final del string. También se puede omitir cualquiera de los dos índices, en cuyo caso se refiere al principio o al final del 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!"

División y unión

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 operación inversa a split/1 es join/1.

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

  1. dividir usando un string vacío

    "Hi friend 😀" / ""   # => ["H","i"," ","f","r","i","e","n","d"," ","😀"]
    
  2. 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 operación inversa a 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 el string, el resultado es null

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

Interpolación de strings

Dentro de un string, la secuencia \(expression) inserta el resultado de esa expresión en el 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 amplio soporte para expresiones regulares: este será el tema de una lección posterior.

Instrucciones

En este ejercicio vas a procesar entradas de registro.

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

Hay tres niveles de registro diferentes:

  • INFO
  • WARNING
  • ERROR

Tienes tres tareas, y cada una recibirá 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 que devuelva el mensaje de una línea de registro:

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

Debes eliminar los espacios en blanco del principio y del 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 que devuelva el nivel de registro de una línea de registro, que debe devolverse en minúsculas:

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

3. Cambia el formato de una línea de registro

Implementa la función reformat, que cambia el formato de 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 pestaña nueva
jq Exercism

¿Listo para empezar Analizador de líneas de registro?

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