Προγραμματισμός με gawk μέρος 1ο: Πρότυπα (και Πράξεις)
Description: This is issue 23 of Magaz, the Hellenic LinuxMagazine
Keywords: magaz hellenic greek hellas greece hellug linux magazine

Magaz, The Greek Linux Magazine
Τεύχος #23
Περιληπτικά Περιεχόμενα Αναλυτικά Περιεχόμενα Mirrors Links Πληροφορίες Συντάκτες Αναζήτηση Επικοινωνία
Επόμενο Προηγούμενο Περιεχόμενα ### 3. Πρότυπα (και Πράξεις) Στην gawk μπορείτε να χρησιμοποιήσετε πρότυπα 3 ειδών: Ειδικά πρότυπα (special patterns) Κανονικές παραστάσεις (regular expression patterns) Σχεσιακές εκφράσεις (comparison patterns) ### 3.1 Ειδικά πρότυπα Η awk περιλαμβάνει δύο ειδικά πρότυπα: το BEGIN και το END. Η πράξη που ακολουθεί το πρότυπο BEGIN εκτελείται πρίν διαβαστεί οποιαδήποτε γραμμή του αρχείου. Για αυτόν τον λόγο, το BEGIN χρησιμοποιείται συνήθως για εκτύπωση επικεφαλίδων ή για αρχική καταχώρηση σε μία μεταβλητή. Η πράξη που ακολουθεί το END εκτελείται όταν έχουν επεξεργαστεί όλες οι γραμμές από το αρχείο. Τα πρότυπα BEGIN και END είναι εντελώς προαιρετικά. Τα χρησιμοποιείτε αν θέλετε. Όμως, αν τα χρησιμοποιήσετε τότε μπορείτε να τα έχετε μόνο μιά φορά μέσα στο πρόγραμμά σας. Μην χρησιμοποιήσετε δύο BEGIN ή δύο END. Παράδειγμα για τα BEGIN και END θα δούμε παρακάτω, όταν μιλήσουμε για μεταβλητές. ### 3.2 Πρότυπα κανονικών παραστάσεων Κανονική παράσταση είναι μία σειρά χαρακτήρων που περικλείονται ανάμεσα σε ζευγάρι από / (slash). Για παράδειγμα, αν εκτελέσετε την:
    gawk '/linux/' my_doc.txt
τότε θα εμφανιστούν στην οθόνη όλες οι γραμμές του αρχείου my_doc.txt που περιέχουν τη λέξη linux. Οι κανονικές παραστάσεις της gawk αποτελούνται από χαρακτήρες (όπως τα γράμματα της αλφαβήτου) και από μεταχαρακτήρες (metacharacters). Οι μεταχαρακτήρες είναι και αυτοί χαρακτήρες που έχουν ειδικό νόημα: δεν χρησιμοποιούνται για "ταίριασμα" με πεδίο ή εγγραφή ενός αρχείου, αλλά εκτελούν μιά συγκεκριμένη λειτουργία. Ας δούμε, λοιπόν, έναν πίνακα με τους μεταχαρακτήρες και την συμπεριφορά τους:
Μεταχαρακτήρας | Συμπεριφορά
\ | Ακυρώνει την έννοια του ειδικού χαρακτήρα που ακολουθεί την backslash, οπότε ο ειδικός χαρακτήρας αντιμετωπίζεται σαν απλός
^ | Σύγκριση (matching) στην αρχή της γραμμής
$ | Σύγκριση στο τέλος της γραμμής
/^$/ | Σύγκριση για κενή γραμμή
. | Συγκρίνει οποιονδήποτε απλό χαρακτήρα
[ΑΒΓ] | Συγκρίνει για οποιονδήποτε από τους Α, Β ή Γ
[Α-Γα-γ] | Συγκρίνει για οποιονδήποτε από τους Α, Β, Γ, α, β, ή γ
[^ΑΒΓ] | Συγκρίνει για οποιονδήποτε άλλο χαρακτήρα εκτός των Α, Β ή Γ
Linux|System | Συγκρίνει για την λέξη Linux ή για την System (λογικό OR)
[ΑΒΓ][ΔΕΖ] | Συγκρίνει για τους Α, Β ή Γ, οι οποίοι όμως,θα πρέπει να ακολουθούνται από οποιονδήποτε των Δ, Ε ή Ζ
[XYZ]* | Συγκρίνει για καμμία ή περισσότερες εμφανίσεις της παράστασης[XYZ]
[XYZ]+ | Συγκρίνει για μία ή περισσότερες εμφανίσεις της παράστασης[XYZ]
[XYZ]? | Συγκρίνει για καμμία ή μία εμφάνιση της παράστασης[XYZ]
() | Συνδυάζει κανονικές παραστάσεις. Π.χ. το (ανα|δια)λύω συγκρίνει για να βρεί είτε τη λέξη αναλύω είτε τη λέξη διαλύω
#### Παραδείγματα Ας δούμε την παρακάτω κανονική παράσταση:
    /[Mm]agaz|interesting$/
Αυτή η παράσταση αναζητά τις γραμμές στις οποίες βρίσκονται οι λέξεις Magaz ή magaz (σε οποιοδήποτε σημείο της γραμμής) ή interesting (στο τέλος της γραμμής). Ας δούμε άλλη μία παράσταση:
    /[Mm][Aa][Gg][Aa][Zz]/
Αυτή η παράσταση αναζητά τις γραμμές στις οποίες βρίσκεται η λέξη magaz ΜΕ ΟΠΟΙΟΝΔΗΠΟΤΕ τρόπο γραμμένη, δηλαδή μπορεί να "ξεθάψει" την λέξη ακόμα και αν αυτή είναι γραμμένη με έναν από τους συνολικά 32 τρόπους!! (δηλ. Magaz, MAgaz, MAGaz, MAGAz, MAGAZ, mAgaz κ.ο.κ.) ### 3.3 Πρότυπα σχεσιακών εκφράσεων Με τις σχεσιακές εκφράσεις γίνεται σύγκριση αριθμών ή αλφαριθμητικών (strings). H σύγκριση γίνεται με τους σχεσιακούς τελεστές, οι οποίοι είναι παρόμοιοι με αυτούς της C και των φλοιών (shells) του UNIX. Μέχρι τώρα είδαμε πως οι κανονικές παραστάσεις "σαρώνουν" όλη τη γραμμή για να βρούν αυτό που ζητάμε. Μπορούμε, όμως, να συνδυάσουμε τις κανονικές παραστάσεις με τις σχεσιακές εκφράσεις για να "ψάξουμε" σε συγκεκριμένα πεδία. Ας δούμε πρώτα όμως, έναν πίνακα με τους σχεσιακούς τελεστές:
Τελεστής | Ερμηνεία
== | Ίσο με
< | Μικρότερο
> | Μεγαλύτερο
<= | Μικρότερο ή ίσο
>= | Μεγαλύτερο ή ίσο
!= | Διάφορο του
~ | Ίσο με την ακόλουθη κανονική παράσταση
!~ | Διάφορο της ακόλουθης κανονικής παράστασης
#### Παραδείγματα Ας δούμε ένα "τυπικό" παράδειγμα εφαρμογής των παραπάνω τελεστών:
    $1 == "Linux" { print "Linux Rocks!!" }
Η παραπάνω εντολή ελέγχει αν το πρώτο πεδίο είναι η λέξη Linux και αν είναι εκτελεί την πράξη, δηλαδή στην περίπτωσή μας εμφανίζει στην οθόνη το μήνυμα Linux Rocks!! Προσέξτε ότι εδώ τα πράγματα είναι όπως ακριβώς φαίνονται, δηλαδή αν το πρώτο πεδίο είναι η λέξη linux (το l όχι κεφαλαίο όπως το δηλώσαμε), τότε δεν θα εκτελεστεί η πράξη. Επομένως, ας δούμε τη χρησιμότητα του συνδυασμού της κανονικής παράστασης με τις σχεσιακές εκφράσεις: $6 !~ /[Mm][Aa][Gg][Aa][Zz]/ { print "we have no magaz" } Η παραπάνω εντολή ελέγχει αν το 6ο πεδίο περιέχει τη λέξη magaz (όπως και αν είναι γραμμένη) και όταν δεν τη βρεί τυπώνει αυτό που περιέχεται στα εισαγωγικά της print. ### 3.4 Λογικοί Τελεστές Οι λογικοί τελεστές που χρησιμοποιούνται στην awk είναι παρόμοιοι με αυτούς της C. Χρησιμοποιούμε τους τελεστές αυτούς για να συνδυάσουμε πρότυπα (σχεσιακές εκφράσεις ή κανονικές παραστάσεις) ώστε να "συνθέσουμε" μιά πολύπλοκη μορφή λογικής. Ας δούμε έναν πίνακα με τους λογικούς τελεστές:
Τελεστής | Ερμηνεία
&& | Λογικό ΚΑΙ (AND)
|| | Λογικό Η (OR)
! | Λογικό ΟΧΙ (NOT)
Ας δούμε ένα παράδειγμα:
    $3 == "Linux" && $18 == "Magaz" {print "Μήνυμα εξόδου")
Εδώ, το πρότυπό μας, στην περίπτωση που το 3ο πεδίο είναι η λέξη Linux ΚΑΙ το 18ο πεδίο η λέξη Magaz, τυπώνει στην οθόνη το μήνυμα. ### 3.5 Διάστημα προτύπων Μπορείτε στη θέση ενός προτύπου να χρησιμοποιήσετε ένα διάστημα προτύπων. Το διάστημα προτύπων είναι δύο πρότυπα, τα οποία χωρίζονται με κόμμα (,) και χρησιμεύουν στο εξής: Η πράξη που τα ακολουθεί, εφαρμόζεται σε όλες εκείνες τις γραμμές που βρίσκονται ανάμεσα στη γραμμή που εμφανίζεται το πρώτο πρότυπο και στη γραμμή που εμφανίζεται το δεύτερο πρότυπο. Παράδειγμα:
    /Linux/,/Magaz/
Η gawk θα αναζητήσει εκείνες τις γραμμές, από εκείνη που εμφανίζεται η λέξη Linux μέχρι εκείνη που εμφανίζεται η λέξη Magaz. Επόμενο Προηγούμενο Περιεχόμενα