Tracks
/
jq
jq
/
Übungen
/
Logzeilen-Parser
Logzeilen-Parser

Logzeilen-Parser

Lernübung

Einführung

Zeichenketten

Erinnere dich daran, dass jq dieselben Datentypen wie JSON unterstützt. JSON beschreibt Zeichenketten wie folgt:

Eine Zeichenkette ist eine Folge von null oder mehr Unicode-Zeichen, die in doppelte Anführungszeichen eingeschlossen ist und Backslash-Escapes verwendet.

Escape-Sequenzen

Innerhalb einer Zeichenkette verwendest du das Backslash-Zeichen, um „spezielle“ Zeichen einzubetten:

  • \" ein wörtliches Anführungszeichen,
  • \\ ein wörtlicher Backslash,
  • Whitespace-Zeichen \n, \t, \r, \f, \b
  • Unicode-Zeichen \uAAAA, wobei A eine Hexadezimalziffer ist

Zeichenkettenlänge

Um die Anzahl der Zeichen zu ermitteln, verwende die Funktion length.

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

Teilzeichenketten

Die Slice-Notation kann verwendet werden, um Teilzeichenketten zu extrahieren. Die Syntax ist .[i:j]. Die zurückgegebene Teilzeichenkette hat die Länge j - i und liefert Zeichen von Index i (inklusive) bis Index j (exklusiv). Jeder Index kann negativ sein; in diesem Fall zählt er vom Ende der Zeichenkette rückwärts. Jeder Index kann weggelassen werden; in diesem Fall bezieht er sich auf den Anfang oder das Ende der Zeichenkette. Indizes sind nullbasiert.

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

Verkettung

Verwende +, um Zeichenketten zu verketten:

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

Verwende add, wenn du ein Array von Zeichenketten hast:

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

Split und Join

Zum Aufteilen verwendest du die Funktion split/1 oder den Operator /:

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

Die Umkehrung von split/1 ist join/1.

Eine Zeichenkette in ein Array von Zeichen umzuwandeln, ist oft nötig. Es gibt zwei Möglichkeiten, dies zu tun:

  1. Aufteilen an einer leeren Zeichenkette

    "Hi friend 😀" / ""   # => ["H","i"," ","f","r","i","e","n","d"," ","😀"]
    
  2. explode in ein Array von Codepunkten

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

    implode ist die Umkehrung von explode.

Den Index eines Teilstrings finden

Verwende die Funktion index/1; der Index ist nullbasiert.

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

Wenn der Teilstring nicht in der Zeichenkette enthalten ist, ist das Ergebnis null

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

Zeichenketten-Interpolation

Innerhalb einer Zeichenkette bettet die Sequenz \(expression) das Ergebnis dieses Ausdrucks in die Zeichenkette ein:

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

Groß-/Kleinschreibung

Verwende die Funktionen ascii_downcase und ascii_upcase.

Reguläre Ausdrücke

jq bietet umfangreiche Unterstützung für reguläre Ausdrücke: Dies wird das Thema einer späteren Lektion sein.

Anleitung

In dieser Übung verarbeitest du Logeinträge.

Jede Logzeile ist ein String, der wie folgt formatiert ist: "[<LEVEL>]: <MESSAGE>".

Es gibt drei verschiedene Log-Level:

  • INFO
  • WARNING
  • ERROR

Du hast drei Aufgaben. Jede bekommt eine Logzeile und du sollst etwas damit machen. Es gibt viele Wege, diese Aufgaben zu lösen. Wähle deine Lieblingstechniken aus den Beispielen oben und schau, was dir einfällt.

1. Nachricht aus einer Logzeile ermitteln

Implementiere die Funktion message, die die Nachricht einer Logzeile zurückgibt:

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

Führende und nachfolgende Leerzeichen sollen entfernt werden:

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

2. Log-Level aus einer Logzeile ermitteln

Implementiere die Funktion log_level, die das Log-Level einer Logzeile zurückgibt. Das Log-Level soll in Kleinbuchstaben zurückgegeben werden:

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

3. Eine Logzeile umformatieren

Implementiere die Funktion reformat, die die Logzeile umformatiert: zuerst die Nachricht, danach das Log-Level in Klammern:

"[INFO]: Operation completed" | reformat
# => "Operation completed (info)"
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
jq Exercism

Bereit, mit Logzeilen-Parser zu starten?

Melde dich bei Exercism an, um jq mit 12 Konzepte75 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.