AWK

33
AWK Μία εξαιρετικά δυναμική συμβολική γλώσσα προγραμματισμού και ταυτόχρονα ένα εργαλείο διαχείρισης δεδομένων. Αναζητά, τροποποιεί αρχεία, δημιουργεί reports... Ολες οι παραπάνω ενέργειες πραγματοποιούνται με την αναζήτηση patterns σε γραμμές που δίνονται στην είσοδο (αρχείο ή standard input). Alfred Aho, Peter Weinberger, Brian Kernigham. A W K A W K

description

AWK. Μία εξαιρετικά δυναμική συμβολική γλώσσα προγραμματισμού και ταυτόχρονα ένα εργαλείο διαχείρισης δεδομένων. Αναζητά, τροποποιεί αρχεία, δημιουργεί reports ... - PowerPoint PPT Presentation

Transcript of AWK

Page 1: AWK

AWK

• Μία εξαιρετικά δυναμική συμβολική γλώσσα προγραμματισμού και ταυτόχρονα ένα εργαλείο διαχείρισης δεδομένων.

• Αναζητά, τροποποιεί αρχεία, δημιουργεί reports...• Ολες οι παραπάνω ενέργειες πραγματοποιούνται με

την αναζήτηση patterns σε γραμμές που δίνονται στην είσοδο (αρχείο ή standard input).

• Alfred Aho, Peter Weinberger, Brian Kernigham.

A W KA W K

Page 2: AWK

Η γλώσσα awk

• Ενα awk πρόγραμμα αποτελείται από μία ή περισσότερες εντολές της μορφής:

pattern {action}pattern {action}• Σύνταξη:

awk ‘/awk ‘/patternpattern// { {actionaction}}’’ input_filename input_filename• Αν παραληφθεί το input_filename τότε θεωρείται το

standard input.Παράδειγμα

$ awk ‘/732-/ {print $1}’ phones$ awk –f awkprogram

Page 3: AWK

Η γλώσσα awk

• Η awk λειτουργεί με τα πεδία των γραμμών εισόδου.• Τα πεδία είναι λέξεις που διαχωρίζονται με τον χαρακτήρα

του κενού ή κάποιο άλλον χαρακτήρα (field separator).• Η awk θεωρεί default το χαρακτήρα του κενού. Η χρήση του

option –F δίνει τη δυνατότητα προσδιορισμού άλλου χαρακτήρα ως field separator.

• Αναφορά στα πεδία τόσο των awk patterns όσο και των awk προγραμμάτων γίνεται με το σύμβολο του $ ακολουθούμενο από τον αριθμό του πεδίου ($1, $2 κλπ).

• Δεν υπάρχει περίπτωση σύγχυσης του συμβολισμού των πεδίων με αυτόν των παραμέτρων θέσης στα scripts επειδή τα πρώτα περικλείονται σε μονά εισαγωγικά ‘ ’.

Page 4: AWK

Η γλώσσα awk - Παραδείγματα

$ ls –l > newfiles1.1. $ awk ‘$3 == “adm” {print}’ newfiles$ awk ‘$3 == “adm” {print}’ newfiles

Ελεγχος του 3ου πεδίου κάθε γραμμής του αρχείου newfiles για το αν είναι ίσο ίσο με το pattern «adm”. Αν ναι, τότε τυπώνεται ολόκληρη η γραμμή που βρέθηκε το pattern.

2.2. $ awk ‘$3 ~ “adm” {print}’ newfiles$ awk ‘$3 ~ “adm” {print}’ newfilesΕλεγχος του 3ου πεδίου κάθε γραμμής του αρχείου newfiles για το αν είναι περίπου ίσοπερίπου ίσο με το pattern «adm”, δηλαδή, αν το 3ο πεδίο περιλαμβάνει το pattern “adm”. Αν ναι, τότε τυπώνεται ολόκληρη η γραμμή που βρέθηκε το pattern.

Page 5: AWK

Η γλώσσα awk - Παραδείγματα

3.3. $ awk ‘$3 ~ “adm” {print $9, $5}’ newfiles$ awk ‘$3 ~ “adm” {print $9, $5}’ newfilesΕλεγχος του 3ου πεδίου κάθε γραμμής του αρχείου newfiles για το αν είναι περίπου ίσοπερίπου ίσο με το pattern “adm”, δηλαδή, αν το 3ο πεδίο περιλαμβάνει το pattern “adm”. Αν ναι, τότε τυπώνεται το 9ο και το 5ο πεδίο και όχιόχι ολόκληρη η γραμμή που βρέθηκε το pattern.

4.4. $ awk ‘$3 $ awk ‘$3 !=!= “root” {print}’ newfiles “root” {print}’ newfilesΕλεγχος του 3ου πεδίου κάθε γραμμής του αρχείου newfiles για το αν δεν είναι ίσοδεν είναι ίσο με το pattern “root”. Ετσι, τυπώνονται όλες οι γραμμές που δε βρέθηκε το pattern “root”.

Page 6: AWK

5.5. $ awk –F: ‘$1 == “root” {print}’ /etc/passwd$ awk –F: ‘$1 == “root” {print}’ /etc/passwdΕλεγχος του 1ου πεδίου κάθε γραμμής του αρχείου passwd που έχει field separator το χαρακτήρα ‘:’, για το αν είναι ίσοίσο με το pattern “root”, δηλαδή, αν το 1ο πεδίο περιλαμβάνει το pattern “root”. Αν ναι, τότε τυπώνεται ολόκληρη η γραμμή που βρέθηκε το pattern.

6.6. $ awk –F: ‘$4 =$ awk –F: ‘$4 === 0 {print}’ /etc/passwd 0 {print}’ /etc/passwdΕλεγχος του 4ου πεδίου κάθε γραμμής του αρχείου passwd για το αν είναι ίσοίσο με το ‘0’, δηλαδή, αν ο user ανήκει στο group που ανήκει και ο root. Ετσι, τυπώνονται όλες οι γραμμές των users που ανήκουν στο ίδιο group με το root.

Η γλώσσα awk - Παραδείγματα

Page 7: AWK

7.7. $ awk –F: ‘$$ awk –F: ‘$44 << 1414 {print}’ /etc/passwd {print}’ /etc/passwdΕλεγχος του 4ου πεδίου κάθε γραμμής του αρχείου passwd που έχει field separator το χαρακτήρα ‘:’, για το αν είναι μικρότερομικρότερο από την τιμή 14. Ετσι, τυπώνονται όλες οι γραμμές εκείνων των users που ανήκουν στα group 0-13.

8.8. $ awk –F: ‘$4 $ awk –F: ‘$4 <=<= 1414 {print}’ /etc/passwd {print}’ /etc/passwdΕλεγχος του 4ου πεδίου κάθε γραμμής του αρχείου passwd για το αν είναι μικρότερο ή ίσομικρότερο ή ίσο από το ‘14’. Ετσι, τυπώνονται όλες οι γραμμές εκείνων των users που ανήκουν στα group 0-14.

Η γλώσσα awk - Παραδείγματα

Page 8: AWK

9.9. $ awk –F: ‘$$ awk –F: ‘$44 !=!= 1414 {print}’ /etc/passwd {print}’ /etc/passwdΕλεγχος του 4ου πεδίου κάθε γραμμής του αρχείου passwd που έχει field separator το χαρακτήρα ‘:’, για το αν δεν είναι ίσοδεν είναι ίσο με την τιμή 14. Ετσι, τυπώνονται όλες οι γραμμές εκείνων των users που ανήκουν σε οποιοδήποτε άλλο group εκτός από το 14.

10.10. $ awk –F: ‘$4 $ awk –F: ‘$4 >=>= 1414 {print}’ /etc/passwd {print}’ /etc/passwdΕλεγχος του 4ου πεδίου κάθε γραμμής του αρχείου passwd για το αν είναι μεγαλύτερο ή ίσομεγαλύτερο ή ίσο από το ‘14’. Ετσι, τυπώνονται όλες οι γραμμές εκείνων των users που ανήκουν στα group 14-.

Η γλώσσα awk - Παραδείγματα

Page 9: AWK

Η γλώσσα awk - Παραδείγματα

11.11. $ awk –F: ‘$$ awk –F: ‘$44 >> 1414 {print}’ /etc/passwd {print}’ /etc/passwdΕλεγχος του 4ου πεδίου κάθε γραμμής του αρχείου passwd που έχει field separator το χαρακτήρα ‘:’, για το αν είναι μεγαλύτερομεγαλύτερο από την τιμή 14. Ετσι, τυπώνονται όλες οι γραμμές εκείνων των users που ανήκουν στα group 14-.

Comparison Operator Definition < Less than

<= Less than or equal to == Equal to ~ Strings match != Not equal to >= Greater than or equal to > Greater than

Page 10: AWK

Η γλώσσα awk στον προγραμματισμό στο Shell

• $ who | awk ‘$ who | awk ‘{{print $2}’print $2}’

Εμφανίζεται λίστα με τα τερματικά μόνο που είναι ενεργά στο σύστημα και αφού το όνομα τους βρίσκεται στο δεύτερο πεδίο μιας λίστας της εντολής who.

Page 11: AWK

Η γλώσσα awk - Παραδείγματα1.1. $ cat > awkprg1$ cat > awkprg1

/widget/ {print}/widget/ {print}^C^C$ awk –f awkprg1$ awk –f awkprg1

2.2. $ cat > awkprg2$ cat > awkprg2/widget/ {w_count=w_count+1}/widget/ {w_count=w_count+1}^C^C$ awk –f awkprg2$ awk –f awkprg2

3.3. $ nawk ‘/widget/ {print}’ inventory$ nawk ‘/widget/ {print}’ inventory4.4. $ cat > phones$ cat > phones

JudyJudy SeattleSeattle 206-333-4321206-333-4321FranFran MiddletownMiddletown 908-671-4321908-671-4321JudyJudy RumsonRumson 908-741-1234908-741-1234RonRon IthacaIthaca 607-273-1234607-273-1234

^C^C$ nawk ‘/908-/ {print $1}’ phones$ nawk ‘/908-/ {print $1}’ phones

Page 12: AWK

Η γλώσσα awk - Παραδείγματα

5.5. $ nawk ‘{print $1}’ phones$ nawk ‘{print $1}’ phones

6.6. $ nawk –F, ‘/Judy/ {print}’ phones$ nawk –F, ‘/Judy/ {print}’ phones

7.7. $ nawk –F”\t” ‘/Judy/ {print}’ phones$ nawk –F”\t” ‘/Judy/ {print}’ phones

8.8. $ nawk ‘length($2) > 6’ phones$ nawk ‘length($2) > 6’ phones

9.9. $ nawk ‘{print $1}’ phones > namelist$ nawk ‘{print $1}’ phones > namelist

10.10. $ nawk ‘{print $1}’ phones1 phones2$ nawk ‘{print $1}’ phones1 phones2

11.11. $ nawk –f progfile input_file$ nawk –f progfile input_file

Page 13: AWK

12.12. $ nawk ‘{temp = $1;$1 = $2;$2 = temp;print}’ phones > newphones$ nawk ‘{temp = $1;$1 = $2;$2 = temp;print}’ phones > newphones

ήή$ $ cat > awkprg3cat > awkprg3# this is a multi-line awk program# this is a multi-line awk program{{ temp = $1;temp = $1;

$1 = $2;$1 = $2;$2 = temp;$2 = temp;print}print}

^̂CC$ nawk –f awkprg3 phones > newphones$ nawk –f awkprg3 phones > newphones

Η γλώσσα awk - Παραδείγματα

Page 14: AWK

Η γλώσσα awk - Patterns

• Κανονικές εκφράσεις(Κανονικές εκφράσεις(Regular expressionsRegular expressions))Σειρές γραμμάτων, αριθμών και ειδικών χαρακτήρων που καθορίζουν το string που αναζητάται.

• Pattern Pattern σύγκρισης (σύγκρισης (Comparison patterns)Comparison patterns)Patterns με τα οποία γίνεται σύγκριση δύο στοιχείων με χρήση τελεστών όπως =, <, > καθώς και τελεστών σύγκρισης για strings. Χρησιμοποιούνται για σύγκριση αριθμών και strings.

• Σύνθετα Σύνθετα patterns (Compound patterns)patterns (Compound patterns)Δημιουργούνται από άλλα patterns με χρήση των λογικών τελεστών and (&&), or (||) και not (!). Χρησιμοποιούνται για σύγκριση αριθμών και strings και συνδυασμού αριθμών με strings.

Page 15: AWK

Η γλώσσα awk - Patterns

• Pattern Pattern περιοχήςπεριοχής--ζώνης (ζώνης (Range patternsRange patterns))Χρησιμοποιούνται για αναζήτηση γραμμών μεταξύ μιας εμφάνισης ενός pattern και μιας εμφάνισης ενός δεύτερου pattern.

• BEGIN BEGIN και και END patternsEND patternsΠρόκειται για ειδικά ενσωματωμένα patterns που στέλνουν οδηγίες σε ένα πρόγραμμα awk για την εκτέλεση ενεργειών (actions) πριν ή μετά τον κύριο βρόχο επεξεργασίας.

Page 16: AWK

Η γλώσσα awk – String Patterns

• Σε ένα awk πρόγραμμα μπορούν να χρησιμοποιηθούν:– Ενα απλό string pattern (π.χ /Rumson/)– Ενα string pattern που να περιέχει ειδικούς

χαρακτήρες από μια κανονική έκφραση:• 1952 (αναζήτηση του 1952)• \t (το escape sequence του χαρακτήρα tab)• ^15 (αναζήτηση του 15 στην αρχή μιας γραμμής)• 29$ (αναζήτηση ενός string με το 29 στο τέλος μιας

γραμμής)• [123] (αναζήτηση του 1, 2, ή 3)• [1-3] (επίσης αναζήτηση του 1, 2, ή 3)

Page 17: AWK

Η γλώσσα awk – String Patterns

Θεωρείστε το αρχείο inventory με περιεχόμενα:

pencils 108 .11 .15markers 50 .45 .75memos 24 .53 .75notebooks 15 .75 1.00erasers 200 .12 .15books 10 1.00 1.50

• /marker*/ (αναζήτηση του marker ή markers)• /^books/ (αναζήτηση του books και όχι του notebooks)

Page 18: AWK

Η γλώσσα awk – String Patterns

– Μια string έκφραση που περιέχει τελεστές string όπως είναι οι τελεστές σύγκρισης.• $2 ~ /^15/ (αναζήτηση του πεδίου 2 αν αρχίζει από 15)• $2 ~ /^15$/ (αναζήτηση του πεδίου 2 αν είναι το 15)• $1 == $3 (έλεγχος αν το πεδίο 1 είναι το ίδιο με το πεδίο 3)• $1 != “pencils” (αναζήτηση γραμμών στις οποίες το πεδίο 1

δεν είναι “pencils”)• $2 > “Johnson” (αναζήτηση γραμμών στις οποίες το πεδίο 2

ακολουθεί το “Johnson” με αλφαβητική σειρά)• $4 != $3 +15 (αναζήτηση γραμμών στις οποίες το πεδίο 4 δεν

είναι ίσο με το άθροισμα του πεδίου 3 και του αριθμού 15)• $1 + $2 >= 13 (αναζήτηση γραμμών στις οποίες το άθροισμα

των πεδίων 1 και 2 είναι μεγαλύτερο από ή ίσο με τον αριθμό 13)• $1 > $2 + day (αναζήτηση γραμμών στις οποίες το πεδίο 1

είναι μεγαλύτερο από το άθροισμα του πεδίου 2 και της μεταβλητής day)

Page 19: AWK

Η γλώσσα awk – String Patterns

• ΠαράδειγμαΠαράδειγμα προγράμματος που λειτουργεί σε ένα αρχείο κειμένου μορφοποιημένο για την troff. Ενα συνηθισμένο λάθος στα αρχεία troff είναι η παράλειψη να κλείσει ένα display που ξεκινά με .DS (Display Start) με το αντίστοιχό του .DE (Display End). Το πρόγραμμα που ακολουθεί ελέγχει αν για κάθε .DS υπάρχει το αντίστοιχο .DE

/\.DS/ && display==1 {print “Missing DE before line ” NR}

/\.DS/ && display==0 {display=1}

/\.DE/ && display==0 {print “Extra DE at line ” NR}

/\.DE/ && display==1 {display=0;discountt++}

END {print “Found ” discountt “ matched displays”}

• /200/,/299/ (αναζήτηση γραμμών στις οποίες βρίσκεται ένας αριθμός από το 200 μέχρι και το 299)

Page 20: AWK

Η γλώσσα awk – Numeric Patterns και BEGIN / END

• Ολα τα string patterns που περιγράφηκαν λειτουργούν και για numeric patterns εκτός από αυτά των κανονικών εκφράσεων και από τον τελεστή tilde (~).

• $1 < 10 && $2 <= 30 (αναζήτηση γραμμών όπου το πεδίο 1 είναι μικρότερο του 10 και το πεδίο 2 μικρότερο από ή ίσο με το 30)

• Το ειδικό pattern BEGIN υποδηλώνει ότι η ενέργεια που έπεται θα εκτελεστεί πριν από την επεξεργασία οποιασδήποτε άλλης εισόδου (δηλ. πριν το διάβασμα της πρώτης γραμμής).

• Το ειδικό pattern END υποδηλώνει ότι η ενέργεια που έπεται θα εκτελεστεί μετά και από την τελευταία επεξεργασία εισόδου (δηλ. μετά το διάβασμα της τελευταίας γραμμής).

• BEGIN {FS=“,”;print “Name On hand CostPrice”} (θέτει το field separator σε , με χρήση της μεταβλητής FS και εμφανίζει μια επικεφαλίδα στην αρχή μιας λίστας)

• $nawk ‘END {print NR}’ inventory (διαβάζει τις γραμμές του αρχείου inventory και εμφανίζει τον αριθμό των γραμμών χρησιμοποιώντας τη μεταβλητή NR)

Page 21: AWK

Η γλώσσα awk – Ενέργειες (Actions)

• Εμφάνιση γραμμών (print).

• Εκχώρηση τιμής σε μεταβλητή.

• Κλήση δομών ελέγχου.

• Κλήση συναρτήσεων οριζόμενων από το χρήστη.

• Χρήση ειδικών εντολών για τον έλεγχο εισόδου/εξόδου (input/output).

Page 22: AWK

Η γλώσσα awk – Μεταβλητές (Variables)

• Οι μεταβλητές σε ένα πρόγραμμα awk μπορούν να περιέχουν strings ή αριθμούς.

• Το όνομα μιας μεταβλητής αρχίζει με ένα γράμμα και μπορεί να αποτελείται από γράμματα, αριθμούς και το _ (underscore).

• Δε γίνεται δήλωση μεταβλητών. Καθορίζεται ο τύπος τους από τον τρόπο που χρησιμοποιούνται και αλλάζει εφόσον αλλάζει και ο τρόπος.

• Αρχική τιμή σε μια μεταβλητή είναι το null για τα strings και το 0 για τις αριθμητικές μεταβλητές.

• Ολές οι μεταβλητές είναι καθολικές (global) σε ένα awk πρόγραμμα αλλά όχι και για τις συναρτήσεις που ορίζονται από το χρήστη.

• Η γλώσσα awk επιτρέπει τη δημιουργία μεταβλητών, την εκχώρηση τιμών σε αυτές και την εκτέλεση διαφόρων λειτουργιών πάνω σε μια μεταβλητή.

Page 23: AWK

Η γλώσσα awk – Ενσωματωμένες Μεταβλητές (Built –In Variables)

Μεταβλητή (Μεταβλητή (VariableVariable)) ΠεριγραφήΠεριγραφή

FS Input field separator

OFS Output field separator

NF Number of fields in the current record

NR Number ofn records read so far

FILENAME Name of the input file

FNR Record number in current file

RS Input record separator

ORS Output record separator

OFMT Output format for numbers

RLENGTH Set by the match function to match length

RSTART Set by the match function to match length

SUBSEP Subscript separator, used in arrays

ARGC Number of command line arguments

ARGV Array of command line arguments

Page 24: AWK

Η γλώσσα awk – Ενέργειες με Πεδία και Αριθμούς Πεδίων

• Τα πεδία (field identifiers) και οι αριθμοί των πεδίων (field numbers) αποτελούν ένα ειδικό είδος ενσωματωμένων μεταβλητών.

• Μπορεί να τους εκχωρηθεί τιμή, να τροποποιηθεί η τιμή τους και να συγκριθούν με άλλες μεταβλητές αριθμητικές ή strings.

• Με αυτό τον τρόπο μπορούν να δημιουργηθούν νέα πεδία, να διαγραφεί κάποιο πεδίο, ή να αλλάξει η σειρά δύο ή περισσότερων πεδίων ενός αρχείου.Παράδειγμα: pencils 108 .11 .15

• {$5 = $2 * $4print $0} (υπολογισμός της συνολικής αξίας κάθε στοιχείου του αρχείου, πολλαπλασιάζοντας σε κάθε γραμμή το πεδίο 2 με το πεδίο 4 και δημιουργώντας ένα 5ο πεδίο με τη συνολική τιμή στο τέλος κάθε γραμμής και εμφάνιση τέλος ολόκληρης της γραμμής)

• /pencil*/ {$6=“Empire”} (δημιουργία ενός νέου πεδίου, του πεδίου 6, σαν πεδίο string, με περιεχόμενο τη λέξη “Empire”.

• {print $NF} (εμφάνιση του τελευταίου πεδίου και όχι του αριθμού των πεδίων σε ένα αρχείο όπου το πλήθος των πεδίων κυμαίνεται από γραμμή σε γραμμή (not fixed).

Page 25: AWK

Η γλώσσα awk – Συναρτήσεις και Λειτουργίες με Strings

• Εκχώρηση τιμής σε μεταβλητή string• label = “inventory” (εκχώρηση της τιμής inventory

στη μεταβλητή label. Η χρήση των εισαγωγικών είναι υποχρεωτική, διαφορετικά εκχωρείται το περιεχόμενο της μεταβλητής inventory στη μεταβλητή label)

• Συνένωση δύο string μεταβλητών σε μία• code = $6 “001” (π.χ για τη γραμμήpencils 108 .11 .15 Empire γίνεται

pencils 108 .11 .15 Empire001)

• Συναρτήσεις για μεταβλητές string• Χρήση λογικών τελεστών για τη δημιουργία

σύνθετων patterns

Page 26: AWK

Η γλώσσα awk – Συναρτήσεις και Λειτουργίες με Αριθμούς

• Χρήση των αριθμητικών τελεστών +,-,*,/,% και ^• Χρήση των τελεστών εκχώρησης =,+=,-=,*=,/=,%=

και ^=• Χρήση των τελεστών αύξησης και μείωσης ++ και --• Χρήση των ενσωματωμένων αριθμητικών συναρτήσεων:

– cos (συνημιτόνου),– atan2 (εφαπτομένης),– log (λογάριθμου),– exp (exponential),– int (ακέραιο μέρος αριθμού),– rand (τυχαίος αριθμός μεταξύ 0 και 1).

Page 27: AWK

Η γλώσσα awk – Πίνακες• Η χρήση ενός πίνακα σε ένα awk πρόγραμμα δεν απαιτεί την

προηγούμενη δήλωση ή τον ορισμό του πίνακα. Ορίζοντας το περιεχόμενο ενός στοιχείου του πίνακα, ορίζεται αυτόματα ο πίνακας.

• Στην awk υπάρχουν οι λεγόμενοι associative arrays, πίνακες που χρησιμοποιούν strings αντί για αριθμούς στην περιγραφή μιας θέσης του πίνακα, π.χ. votes[republicants] και votes[democrats].

• Ορισμός πίνακα:– Με την εκχώρηση μιας τιμής σε αυτόν

• stock[1] = $2

– Με την εκχώρηση μιας τιμής σε αυτόν, π.χ. στη θέση που ονομάζεται από την τιμή του πεδίου 1• number[$1] = $2

Αν η τιμή του πεδίου 1 είναι pencils τότε δημιουργείται ένα στοιχείο στον πίνακα ως εξής: number[pencils] = 108

Page 28: AWK

Η γλώσσα awk – Πίνακες• Χρήση πίνακα:

– Σαν οποιαδήποτε άλλη μεταβλητή– Με χρήση της επαναληπτικής διαδικασίας for-in

επιτυγχάνεται πρόσβαση σε όλα τα στοιχεία ενός πίνακα, π.χ.• /\.DS/ {count[“display”]++}/\.BL/ {count[“bullet”]++}/\.TS/ {count[“table”]++}END {for (s in count) print s, count[s]}

– Χρήση της συνάρτησης διαγραφής ενός στοιχείου από ένα πίνακα:• Delete array[subscript]

– Ελεγχος ύπαρξης ενός στοιχείου σε ένα πίνακα:• subscript in array

επιστρέφει την τιμή 1 αν το στοιχείο array[subscript] υπάρχει και 0 αν δεν υπάρχει.

Page 29: AWK

Η γλώσσα awk – Συναρτήσεις Οριζόμενες από το Χρήστη

• Συναρτήσεις που ορίζονται μέσα σε ένα πρόγραμμα awk και καλούνται από αυτό. Μπορούν να οριστούν παράμετροι σε μια συνάρτηση (τιμές ή μεταβλητές) και μπορεί να επιστρέφει μία τιμή.

• Με τον ορισμό μιας συνάρτησης, μπορεί να γίνει χρήση αυτής είτε σε pattern είτε σε action, οπουδήποτε γενικά θα μπορούσε να χρησιμοποιηθεί μια ενσωματωμένη συνάρτηση (π.χ. length()).

• Ορισμός συνάρτησης:– Για τον ορισμό μιας συνάρτησης προσδιορίζονται το όνομά της, οι

παράμετροί της και οι ενέργειες που θα εκτελέσει, με την ακόλουθη μορφή:

• function function_name(list of parameters) {action_list}Παράδειγμα:function in_range(testval,lower,upper) {if (testval > lower && testval < upper)

return 1else

return 0}

Page 30: AWK

Η γλώσσα awk – Συναρτήσεις Οριζόμενες από το Χρήστη

– Δεν επιτρέπεται το κενό ανάμεσα στο όνομα της συνάρτησης και στην αριστερή παρένθεση της λίστας των παραμέτρων.

– Το return είναι προαιρετικό αλλά αν δε χρησιμοποιηθεί δεν επιστρέφεται τιμή.

• Κλήση συνάρτησης:– Μετά τον ορισμό μιας συνάρτησης η κλήση γίνεται όπως ακριβώς με μια

ενσωματωμένη συνάρτηση, π.χ.:• if (in_range($5,10,15))print “Found a match!”

– Οι συναρτήσεις μπορούν να είναι αναδρομικές, π.χ.:• function factorial(n) {if (n<=1)

return 1else

return n * factorial(n-1)}

Η κλήση της συνάρτησης μπορεί να είναι π.χ. print factorial(3)

Page 31: AWK

Η γλώσσα awk – Δομές Ελέγχου• Η δομή ifif:

– if (condition) action<l>Παράδειγμα:/pencil*/ {pencils += $2}

END {if(pencils < 144) print “Must order more pencils”}

• Η δομή if – thenif – then σε μια γραμμή:– expression1 ? expression2 : expression3

Παράδειγμα:$1 > 50000 ? ++high : ++low

• Η δομή whilewhile:– while(condition) {

action}Παράδειγμα: Smith 546 235 100 230{ sum=0 Major 340 120

I=2 Minor 459 104 780while (I<=NF) {

sum += $Ii++}

average=sum/(NF-1)print “The average for “ $1 “ is “ average }

Page 32: AWK

Η γλώσσα awk – Δομές Ελέγχου• Η δομή do-whiledo-while:

– do action while(condition)

• Η δομή fforor:– for (initial statement; test; increment) statement

Παράδειγμα:{sum=0

for (i=2; i<=NF; i++) sum+=$I average=sum/(NF-1) print “The average for “ $1” is “ average}

• Η εντολή breakbreak:– Προκαλεί την έξοδο από τον πιο άμεσο (εσωτερικότερο) βρόχο.

• Η εντολή exitexit:– Προκαλεί τη διακοπή της ανάγνωσης της εισόδου. Όταν σε ένα

πρόγραμμα awk βρεθεί ένα exit, τότε ο έλεγχος του προγράμματος μεταφέρεται στην END εφόσον υπάρχει αλλιώς σταματάει το πρόγραμμα awk.

Page 33: AWK

Η γλώσσα awk – Είσοδος - Έξοδος• Είσοδος από αρχείο

– Διάβασμα μιας γραμμής από το stdin και εκχώρηση αυτής σε μια μεταβλητή.• getline X

– Για το διάβασμα μιας γραμμής από αρχείο γίνεται ανακατεύθυνση στη getline.• getline < “my_file”

– Διάβασμα μιας γραμμής από ένα αρχείο και εκχώρηση αυτής σε μια μεταβλητή.• getline var < “my_file”

• Είσοδος από το πληκτρολόγιο– Διάβασμα στοιχείων από το πληκτρολόγιο για την άμεση ενημέρωση ενός αρχείου.

• {print $1, “Old price:”, $4getline new < “/dev/tty”$4=newprint “New price:”, $0 > “outputfile”}

• Είσοδος από την έξοδο άλλης εντολής (|)– Διάβασμα του αρχείο ως έξοδο μιας άλλης εντολής.

• sort input_file | nawk –f progfile

• Έξοδος στην οθόνη– Η εντολή printprint:

• print expr1, expr2, …• BEGIN { OFS=“\t” } {print $1, $4}

– Η εντολή printfprintf