ιαχείριση κειµένων µε τις grep, fgrep, egrep http://repfiles.kallipos.gr/html_books/79/0_chapter.html#sec_regexp ιαδραστικά σχηµατα.,.,.,.7,.8,.0,. και όλο το ο εργαστήριο στο.7 Ασκήσεις για εξάσκηση Find a pattern µε την grep (global regular expression print) Το grep είναι ένα utility πρόγραµµα που ψάχνει ένα ή περισσότερα από ένα αρχεία για γραµµές που περιέχουν strings ενός συγκεκριµένου πρότυπου/µοτίβου (pattern). Οι γραµµές που το ταιριάζουν (match the pattern) εµφανίζονται στην οθόνη. Η πιο απλή περίπτωση είναι ένα fixed string pattern - σταθερής ακολουθίας χαρακτήρων. Υπάρχουν όµως και πιο πολύπλοκα που καλούνται regular expressions. Το fgrep (fast ή fixed) utility µόνο για fixed character strings. Το egrep (extended) utility για full regular expressions. Fixed Character strings vassik@aetos:~/xunix/lab$ tail -0 /etc/passwd >pass vassik@aetos:~/xunix/lab$ cat pass dpapadop:x::08:papadopoulos Dimitrios:/home/student/x9899/dpapadop:/bin/bash oserkeli:x:7:0:serkelidis Orestis:/home/student/x9900/oserkeli:/bin/bash gtegos:x:9:000:tegos Georgios:/home/staff/it/gtegos:/bin/bash gquery:x:0:99:keramopoulos Euclid:/home/staff/ektaktoi/gquery:/bin/bash isinanis:x::0:sinanis Ioannis:/home/student/x/isinanis:/bin/bash gantoni:x::0:antoniadis Georgios:/home/student/x/gantoni:/bin/bash Στο αρχείο pass ψάχνουµε το string student, και µετά ψάχνουµε το string staff vassik@aetos:~/xunix/lab$ grep student pass dpapadop:x::08:papadopoulos Dimitrios:/home/student/x9899/dpapadop:/bin/bash oserkeli:x:7:0:serkelidis Orestis:/home/student/x9900/oserkeli:/bin/bash isinanis:x::0:sinanis Ioannis:/home/student/x/isinanis:/bin/bash κτλ vassik@aetos:~/xunix/lab$ grep staff pass gtegos:x:9:000:tegos Georgios:/home/staff/it/gtegos:/bin/bash gquery:x:0:99:keramopoulos Euclid:/home/staff/ektaktoi/gquery:/bin/bash vassik@aetos:~/xunix/lab$ tail - /etc/passwd >pass Στα δύο αρχεία pass και pass ψάχνουµε το string student vassik@aetos:~/xunix/lab$ grep student Στο αρχείο pass ψάχνουµε το string "Papadopoulos Dimitrios" // κτλ οι άλλες τελευταίες γραµµές pass pass Παίρνουµε µερικές σειρές από το /etc/passwd και δηµιουργούµε το αρχείο pass grep pattern [file ] pass:gdimitro:x:70:0:dimitropoulos_elezis Georgios_Konstantinos:/home/student/x/gdimitro:/bin/bash pass:gdimitro:x:70:0:dimitropoulos_elezis Georgios_Konstantinos:/home/student/x/gdimitro:/bin/bash vassik@aetos:~/xunix/lab$ grep "Papadopoulos Dimitrios" pass dpapadop:x::08:papadopoulos Dimitrios:/home/student/x9899/dpapadop:/bin/bash Ψάχνει (στο αρχείο/α) να βρει γραµµές που κάνουν match το pattern To string όταν περιέχει κενό πρέπει να µπεί µέσα σε (διπλά και ακόµη καλύτερα µονά) εισαγωγικά Μια εντολή της µορφής grep student staff pass θα έψαχνε στα αρχεία staff και pass να βρεί το string student (το ο όρισµα είναι το string, ενώ τα υπόλοιπα, εδώ o & o όρισµα, ονόµατα αρχείων) Αν δεν θέλουµε να βλέπουµε στο αποτέλεσµα τα ονόµατα των αρχείων βάζω option -h (header) []
Regular Expressions in Text pattern (Κανονικές εκφράσεις) Eκτός από ένα fixed string, µπορούµε στην grep να δώσουµε και ένα pattern (ή template) κειµένου που θέλουµε να βρεθεί π.χ. να βρεθούν όλες οι λέξεις µε γράµµατα που αρχίζουν από d, ή αυτές που έχουν ψηφία στο τέλος κτλ. (το αποτέλεσµα θα είναι πάντα γραµµές, που κάνουν match το pattern) Τέτοιες pattern (ή template) λέγονται κανονικές εκφράσεις (Regular Expressions) και «δουλεύουν» όπως τα wildcards που είδαµε στα ονόµατα των αρχείων και των directories δηλ. χρησιµοποιούν κάποιους χαρακτήρες µε ειδικό νόηµα τους metacharacters. Εστω το παρακάτω αρχείο µε όνοµα grape που έχει 7 γραµµές: 7 How long, how long, in infinite Pursuit Better be merry with the fruitful Grape..Than sadden after none, or bitter, fruit.. How long... η γραµµή η γραµµή η γραµµή (έχει tab) η γραµµή (έχει κενά) η γραµµή (έχει κενό) η γραµµή (έχει tab) 7 η γραµµή (δεν περιέχει κενό) και θέλω π.χ. να βρω από το αρχείο grape τις γραµµές που αρχίζουν µε How και τις κενές (τα ^How και ^$ είναι κανονικές εκφράσεις ή RE ή regex ) vassik@aetos:~/xunix/lab$ grep --color ^How grape How long, how long, in infinite Pursuit vassik@aetos:~/xunix/lab$ grep -n ^$ grape 7: vc option --color χρωµατίζει µε π.χ. κόκκινο χρώµα τα ταιριάζοντα pattern option -n (number) δίνει και το νούµερο της γραµµής Τι σηµαίνει Π.χ. Γραµµές που Ν ο γρ. Σχόλια (fixed string) Ηοw έχουν τo How, Τα fixed που είδαµε πριν anchors Regular expressions ^ αρχή γραµµής ^How ξεκινούν µε τo How H η ξεκινά µε tab $ τέλος γραµµής uit$ τελειώνουν µε τo uit Η η έχει στο τέλος και µια τελεία ^$ κενές/άδειες γραµµές 7 Η η θα έχει κενά! '^How long $' έχουν το 'Ηow long ' - H η ξεκινά µε tab '^.' ξεκινούν µε κενό, Τα κενά λοιπόν παίζουν «ρόλο», vassik@aetos:~/xunix/lab$ grep -n '^ ' grape : Than sadden after none, or bitter, fruit. : vc πρέπει να µπαίνουν σε εισαγωγικά: Για να αντιγράψετε το αρχείο grape στο φάκελο που είστε: cp ~vassik/myunix/labs/lab0/grape. Το ^ είναι anchor µόνο στην αρχή, το $ µόνο στο τέλος, σε άλλο σηµείο χάνουν την µετασηµασία τους π.χ. το [^a] σηµαίνει δεν έχει a. []
Τι σηµαίνει pattern Γραµµές που Ν ο γρ. Σχόλια. ένας οποιοσδήποτε ' T....' έχουν λέξεις από Τ και, χαρακτήρας chars (κενό πριν/µετά) 7 Όπου υπάρχει κενό έχει βελάκι για να το τονίσει '^T....' ' T...$.' uit.$ ξεκινούν µε λέξη από Τ µετά chars (κενό µετά) τελειώνουν µε λέξη, από Τ και chars µετά (κενό πριν) τελειώνουνµε το uit και µετά έχουν χαρακτήρα - εν υπάρχουν. Η η ξεκινά µε κενά - εν υπάρχουν Αν στο τέλος της ης υπήρχε κενό ή τελεία θα έβγαινε και η η γρ. \ πριν από ένα metachar ακυρώνει το ειδικό νόηµά του uit\.$ τελειώνουνµε το uit και µετά έχουν τελεία ακυρώνει την µετασηµασία (που σηµαίνει οποιοσδήποτε χαρ/ρας) και ψάχνει για τελεία. ' fruit.' ' fruit\.' έχουν την λέξη fruit και µετά char (κενό πριν) έχουν την λέξη fruit και µετά τελεία (κενό πριν), αν θέλαµε µόνο λέξεις fruit δεν θα έχει επιθυµητό αποτέλεσµα 7 How long, how long, in infinite Pursuit Better be merry with the fruitful Grape Than sadden after none, or bitter, fruit. How long... αρχείο µε όνοµα grape Kλάσεις χαρακτήρων µε [ ] και [-] Μέσα στα [ ] καθορίζεται το σύνολο ή το διάστηµα των χαρακτήρων που ψάχνουµε : Τι σηµαίνει pattern Γραµµές που Ν ο γρ. Σχόλια [ ] χαρακτήρας από το [Tt]his έχουν τo This ή το this σύνολο µέσα στα [] ^[Tt]his ξεκινούν µε Τhis ή this - εν υπάρχουν ^[BHOT] ξεκινούν µε Β ή Η ή Ο ή Τ, η, η, η ξεκινούν µε κενά/tab [BT] που έχουν Β ή Τ,, [-] χαρακτήρας από το διάστηµα µέσα στα[] ^[B-T] ^[B-HO-T] ξεκινούν µε χαρακτήρα στο διάστηµα από Β έως Τ ξεκινούν µε χαρακτήρα στο διάστηµα από Β έως Η ή στο διάστηµα Ο έως Τ,, Εκτός από τον χαρακτήρα newline (τέλος γραµµής \n) Όταν πρόκειται για ολόκληρες «λέξεις» µπορεί να έχουν πριν ένα κενό, και µετά ή κενό ή κάτι άλλο πχ. 7 Στην περίπτωση T... λέξη θα θεωρηθεί πχ και το Τb που δεν είναι λέξη µε νόηµα!, κύττα πιο κάτω []
Τι σηµαίνει pattern Γραµµές που Ν ο γρ. Σχόλια [^] χαρακτήρας που δεν [^BT]h έχουν char διαφορετικό 8, Η option --color θα ανήκει στο σύνολο από Β,Τ και µετά h (ή βοηθήσει να κατανοηθεί έχουν h και πριν από αυτό καλύτερα µέσα στα [] ^[^BT] δεν έχουν ούτε B ούτε T) ξεκινούν µε χαρακτήρα που δεν είναι Β ή Τ,,,,, Η 7 η δεν έχει κάποιο χαρακτήρα ( 8 ) [^-] χαρακτήρας που δεν ανήκει στο διάστηµα µέσα στα [] [^B-T]h έχουν χαρακτήρα που δεν είναι από Β έως Τ και µετά h Η γραµµή έχει κενό και how (το κενό δεν είναι µέσα στο Β-Τ) Προσοχή στα κενά µπρος και πίσω από την λέξη που περικλείονται σε µονά εισαγωγικά ' [Tt][a-z][a-z][a-z] ' έχoυν λέξη από Τ ή t και άλλα γράµµατα µετά από a έως z (κενό πριν /µετά) ' [^Tt][a-z][a-z][a-z] ' λέξεις µε χαρ. & ο ος char δεν είναι Τ ή t (κενό πριν /µετά), Πιο καλό για λέξη, από το ' T....' που θεωρεί οτιδήποτε χαρ/ρα µετά το Τ, option --color θα βοηθήσει Αριθµοί [0] αριθµοί ή ή ή 0 [0-] αριθµοί στο διάστηµα 0- [-0] αριθµοί στο διάστηµα - ή 0 (και όχι από έως το 0) [-9][0-9] διψήφιοι αριθµοί Ο χαρακτήρας - Αν θέλουµε να ανήκει στο σύνολο των χαρακτήρων που ψάχνουµε και ο χαρακτήρας '-' αρκεί να τον βάλουµε στην αρχή 9 ή να άρουµε την σηµασία του µε \- (να µην µπερδευτεί µε το διάστηµα) π.χ. [-bm] σηµαίνει ο χαρακτήρας -, ή o χαρακτήρας b, ή o χαρακτήρας m Oι επεκταµένες (full) κανονικές εκφράσεις υποστηρίζονται από την εντολή egrep που είναι υπερσύνολο της grep. Η egrep αναζητεί όσα και η grep αλλά και RE µε επιπλέον µεταχαρακτήρες (π.χ. +,?, ). Closures { } Επαναλαµβανόµενα pattern µε την egrep Γενικά ένας αριθµός µέσα σε άγκιστρα π.χ. {} µετά από µια έκφραση καθορίζει τον αριθµό των φορών που η έκφραση (που προηγείται) θα επαναληφθεί π.χ. αν θέλω µια λέξη από Τ ή t και άλλα γράµµατα µετά από a έως z (κενό πριν, µετά) ' [Tt][a-z]{} ' ( αν δηλ. µετά το 'Τ' θέλω χαρακτήρες a-z αντί να γράψω [a-z][a-z][a-z], γράφω [a-z]{} ) closure H γενική φόρµα είναι {n,m} και σηµαίνει εµφανίσεις το λιγότερο n φορές και το περισσότερο m. Όταν δεν έχει m δηλ. {n} εννοεί ακριβώς n φορές. 8 Μια εντολή [^ΒΤ] θα δώσει τις γραµµές - δηλ.και την η, η γιατί δεν έχουν Β και την η που δεν έχει Τ 9 παρόµοια ισχύει και για τα [ και ] []
$ egrep --color '[Tt][a-z]{}' grape Better be merry with the fruitful Grape Than sadden after none, or bitter, fruit. $ egrep --color ' [Tt][a-z]{} ' grape Than sadden after none, or bitter, fruit. closure Συντ/φία Εµφανίσεις Σχόλια {,} από µια έως τρεις γενικότερα {n,m} {} τρεις γενικότερα {n} {0, } * καµία ή περισσότερες 0 υποστηρίζεται από σχεδόν όλες τις version της egrep (και την grep) {, } + µία ή περισσότερες 0 {0, }? καµία ή µία Ετσι σε ένα οποιοδήποτε αρχείο, π.χ. στο αρχείο grape, η εντολή $ egrep '.*' grape. ένας χαρακτήρας * {0, } + {, }? {0,} επαναλήψεις που σηµαίνει match ένα οποιοδήποτε char 0 έως άπειρες φορές, δίνει όλες τις γραµµές δηλαδή είναι ίδια µε την cat grape (αλλά η cat είναι πιο εύκολη και γρήγορη). Εναλλακτικές pattern µε την egrep ( ) RE RE egrep '(This That)' grape έχουν This ή Τhat γραµµή Options -v, -i, -y, -c, -l, -r -v (invert) εµφανίζονται εκτός από αυτές που ταιριάζουν -i,-y (ignore case) αγνόησε κεφαλαία µικρά -c (count) δίνει µόνο πλήθος γραµµών (που ταίριαξαν) -l (list) δίνει τα ονόµατα των matching αρχείων (ταίριασµα για περισσότερα από ένα αρχεία) -r (recursive) ψάχνει σε καταλόγους και υποκαταλόγους vassik@aetos:~/xunix/lab$ grep -v student gtegos:x:9:000:tegos Georgios:/home/staff/it/gtegos:/bin/bash gquery:x:0:99:keramopoulos Euclid:/home/staff/ektaktoi/gquery:/bin/bash pass Mερικά παραδείγµατα στο αρχείο µε όνοµα filetra Αρχείο filetra Eντολή Εξήγηση Αποτέλεσµα-γραµµές ra la la tra traaatratra tra tra tra egrep 't{,}' filetra egrep 'tra{,}' filetra egrep 'tra{}' filetra.. εµφανίσεις του t tr,.. εµφανίσεις του a tr και συνεχόµενα a όλες και η η η γραµµή egrep 'tra {,}' filetra tra,.. εµφανίσεις του κενό η ( η η δεν έχει κενό) oµαδοποίηση µε () egrep '(tra ){}' filetra συνεχόµενα tra κενό η γραµµή 0 Περισσότερες σηµαίνει πάρα πολλές (το συµβολίζω µε, χωρίς όµως να έχει την έννοια του άπειρου) Aν θέλετε να το αντιγράψετε στο φάκελο που είστε: cp ~vassik/myunix/labs/lab0/filetra. []
Μερικά παραδείγµατα στο αρχείο µε όνοµα fileab Αρχείο fileab Eντολή Εξήγηση Αποτέλεσµα ac ababcbabc abbc abbbc abcbc abcbcbc egrep '.*' fileab egrep 'a*' fileab egrep 'a?' fileab egrep 'a? ' fileab egrep 'a+' fileab Ένας χαρακτήρας εµφανίζεται 0.. To a εµφανίζεται 0.. To a εµφανίζεται 0.. To a εµφανίζεται 0.. µετά κενό To a εµφανίζεται.. καµία / δεν υπάρχει egrep -n 'ab+c' fileab egrep -n '(ab)+c' fileab egrep -n 'ab?c' fileab egrep -n 'a(bc)*' fileab egrep -n 'a(bc)?' fileab egrep -n 'a(bc)+' fileab a, επανάληψη b.., και c ab επανάληψη.., και c a, επανάληψη b 0.., και c a, επανάληψη bc 0.. a, επανάληψη bc 0.. a, επανάληψη bc.. όλες εκτός της ης η, η, η η, η, η, η η, η, η Οµαδοποιήσεις των RE (regex) Αρχείο fileab Παρενθέσεις ( ) τοποθετούνται στην κανονική έκφραση ώστε οι µεταχαρακτήρες πχ *, + ή?, να δράσουν στην ΟΜΑ Α αντί σε ένα µόνο χαρακτήρα. Για να επαναληφθούν κάποιες οµάδες regex µπορεί να χρησιµοποιηθεί η back reference \ ac ababcbabc abbc abbbc abcbc abcbcbc π.χ. egrep '(bc)\' fileab σηµαίνει επανάληψη της ης οµάδας (bc), δηλ. bcbc Επανάληψη της ης και της ης οµάδας Στο παρακάτω pattern: (RE)kati(RE)cd\lala\xy\ η oµάδα η οµάδα σηµαίνει REkatiREcdRElalaRExyRE µε RE και RE να είναι συγκεκριµένες κανονικές εκφράσεις Back Reference αναδρ/κή αναφορά \ η οµάδα \n n η οµάδα (..9) οµάδες είναι οι RE µέσα στις () egrep '(.)\' fileab egrep '(bc)\' fileab egrep '([bc])\' fileab egrep '([bc]{})\' fileab egrep '(b)[ac]\' fileab Επανάληψη ενός χαρακτήρα της οµάδας, ένα γράµµα συνεχόµενα φορές (bb) Επανάληψη bc Επανάληψη b,c δηλ. ή bb ή cc Όµοιο µε '([bc][bc])\' επανάληψη ή bb ή bc ή cc Επανάληψη b µε ενδιάµεσο ή a ή c γραµµές, γραµµές, γραµµές, γραµµές, γραµµές,, egrep '(.)(.)\\' fileab ος char, ος char, & επανάληψη του ου ου γραµµές,, []
Συνοπτικός πίνακας anchors ^ αρχή γραµµής $ τέλος γραµµής. ένας οποιοσδήποτε χαρακτήρας \ πριν από ένα metachar ακυρώνει το ειδικό νόηµά του [ ] χαρακτήρας από το σύνολο µέσα στα [] [-] χαρακτήρας από το διάστηµα µέσα στα[] [^] χαρακτήρας που δεν ανήκει στο σύνολο µέσα στα [] [^-] χαρακτήρας που δεν ανήκει στο διάστηµα µέσα στα [] * (0.. ) καµία ή περισσότερεςεµφανίσεις της προηγούµενης RE + (.. ) µία ή περισσότερες εµφανίσεις της προηγούµενης RE? (0..) καµία ή µία εµφανίσεις της προηγούµενης RE {,} (n..m) έως εµφανίσεις της προηγούµενης RE \ Επανάληψη της ης οµάδας RE (\ αντίστοιχα της ης..) ( ) Εναλλακτικές patterns Eπισηµαίνεται ότι Το ^ είναι anchor µόνο στην αρχή και το $ µόνο στο τέλος ενός pattern, σε άλλο σηµείο χάνουν την µετασηµασία τους π.χ. το ^[^a] σηµαίνει ξεκινά η γραµµή και δεν έχει a και το ^O.[^a] σηµαίνει ξεκινά µε Ο έχει µετά ένα χαρακτήρα και µετά δεν έχει a Options -v, -i, -y, -c, -l, -r -v (invert) εµφανίζονται εκτός από αυτές που ταιριάζουν -i,-y (ignore case) αγνόησε κεφαλαία µικρά -c (count) δίνει µόνο πλήθος γραµµών (που ταίριαξαν) -l (list) δίνει τα ονόµατα των matching αρχείων (ταίριασµα για περισσότερα από ένα αρχεία) -r (recursive) ψάχνει σε καταλόγους και υποκαταλόγους -n δείχνει και τον αριθµό της γραµµής του αρχείου --color χρωµατίζει αυτά που ταιριάζουν µε το pattern Εκτός από τον χαρακτήρα newline (τέλος γραµµής \n) [7]