學習軌道
/
jq
jq
/
練習
/
日誌行剖析器
日誌行剖析器

日誌行剖析器

學習練習

簡介

字串

回想一下,jq支援與 JSON 相同的資料型態。 JSON 將字串描述為:

字串是由零個或多個 Unicode 字元組成的序列,並以雙引號包住,使用反斜線跳脫。

跳脫序列

在字串中,使用反斜線字元來嵌入「特殊」字元:

  • \"字面上的引號,
  • \\字面上的反斜線,
  • 空白字元\n、\t、\r、\f、\b
  • Unicode 字元\uAAAA,其中A是十六進位數字

字串長度

若要找出字元數量,請使用length函式。

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

子字串

slice標記法可用來擷取子字串。 語法是.[i:j]。 回傳的子字串長度為j - i,包含從索引i(含)到索引j(不含)之間的字元。 任一個索引都可以是負數,此時會從字串結尾往回計算。 任一個索引都可以省略,此時代表字串的開頭或結尾。 索引從 0 開始。

"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!"]

split/1的反向操作是join/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函式;索引從 0 開始。

"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對正規表示式有豐富的支援:這會是之後某個單元的主題。

說明

在這個練習中,你會處理日誌項目。

每一行日誌都是一個格式如下的字串:"[<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,透過 12 個概念75 個練習 和真人引導來學習並精通 jq,全部免費。