Track
/
jq
jq
/
Esercizi
/
Parser di righe di log
Parser di righe di log

Parser di righe di log

Esercizio di apprendimento

Introduzione

Stringhe

Ricorda che jq supporta gli stessi tipi di dati di JSON. JSON descrive le stringhe come:

Una stringa è una sequenza di zero o più caratteri Unicode, racchiusa tra virgolette doppie, che usa sequenze di escape con la barra rovesciata.

Sequenze di escape

All'interno di una stringa, usa il carattere barra rovesciata per incorporare i caratteri «speciali»:

  • \" una virgoletta letterale,
  • \\ una barra rovesciata letterale,
  • caratteri di spaziatura \n, \t, \r, \f, \b
  • caratteri unicode \uAAAA dove A è una cifra esadecimale

Lunghezza di una stringa

Per trovare il numero di caratteri, usa la funzione length.

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

Sottostringhe

La notazione slice può essere usata per estrarre sottostringhe. La sintassi è .[i:j]. La sottostringa restituita ha lunghezza j - i e restituisce i caratteri dall'indice i (incluso) all'indice j (escluso). Entrambi gli indici possono essere negativi, nel qual caso si contano a ritroso dalla fine della stringa. Entrambi gli indici possono anche essere omessi, nel qual caso si riferiscono all'inizio o alla fine della stringa. Gli indici partono da zero.

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

Concatenazione

Usa + per unire le stringhe:

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

Usa add quando hai un array di stringhe:

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

Dividere e unire

Per dividere si usa la funzione split/1 o l'operatore /:

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

L'inverso di split/1 è join/1.

Spesso è necessario convertire una stringa in un array di caratteri. Ci sono due modi per farlo:

  1. dividere su una stringa vuota

    "Hi friend 😀" / ""   # => ["H","i"," ","f","r","i","e","n","d"," ","😀"]
    
  2. explode in un array di punti di codice

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

    implode è l'inverso di explode.

Trovare l'indice di una sottostringa

Usa la funzione index/1; l'indice parte da zero.

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

Se la sottostringa non è presente nella stringa, il risultato è null

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

Interpolazione di stringhe

All'interno di una stringa, la sequenza \(expression) incorpora il risultato di quell'espressione nella stringa:

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

Conversione di maiuscole e minuscole

Usa le funzioni ascii_downcase e ascii_upcase.

Espressioni regolari

jq ha un ricco supporto per le espressioni regolari: sarà l'argomento di una lezione successiva.

Istruzioni

In questo esercizio elaborerai voci di log.

Ogni riga di log è una stringa formattata come segue: "[<LEVEL>]: <MESSAGE>".

Ci sono tre livelli di log diversi:

  • INFO
  • WARNING
  • ERROR

Hai tre compiti, ciascuno dei quali prenderà una riga di log e ti chiederà di fare qualcosa con essa. Ci sono molti modi per risolvere questi compiti: scegli le tecniche che preferisci tra gli esempi qui sopra e vedi cosa riesci a mettere insieme.

1. Ottieni il messaggio da una riga di log

Implementa la funzione message per restituire il messaggio di una riga di log:

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

Eventuali spazi bianchi all'inizio o alla fine vanno rimossi:

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

2. Ottieni il livello di log da una riga di log

Implementa la funzione log_level per restituire il livello di log di una riga di log, che deve essere restituito in minuscolo:

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

3. Riformatta una riga di log

Implementa la funzione reformat che riformatta la riga di log, mettendo prima il messaggio e poi il livello di log tra parentesi:

"[INFO]: Operation completed" | reformat
# => "Operation completed (info)"
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
jq Exercism

Vuoi iniziare Parser di righe di log?

Iscriviti a Exercism per imparare e padroneggiare jq con 12 concetti75 esercizi e il mentoring di persone reali, tutto gratis.