10o ΕΡΓΑΣΤΗΡΙΟ ΣΤΟΧΟΣ Φίλτρα και sed ΑΣΚΗΣΗ 1 Να γραφτεί πρόγραμμα σεναρίου κελύφους με όνομα tabbing. Σο πρόγραμμα σεναρίου κελύφους να δέχεται απεριόριστο πλήθος ορισμάτων. Σο κάθε όρισμα εκφράζει όνομα αρχείου. Να ελέγχει την ύπαρξη των αρχείων, και να εμφανίζει τα περιεχόμενα των αρχείων προσθέτοντας στην αρχή κάθε γραμμής τον χαρακτήρα tab. Η εντολή sed είναι εντολή φίλτρο. Διαβάζει την είσοδό της (ή από αρχείο αν οριστεί) και εφαρμόζει επάνω στην είσοδο τις εντολές που ορίζονται. ύνταξη: sed [OPTIONS] εντολή sed [FILES] H sed δέχεται διάφορες εντολές όπως: d delete lines p print lines s substitute (αντικατάσταση) Η εντολή της sed έχει την εξής μορφή: [Where] [command][/command args][/flags] [where]: που (σε ποιες γραμμές) θα εφαρμοστεί η εντολή [command]: ποια εντολή (d ή p ή s) [command args]/[flags] ανάλογα με την εντολή. Χρησιμεύουν στην εντολή s WHERE: Εκφράζεται Είτε με εύρος γραμμών, πχ: 3,8 (από την 3 η έως και την 8 η γραμμή) πχ: sed '3,8d ' /etc/passwd (θα εμφανίζει τα περιεχόμενα του αρχείου /etc/passwd χωρίς τις γραμμές 3-8) Είτε με αριθμό γραμμής πχ: 10 (στην 10 η γραμμή) πχ: sed '1d ' /etc/passwd (θα εμφανίζει τα περιεχόμενα του αρχείου /etc/passwd χωρίς την 1 η γραμμή)
υντομογραφία το $ - σημαίνει η τελευταία γραμμή. 5,$ (από την 5 η έως την τελευταία γραμμή) Είτε με μια κανονική έκφραση η οποία περιέχεται ανάμεσα σε / /, πχ: sed '/^[0-9]/d ' /etc/passwd (μην εμφανίζεις τις γραμμές που ξεκινούν με αριθμό) Είτε με 2 κανονικές εκφράσεις χωρισμένες με κόμμα, που σημαίνει από την γραμμή που θα βρεθεί η 1 η κανονική έκφραση μέχρι την γραμμή που θα βρεθεί η 2 η κανονική έκφραση. Πχ: sed '/^Α/,/Β$/d ' file (μην εμφανίζεις από την γραμμή που ξεκινά με Α μέχρι την γραμμή που τελειώνει σε Β. Είτε με τίποτα. Σότε εφαρμόζεται η εντολή σε ολόκληρο το αρχείο εισόδου. Εντολή substitute Χρειάζεται 2 ορίσματα. Σι θα αντικαταστήσει και με τι θα το αντικαταστήσει. Πχ: sed 's/asidirop/antonis/ ' όπου βρεθεί το string asidirop θα αντικατασταθεί με το antonis. ls l sed '2,$ s/studin/none/ ' την έξοδο της ls l, στις γραμμές από την 2 η μέχρι την τελευταία άλλαξε το studin σε none. Μόνο μια αντικατάσταση θα πραγματοποιηθεί ανά γραμμή. Εάν θέλουμε να γίνουν πολλές αντικαταστάσεις πρέπει να δοθεί το όρισμα /g στην substitute: ls l sed '2,$ s/studin/none/g' την έξοδο της ls l, στις γραμμές από την 2 η μέχρι την τελευταία άλλαξε το studin σε none όσες φορές και αν βρεθεί ανα γραμμή. ls l sed '2,$ s/[0-9]/x/ g' total 211508 drwxr-xr-x X asidirop asidirop XXXX XXXX-XX-XX XX:XX Adopse_video drwxr-xr-x X asidirop asidirop XXXX XXXX-XX-XX XX:XX aetos_data drwxr-xr-x X asidirop asidirop XXXX XXXX-XX-XX XX:XX aetosdb_data -rw-r--r-- X asidirop asidirop XXXX XXXX-XX-XX XX:XX alex.png την έξοδο της ls l, στις γραμμές από την 2 η μέχρι την τελευταία οποιοδήποτε αριθμητικό ψηφίο σε Χ. ls l sed -r '2,$ s/[0-9]+/x/ g' total 211508 drwxr-xr-x X asidirop asidirop X X-X-X X:X Adopse_videos drwxr-xr-x X asidirop asidirop X X-X-X X:X aetos_data drwxr-xr-x X asidirop asidirop X X-X-X X:X aetosdb_data -rw-r--r-- X asidirop asidirop X X-X-X X:X alex.png To r οδηγεί την sed να χρησιμοποιήσει το extended set κανονικών εκφράσεων ERE (και όχι το basic set - BRE) την έξοδο της ls l, στις γραμμές από την 2 η μέχρι την τελευταία, οποιονδήποτε συνδυασμό αριθμητικών ψηφίων σε Χ.
ΑΣΚΗΣΗ 2 Να γραφτεί πρόγραμμα σεναρίου κελύφους με όνομα ls2. Σο πρόγραμμα σεναρίου κελύφους να κάνει ls l στον τρέχον κατάλογο, αφαιρώντας όμως από το αποτέλεσμα την στήλη με τα δικαιώματα χρήσης. Επίσης να ταξινομεί τα αρχεία με βάση το μέγεθός τους. Έξοδος κανονικής ls -l: aetos_lib_29_$ls -l total 40 -rw-r--r-- 1 asidirop it 902 Dec 5 21:28 common.pl -rw-r--r-- 1 asidirop it 1651 Jun 7 2004 config.pl -rw-r--r-- 1 asidirop it 5518 Dec 6 20:45 db.pl -rw-r--r-- 1 asidirop it 3310 May 30 2004 layout.pl Έξοδος του προγράμματός μας: aetos_lib_30_$./ls2 total 40 1 asidirop it 902 Dec 5 21:28 common.pl 1 asidirop it 1651 Jun 7 2004 config.pl 1 asidirop it 3310 May 30 2004 layout.pl 1 asidirop it 5518 Dec 6 20:45 db.pl ΑΣΚΗΣΗ 3 Α. Να γραφτεί ένα σενάριο κελύφους με όνομα urlparse. Σο script αυτό να δέχεται ακριβώς ένα όρισμα. Σο όρισμα εκφράζει όνομα αρχείου το οποίο περιέχει URLs. Πχ file1: http://www.it.teithe.gr/kerveros/~diplomat/index.html http://www.deitel.com/~books.cgi/os3e/ http://www.parinux.org/pipermail/linux/2001june/016876.html http://cs.vt.labs.edu/~cs27_04/spring05/mcpherson/note/ch1.pdf http://www.cs.may.ie/~dtray/cs211/lecture1/intro04.htm http://www.csse.monash.edu.au/courseware/~cse 1303/parta/lecture/ http://www.amazon.com/exec/obidos/27/algorithms-on_trees.htm http://www.amazon.com/exec/obidos http://www.it.teithe.gr/~asidirop http://www.it.teithe.gr/index.html To script θα πρέπει να κάνει τους απαραίτητους ελέγχους σε σχέση με τα ορίσματα, και να εμφανίζει τα hostnames (bold) από το αρχείο. aetos_lib_30_$./parse_url file1 www.it.teithe.gr www.deitel.com www.parinux.org cs.vt.labs.edu www.cs.may.ie www.csse.monash.edu.au www.amazon.com
www.amazon.com www.it.teithe.gr www.it.teithe.gr Β. Δημιουργείστε το script url_parse2, το οποίο θα εμφανίζει τα μοναδικά hostnames και θα μετράει το πλήθος εμφανίσεων του καθενός. aetos_lib_30_$./parse_url2 file1 1 cs.vt.labs.edu 2 www.amazon.com 1 www.cs.may.ie 1 www.csse.monash.edu.au 1 www.deitel.com 3 www.it.teithe.gr 1 www.parinux.org την sed (όπως και στην grep) μπορούμε να κάνουμε back-reference με τις παρενθέσεις. Πχ: asidirop@dell:~$ who asidirop tty7 2012-05-25 11:56 (:0) asidirop pts/0 2012-05-25 12:06 (:0.0) asidirop pts/1 2012-05-25 12:48 (:0.0) asidirop@dell:~$ who sed -r 's/^([^ ]+)[ ]+([^ ]+)[ ]/\2 \1 /' tty7 asidirop 2012-05-25 11:56 (:0) pts/0 asidirop 2012-05-25 12:06 (:0.0) pts/1 asidirop 2012-05-25 12:48 (:0.0) Η παραπάνω κανονική έκφραση θα ταιριάξει στις 2 πρώτες στήλες της εξόδου της εντολής who. τον buffer \1, αποθηκεύουμε αυτό που ταίριαξε από την αρχή γραμμής μέχρι το πρώτο space. τον buffer \2 αποθηκευουμε αυτό που ταίριαξε από το space μέχρι το επόμενο space. Αντικαθιστούμε το τμήμα της γραμμής που ταίριαξε στην κανονική έκφραση με το «\2 \1». ΑΣΚΗΣΗ 4 Να γραφτεί πρόγραμμα σεναρίου κελύφους με όνομα times. Σο πρόγραμμα σεναρίου κελύφους θα κάνει ls l στον τρέχον κατάλογο, και από την έξοδο της ls θα κρατάει μόνο τις γραμμές που περιέχουν ώρα (πχ: 20:34) (με grep) από αυτές τις γραμμές θα κρατάει μόνο την στήλη που περιέχει την ώρα. (με sed) Έπειτα να κάνει αντιστροφή της ώρας και να εμφανίζει πρώτα τα λεπτά και μετά την ώρα. Πχ το 15:45 να γίνεται 45:15. (με sed)
ΑΣΚΗΣΗ 5 Έστω ότι δίνεται ένα αρχείο όπως παρακάτω (log.sql) το οποίο περιέχει sql εντολές (αν δεν γνωρίζετε τι είναι η sql δεν πειράζει). Σο αρχείο αυτό περιέχει ημερομηνίες στην μορφή ΜΗΝΑ-ΗΜΕΡΑ-ΕΣΟ. Θέλουμε να αλλάξουμε την μορφή των ημερομηνιών σε ΕΣΟ-ΜΗΝΑ-ΗΜΕΡΑ Φτιάξτε ένα σενάριο κελύφους με όνομα dates_correct το οποίο θα δέχεται 2 ορίσματα. Σο 1 ο όρισμα είναι το αρχείο με τα δεδομένα (πχ: log.sql). Σο 2 ο όρισμα είναι το αρχείο που θα δημιουργήσετε (πχ: log_corrected.sql) και θα περιέχει ότι και το 1 ο με τις ημερομηνίες τροποποιημένες. Να πραγματοποιήσετε τους απαραίτητους ελέγχους αν υπάρχουν τα ορίσματα, αν υπάρχει το αρχείο με τα δεδομένα αν υπάρχει το αρχείο στο οποίο θέλουμε να σώσουμε τα αποτελέσματα. Να αποθηκεύσετε στο αρχείο (2 ο όρισμα) το αποτέλεσμα. FILE: log.sql values('8036','i84kj83lvkcif90rhefn6om174','3763','113763','109.242.255.213','','05-23-2012'); values('8086','7norrq6hcfaqaq7kq0f7i0bko1','3668','103668','195.251.123.10','','05-23-2012'); values('8136','d9v48gt98m54f6rfr01sks2r72','3472','93472','79.103.159.2 26','','05-23-2012'); values('8186','rnpaamipvqvmpqs5prtr37ej77','3002','63002','46.177.210.2 04','','05-23-2012'); values('8236','sek60eaofudv2loejvavcbrq62','3708','113708','79.103.156. 188','','05-24-2012'); values('8286','69hmh48pk82v6e83mpe169suf5','3717','113717','195.251.240.62','192.168.9.14','05-24-2012'); values('8336','uilkvel5rrkpt5te66lo2gam71','3419','83419','195.251.123. 15','','05-24-2012'); values('8386','6qe2oara7kf3t9lt1pcntfurc5','3479','93479','195.251.123. 15','','05-24-2012'); values('8436','vjil0138h4j9gc047n1bi8nrn3','3785','113785','37.32.167.5 1','','05-24-2012'); Για το παπαπάνω παπάδειγμα το απχείο εξόδου θα ππέπει να πεπιέχει: values('8036','i84kj83lvkcif90rhefn6om174','3763','113763','109.242.255.213','','2012-05-23');
values('8086','7norrq6hcfaqaq7kq0f7i0bko1','3668','103668','195.251.123.10','','2012-05-23'); values('8136','d9v48gt98m54f6rfr01sks2r72','3472','93472','79.103.159.2 26','','2012-05-23'); values('8186','rnpaamipvqvmpqs5prtr37ej77','3002','63002','46.177.210.2 04','','2012-05-23'); values('8236','sek60eaofudv2loejvavcbrq62','3708','113708','79.103.156. 188','','2012-05-24'); values('8286','69hmh48pk82v6e83mpe169suf5','3717','113717','195.251.240.62','192.168.9.14','2012-05-24'); values('8336','uilkvel5rrkpt5te66lo2gam71','3419','83419','195.251.123. 15','','2012-05-24'); values('8386','6qe2oara7kf3t9lt1pcntfurc5','3479','93479','195.251.123. 15','','2012-05-24'); values('8436','vjil0138h4j9gc047n1bi8nrn3','3785','113785','37.32.167.5 1','','2012-05-24');