المسارات
/
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 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.