Εργαστήριο Λειτουργικών Συστημάτων SED and AWK
Σύνδεση με τα προηγούμενα Από ποφ αντλείται θ δφναμθ του προγραμματιςμοφ SHELL? Στο Unix όλα είναι ζνα αρχεία Output redirection και pipes είναι βαςικά εγγραφι/ανάγνωςθ κατάλλθλων file descriptors. Το περιβάλλον του κελφφουσ ζχει λογικι όπωσ οι γλϊςςεσ προγραμματιςμοφ: for, foreach, if-else, switch, variables, evaluation... Υπάρχουν άπειρεσ μικρζσ εντολζσ των οποιϊν τα αποτελζςματα, χριςει των παραπάνω, μποροφν να ςυνδυαςτοφν: finger Bob grep Login awk,print$2":"$4""$5- lp Η διαχείριςθ κειμζνου δίνει επιπλζον δφναμθ sed και awk. 2
sed (stream editor) Είςοδοσ από αρχείο ι pipe - ζξοδοσ αντίςτοιχα Φιλτράρει και επεξεργάηεται το κείμενο ειςόδου και το δίνει ςτθν ζξοδο, τροποποιθμζνο κατά τον τρόπο που επιςθμάνκθκε και δίχωσ ιςχυρι επανατροφοδότθςθ: ςυνικωσ με κάποια εφρεςθ pattern και αντικατάςταςθ Επεξεργάηεται αρχεία κειμζνου ανά γραμμζσ Τον χρθςιμοποιοφμε όταν θ γνϊςθ για τθν πλθροφορία δεν βρίςκεται τόςο ςτθ δομι του αρχείου (γραμμζσ, ςτιλεσ) όςο ςτο κείμενο του 3
Αρχή Λειτουργίας pattern space = το υφιςτάμενο κείμενο όπωσ επεξεργάηεται (data buffer) while (!EOF) { } διαβάηει μια γραμμι ειςόδου ςτο pattern space εκτελεί μια ςειρά από εντολζσ επεξεργαςίασ επί του pattern space γράφει το pattern space ςτο stdout 4
Σύνταξη εντολής sed <options> <address> <command> address ζνασ αριθμόσ γραμμήσ του κειμζνου ειςόδου ι ζνα pattern που εμπεριζχεται ςε slashes ( /pattern/ ). Κακορίηει ποφ κα εφαρμοςτεί θ εντολι, δθλαδι ςε ποιζσ γραμμζσ Αν δεν ορίηεται, θ sed κα εφαρμοςτεί ςε κάθε γραμμι τθσ ειςόδου Το pattern περιγράφεται με regular expressions, όπωσ ςτθ grep Εάν δοκοφν δυο διευκφνςεισ χωριςμζνεσ με κόμμα, θ εντολι λειτουργεί ςτο πεδίο γραμμϊν μεταξφ τθσ πρϊτθσ και δεφτερθσ διεφκυνςθσ, ςυμπεριλαμβανομζνων των ιδίων! = NOT (εφαρμογι ςτισ διευκφνςεισ εκτόσ αυτϊν που περιγράφτθκαν) 5
Συνήθεις Εντολές Επεξεργασίας 6
Αντικατάσταση Η πλζον ςυνικθσ εντολι: sed s pattern/replacement/<flags> pattern: πρότυπο που αναηθτοφμε replacement: το string που κα αντικαταςτιςει το πρότυπο flags (προαιρετικά): n (number): ποια εμφάνιςθ (π.χ., 1 θ, 2 θ, ) του προτφπου κα αντικαταςτακεί g (global): αντικατάςταςθ όλων (όχι μόνο τθσ πρϊτθσ εμφάνιςθσ) των προτφπων που εμφανίηονται ςτθν τρζχουςα γραμμι p (print): εκτφπωςθ του περιεχομζνου του pattern space 7
Αρχείο προς παραδειγματισμό! # cat -n example.sed 1 This is the first line of an example text. 2 It is a text with erors. 3 Lots of erors. 4 So many erors, all these erors are making me sick. 5 This is a line not containing any errors. 6 This is the last line. 8
Παράδειγμα 1 # sed s/erors/errors/g example.sed This is the first line of an example text. It is a text with errors. Lots of errors. So many errors, all these errors are making me sick. This is a line not containing any errors. This is the last line. Τι κα ςυμβεί αν ςτθν εντολι αντικαταςτιςουμε το g με τον αρικμό 2; Τι αν το απομακρφνουμε εντελϊσ; 9
Παράδειγμα 2 Δφο ειδικά ςφμβολα: ˆ Αρχι γραμμισ $ Τζλοσ γραμμισ # sed s/ˆ/> / example.sed > This is the first line of an example text. > It is a text with erors. > Lots of erors. > So many erors, all these erors are making me sick. > This is a line not containing any errors. > This is the last line. Τι κα ςυμβεί αν ςτθν εντολι αντικαταςτιςουμε το ˆ με $ ; 10
Παράδειγμα 3 #sed -e s/erors/errors/g -e s/last/final/g example.sed (ι, εναλλακτικά) sed s/erors/errors/g; s/last/final/g example.sed This is the first line of an example text. It is a text with errors. Lots of errors. So many errors, all these errors are making me sick. This is a line not containing any errors. This is the final line. 11
Άλλοι ειδικοί χαρακτήρες _ ι, ι οποιοςδιποτε άλλοσ χαρακτιρασ μπορεί να πάρει τθ κζςθ του / για αναγνωςιμότθτα \: escape character &: Αντιςτοιχεί ςτο πρότυπο που ζχει βρεκεί (αναφερόμαςτε πάντα ςτθν τρζχουςα γραμμι) Προςοχι ςτο τι αποτελεί ςφμβολο regular expression και τι όχι 12
Παράδειγμα 4 # sed s/[ˆ ]*/(&)/ example.sed (This) is the first line of an example text. (It) is a text with erors. (Lots) of erors. (So) many erors, all these erors are making me sick. (This) is a line not containing any errors. (This) is the last line. Τι κα ςυνζβαινε αν το pattern ιταν [^a-z]/+/? 13
Παράδειγμα 5 Εκτφπωςθ μόνο των γραμμϊν που υπακοφουν ςτο πρότυπο μετά τθν αλλαγι τουσ κατά τουσ όρουσ τθσ αντικατάςταςθσ που ορίςτθκε: # sed -n s/erors/errors/gp example.sed It is a text with errors. Lots of errors. So many errors, all these errors are making me sick. 14
Εστίαση σε συγκεκριμένες γραμμές Μποροφμε να εςτιάςουμε ςε ςυγκεκριμζνεσ γραμμζσ τισ αλλαγζσ μασ, δθλϊνοντασ τισ γραμμζσ με τον αρικμό τουσ. # sed 1,3 s/erors/errors/g example.sed This is the first line of an example text. It is a text with errors. Lots of errors. So many erors, all these erors are making me sick. This is a line not containing any erors. This is the last line. 15
Εστίαση σε συγκεκριμένες γραμμές Το ίδιο μποροφμε να κάνουμε δίνοντασ ζνα κοινό τουσ pattern # sed /line/s/li/re/ example.sed This was the first rene of an example text. It is a text with errors. Lots of errors. So many errors, all these erors are making me sick. This was a rene not containing any errors. This was the last rene. 16
ιαγραφή sed -e /\/\ * /,/\ * \// s/.\+// -e s/ˆ[ \t]\+// -e /ˆ$/ d file.c 17
sed -- απλά Παραδείγματα Αντικατζςτθςε το "foo" με το "bar" μόνο ςτισ γραμμζσ που περιζχουν το "baz" sed /baz/s/foo/bar/g Σβιςε τα κενά από τθν αρχι και από το τζλοσ κάκε γραμμισ sed s/ˆ* \t]*//;s/[ \t+*$// Πρόςκεςε 5 κενά ςτθν αρχι κάκε γραμμισ sed s/ˆ/ / Σβιςε όλεσ τισ κενζσ γραμμζσ από ζνα αρχείο (όπωσ θ "grep. ") sed /ˆ$/d 18
awk awk: Alfred Aho, Peter Weinberger, and Brian Kernighan Mini γλϊςςα προγραμματιςμοφ ςχεδιαςμζνθ να βρίςκει και να ταιριάηει πρότυπα και να εκτελεί εντολζσ ςε αυτά Perl Μπορεί να ενεργιςει επί των δεδομζνων ειςόδου τθσ με ςφνκετεσ, αναδρομικζσ ςυναρτιςεισ (όπωσ ςτθ C) Επεξεργάηεται αρχεία κειμζνου ανά πεδίο Τθν χρθςιμοποιοφμε περιςςότερο όταν θ γνϊςθ για τθν πλθροφορία βρίςκεται ςτθ δομι του αρχείου (γραμμζσ, ςτιλεσ) Για πιο ςφνκετεσ πράξεισ, όπωσ αναδρομικι εργαςία ςε ςυμβολοςειρζσ ι θ μορφοποίθςθ εξόδου Όταν είναι απαραίτθτεσ ευκολίεσ μιασ υψθλοφ επιπζδου C-like γλϊςςασ, όπωσ πίνακεσ και εντολζσ ελζγχου ροισ 19
Χαρακτηριστικά Σε ςφνταξθ μοιάηει με τθ C Χειρίηεται τθν είςοδο, το διαχωριςμό πεδίων και τθ διαχείριςθ μνιμθσ αυτόματα Περιζχει τφπουσ δεδομζνων για ςυμβολοςειρζσ και αρικμοφσ ςυναρτιςεισ αρίκμθςθσ και ςυμβολοςειρϊν Όχι δθλϊςεισ τφπων μεταβλθτϊν Μεταβλθτζσ και ροι ελζγχου ςτισ ενζργειεσ Βολικόσ τρόποσ πρόςβαςθσ πεδίων μζςα ςε γραμμζσ Ευζλικτθ εκτφπωςθ 20
ομή Ζνα πρόγραμμα awk αποτελείται από: Ζνα προαιρετικό βιμα που εκτελείται πριν το διάβαςμα ειςόδου BEGIN Ζνα ηευγάρι πρότυπο ενζργεια (pattern -- action) επεξεργάηεται τα δεδομζνα ειςόδου εφαρμόηει τθν εντολι action για κάκε matching Ζνα προαιρετικό βιμα που εκτελείται μετά το διάβαςμα ειςόδου END 21
Πεδία και τελεστές Ζνα πρόγραμμα awk μπορεί να είναι ιδιαίτερα πολφπλοκο. Για να τρζξουμε ζνα awk πρόγραμμα μποροφμε να δϊςουμε ζνα ςφντομο program και input files (προαιρετικά, αφοφ τα δεδομζνα μπορεί να ζρχονται από pipe ι redirection) ωσ ορίςματα γραμμισ εντολισ awk program [input_file(s)] Ή ςτθ κζςθ του program να δϊςουμε ζνα αρχείο με τισ εντολζσ που αυτό κα περιζχει: awk -f program_file [input_file(s)] 22
Δομή προτύπων - ενεργειών Κάκε εντολι προγράμματοσ πρζπει να ζχει ζνα πρότυπο ι μια ενζργεια ι και τα δυο Εξ οριςμοφ (προκακοριςμζνο) πρότυπο είναι να ταιριάξει με όλεσ τισ γραμμζσ Εξ οριςμοφ (προκακοριςμζνθ) ενζργεια είναι να εκτυπϊςει τθν υφιςτάμενθ καταγραφι Τα πρότυπα απλά παρατίκενται, ενϊ οι ενζργειεσ εςωκλείονται ςε { } Η awk ανιχνεφει μια ακολουκία γραμμϊν, μια-μια, ψάχνοντασ για γραμμζσ που ταιριάηουν με το πρότυπο 23
Πρότυπα Προςδιοριςμόσ κατά πόςον μια ενζργεια-δράςθ πρόκειται να εκτελεςτεί Μπορεί να είναι: Το ειδικό token BEGIN ι END Κανονικι ζκφραςθ (εςωκλειόμενθ μζςα ςε / /) Σχεςιακζσ ι string αντιςτοιχίεσ εκφράςεων > < >= <= == Το ςφμβολο! δίνει το αντίκετο τθσ αντιςτοιχίασ Συνδυαςμόσ των πιο πάνω χρθςιμοποιϊντασ λογικοφσ τελεςτζσ && ι π.χ. /NYU/ && (name == UNIX Tools ) Pattern1? Pattern2 : Pattern3 If Pattern1 is true, then Pattern2, else Pattern3 24
Ενέργειες-δράσεις Περιλαμβάνει λίςτα από εκφράςεισ όπωσ ςτθ C ++ Increment, -- Decrement ^ Exponentiation +-! Πρόςκεςθ, Αφαίρεςθ, Άρνθςθ * / % Πολλαπλαςιαςμόσ, διαίρεςθ, modulo Εκτελείται για κάκε γραμμι που ταιριάηει το πρότυπο Εάν δεν δοκεί πρότυπο, θ δράςθ εκτελείται για κάκε γραμμι ειςόδου Εάν δεν δοκεί δράςθ, όλεσ οι γραμμζσ που ταιριάηουν με το πρότυπο ςτζλνονται ςτο stdout 25
Εγγραφές (records) Κάκε γραμμι τθσ ειςόδου είναι ζνα record Το υφιςτάμενο record μπορεί να παραπεμφκεί με το ςφμβολο $0 Πεδίο Field Κάκε λζξθ ςε ζνα record ονομάηεται πεδίο (field) Κάκε πεδίο αρικμείται και παραπζμπεται ωσ εξισ: $1 είναι θ πρϊτθ λζξθ, $2 είναι θ δεφτερθ λζξθ κλπ 26
Ειδικές προκαθορισμένες μεταβλητές RS Ο χαρακτιρασ που δρα ωσ ο οριοκζτθσ του record Εξ οριςμοφ είναι το τζλοσ τθσ γραμμισ (newline) Μπορεί να αλλάξει ςτθν BEGIN ενζργεια FS Ο χαρακτιρασ που δρα ωσ ο οριοκζτθσ του πεδίου (field) Εξ οριςμοφ είναι το white space (κενό διάςτθμα, tab κλπ) Μπορεί να ξανα-οριςκεί με τθν F επιλογι» awk Fc : ρυκμίηει το FS με τον χαρακτιρα c Μπορεί να αλλάξει και ςτθν BEGIN ενζργεια NF Αρικμόσ πεδίων ςτο υφιςτάμενο record NR Συνολικόσ αρικμόσ records που ζχουν διαβαςτεί μζχρι ςτιγμισ OFS Output Field Separator Εξ οριςμοφ είναι το μονό κενό διάςτθμα ORS Output Record Separator 27
Παράδειγμα 1 Εκτφπωςε όλθ τθν είςοδο τυπϊνοντασ πριν ζνα START και μετά ζνα STOP awk BEGIN,print "START"- {print $0} END {print "STOP"} foo.txt Εκτφπωςζ μου τα ονόματα των αρχείων ςτον τρζχοντα κατάλογο και τουσ χριςτεσ τουσ ls -l awk BEGIN { print "File\tOwner" } { print $8, "\t", $3} END { print "done"} Προςζξτε τα μονά ειςαγωγικά (a.k.a. αυτάκια)! Αν τα ξεχάςετε, το πρόγραμμα ςασ δεν κα τρζξει! 28
Παράδειγμα 2 bash-3.1# cat example.awk Line number 1 Line number 2 Line number 3 Line number 4 bash-3.1# awk BEGIN {print "Hello you"} /2/ {print $0} END,print "goodbye"- example.awk Hello you Line number 2 goodbye 29
Παράδειγμα 3 Εκτφπωςε τισ γραμμζσ των οποίων τα πεδία είναι > 3 και καλφπτουν το πρότυπο /file/ αλλιϊσ εκτφπωςε τισ γραμμζσ των οποίων τα πεδία είναι 3 και ξεκινοφν με το and Just a text file. Nothing to see here. Some lines have more fields than others and some ( <- blank line) are blank. bash-3.1# awk NF>3? /file/ : /ˆand/ {print $0} example2.awk Just a text file. Nothing to see here. and some 30
Παράδειγμα 4 Εκτφπωςε όλα τα αρχεία μθ μθδενικοφ μεγζκουσ με κατάλθξθ.txt bash-3.1# ls -l awk BEGIN {print "List of all.txt files"} /.txt$/ && $5>0 {print "line number:" NR, "file", $9, "of size:", $5} END {print "OK!!"} List of all.txt files line number:9 file file+1.txt of size: 10 line number:12 file output.txt of size: 4898 line number:13 file processes.txt of size: 12953 line number:16 file test-cut.txt of size: 55 line number:19 file test-sort.txt of size: 124 line number:20 file test-tr.txt of size: 40 OK!! 31
awk -- απλά Παραδείγματα (1) Τφπωςε τισ δφο πρϊτεσ ςτιλεσ (default FS=" ") με αντίςτροφθ ςειρά awk, print $2, $1 - file Τφπωςε τθ ςτιλθ 3 αν θ ςτιλθ 1 είναι μεγαλφτερθ από τθ ςτιλθ 2 awk $1 > $2,print $3- file Τφπωςε τθ γραμμι εμφάνιςθσ, τον αρικμό των ςτθλϊν και τθ ςτιλθ 1 κάκε γραμμισ awk,print NR, NF, $1- file Εκτφπωςε το 2 ο πεδίο ςε ζνα αρχείο όπου τα πεδία είναι χωριςμζνα με? awk F?,print $2- file Τφπωςε το αρχείο file αφοφ διαγράψεισ τθ 2θ ςτιλθ του awk,$2 = ""; print- file 32
Μεταβλητές Η awk μπορεί να ορίςει και να χρθςιμοποιιςει μεταβλθτζσ BEGIN { sum = 0 } { sum ++ } END { print sum } Οι μεταβλθτζσ αυτζσ μποροφν να πάρουν αρικμθτικι (ακζραια ι πραγματικι) τιμι ι ςυμβολοςειρά ΔΕΝ ΔΗΛΩΝΟΝΤΑΙ Εξ οριςμοφ, οι μεταβλθτζσ που ορίηουμε αρχικοποιοφνται με τθν αρικμθτικι τιμι 0 ( ->null string) 33
awk -- απλά Παραδείγματα (2) Τφπωςε όλεσ τισ γραμμζσ που διαφζρουν ανά δφο ςτθν πρϊτθ ςτιλθ awk $1!= prev, print; prev = $1 - file Τφπωςε μόνο τθν τελευταία γραμμι awk,line = $0- END,print line- 34
awk - μεταβλητές, ροή ελέγχου Λειτουργίεσ με μεταβλητζσ: Βρεσ το άκροιςμα και τον μζςο όρο των αρικμϊν τθσ 1θσ ςτιλθσ awk, s += $1 - END,print "sum is", s, " average is", s/nr- Ροή ελζγχου: for loop Τφπωςε όλεσ τισ ςτιλεσ με αντίκετθ ςειρά awk, for (i = NF; i > 0; --i) print $i - file Ροή ελζγχου: if-else Τφπωςε όλεσ τισ μθ κενζσ γραμμζσ των οποίων οι δυο πρϊτεσ ςτιλεσ είναι ίςεσ awk NF > 0, if($1 == $2) print $0- file 35
Μορφοποίηση εξόδου και συνδυασμοί Μορφοποίηςη με printf Τφπωςε και ςτοίχιςε όλα τα αρχεία < 1000 bytes και τα μεγζκθ τουσ ls -l awk, if ($5<1000) printf("file: %10s - Size %5d\n", $9, $5)- Συνδυαςτικό παράδειγμα Πρόςκεςε τουσ αρικμοφσ από τισ πρϊτεσ 10 γραμμζσ του file awk { } while(counter <= 10) { } for(i=1; i<=nf; i++) {sum += $i;} counter++; END {printf("sum of first 10 lines: %3d\n", sum)} file 36