مسیرها
/
jq
jq
/
تمرین‌ها
/
تجزیه‌گر خط لاگ
تجزیه‌گر خط لاگ

تجزیه‌گر خط لاگ

تمرین یادگیری

مقدمه

رشته

به یاد آورید که jq همان انواع دادهی JSON را پشتیبانی می‌کند. JSON «رشته» را این‌گونه توصیف می‌کند:

رشته دنباله‌ای است از صفر یا چند نویسه‌ی یونیکد که در گیومه‌ی دوتایی پیچیده شده و از دنباله‌های فرار بک‌اسلش استفاده می‌کند.

دنباله‌ی فرار

درون یک رشته، از نویسه‌ی بک‌اسلش برای جا دادن نویسه‌های «خاص» استفاده کنید:

  • \" یک علامت نقل‌قول دوتایی واقعی،
  • \\ یک بک‌اسلش واقعی،
  • نویسه‌های فضای خالی \n، \t، \r، \f، \b
  • نویسه‌های یونیکد \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!"]

معکوس 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 استفاده کنید؛ اندیس از صفر شروع می‌شود.

"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 ثبت‌نام کنید تا jq را همراه با 12 مفهوم75 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.