Треки
/
jq
jq
/
Вправи
/
Парсер рядків журналу
Парсер рядків журналу

Парсер рядків журналу

Навчальна вправа

Вступ

Рядки тексту

Згадаймо, що jq підтримує ті самі типи даних, що й JSON. JSON описує рядки тексту (англ. string) так:

Рядком тексту називають послідовність, що містить нуль або більше символів Unicode, узяту в подвійні лапки, де для екранування використовується зворотний слеш.

Екрановані послідовності

Щоб убудувати «спеціальні» символи, усередині рядка тексту використовуємо зворотний слеш:

  • \" буквальна лапка,
  • \\ буквальний зворотний слеш,
  • символи пробілів \n, \t, \r, \f, \b
  • символи Unicode \uAAAA, де A позначає шістнадцяткову цифру

Довжина рядка тексту

Щоб дізнатися кількість символів, використовуємо функцію length.

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

Підрядки

Нотацію зрізу можна використати, щоб видобути підрядки. Синтаксис такий: .[i:j]. Повернений підрядок має довжину j - i і містить символи від індексу i (включно) до індексу j (не включно). Будь-який з індексів може бути відʼємним, і тоді відлік іде назад від кінця рядка тексту. Будь-який з індексів можна пропустити, і тоді він указує на початок або кінець рядка тексту. Індекси відраховуються від нуля.

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

Конкатенація

Використовуємо +, щоб зʼєднати рядки тексту:

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

Використовуємо add, коли маємо масив рядків тексту:

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

Розділення та обʼєднання

Для розділення використовуємо функцію split/1 або оператор /:

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

Функція join/1 виконує дію, обернену до split/1.

Часто виникає потреба перетворити рядок тексту на масив символів. Є два способи це зробити:

  1. розділити за порожнім рядком тексту

    "Hi friend 😀" / ""   # => ["H","i"," ","f","r","i","e","n","d"," ","😀"]
    
  2. explode у масив кодових точок

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

    Функція implode виконує дію, обернену до explode.

Пошук індексу підрядка

Використовуємо функцію index/1; індекс відраховується від нуля.

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

Якщо підрядка немає в рядку тексту, результатом буде null

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

Інтерполяція рядків тексту

Усередині рядка тексту послідовність \(expression) вбудує результат цього виразу у рядок тексту:

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

Зміна регістру

Використовуємо функції ascii_downcase та ascii_upcase.

Регулярні вирази

jq має багату підтримку регулярних виразів: це стане темою одного з наступних уроків.

Вказівки

У цій вправі ми будемо обробляти записи журналу.

Кожен рядок журналу - це рядок тексту (англ. string) такого формату: "[<LEVEL>]: <MESSAGE>".

Є три різні рівні журналу:

  • INFO
  • WARNING
  • ERROR

У нас є три завдання; у кожному треба взяти рядок журналу і щось із ним зробити. Є багато способів розвʼязати ці завдання: виберімо улюблені прийоми з наведених вище прикладів і подивімося, що в нас вийде.

1. Отримати повідомлення з рядка журналу

Реалізуйте функцію message, щоб вона повертала повідомлення з рядка журналу:

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

Усі пробільні символи на початку та в кінці потрібно прибрати:

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

2. Отримати рівень журналу з рядка журналу

Реалізуйте функцію log_level, яка повертає рівень журналу з рядка журналу; його потрібно повертати малими літерами:

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

3. Переформатувати рядок журналу

Реалізуйте функцію reformat, яка переформатовує рядок журналу, ставлячи повідомлення першим, а рівень журналу після нього в дужках:

"[INFO]: Operation completed" | reformat
# => "Operation completed (info)"
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
jq Exercism

Час розпочати Парсер рядків журналу?

Зареєструйтеся на Exercism, щоб вивчати й опановувати jq, а також 12 концепцій75 вправ та справжнє наставництво від людей, і все це безкоштовно.