Διαδρομές
/
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 (μη συμπεριλαμβανομένης). Οποιαδήποτε από τις δύο θέσεις μπορεί να είναι αρνητική, οπότε μετράει προς τα πίσω από το τέλος της συμβολοσειράς. Οποιαδήποτε από τις δύο θέσεις μπορεί να παραλειφθεί, οπότε αναφέρεται στην αρχή ή στο τέλος της συμβολοσειράς. Οι θέσεις ξεκινούν από το μηδέν.

"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 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.