به یاد آورید که 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 است.
تبدیل یک رشته به آرایهای از نویسهها اغلب لازم است. دو راه برای این کار وجود دارد:
تقسیم روی یک رشتهی خالی
"Hi friend 😀" / "" # => ["H","i"," ","f","r","i","e","n","d"," ","😀"]
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>".
سه سطح لاگ متفاوت وجود دارد:
INFOWARNINGERRORسه تمرین دارید؛ هرکدام یک سطر لاگ میگیرد و از شما میخواهد کاری روی آن انجام دهید. راههای زیادی برای حل این تمرینها وجود دارد؛ تکنیکهای موردعلاقهتان را از مثالهای بالا انتخاب کنید و ببینید به چه نتیجهای میرسید.
تابع message را پیادهسازی کنید تا پیام یک سطر لاگ را برگرداند:
"[ERROR]: Invalid operation" | message
# => "Invalid operation"
هر فضای سفید ابتدایی یا انتهایی باید حذف شود:
"[WARNING]: Disk almost full\r\n" | message
# => "Disk almost full"
تابع log_level را پیادهسازی کنید تا سطح لاگ یک سطر لاگ را برگرداند؛ این مقدار باید با حروف کوچک برگردانده شود:
"[ERROR]: Invalid operation" | log_level
# => "error"
تابع reformat را پیادهسازی کنید که سطر لاگ را دوباره قالببندی میکند؛ به این صورت که پیام را اول میگذارد و سطح لاگ را بعد از آن، داخل پرانتز:
"[INFO]: Operation completed" | reformat
# => "Operation completed (info)"