Χρήση grep (και egrep) με Κανονικές εκφράσεις

Using Grep With Regular Expressions



Αυτό το σεμινάριο περιγράφει τον τρόπο χρήσης και των δύο λαβή (και egrep) t o Βρείτε κείμενο σε αρχεία, στην απλή τους μορφή και όταν συνδυάζονται με κανονικές εκφράσεις. Περιέχει αρκετές παραδείγματα και γυμνάσια , περισσότερο λύσεις , για να ολοκληρώσει ο θεατής.

Το όνομα λαβή προέρχεται από την εντολή ed (και vim) g/re/p, που σημαίνει παγκόσμια αναζήτηση μιας δεδομένης κανονικής έκφρασης και εκτύπωση (εμφάνιση) της εξόδου.







Τακτικός Εκφράσεις

Τα βοηθητικά προγράμματα επιτρέπουν στον χρήστη να αναζητά αρχεία κειμένου για γραμμές που ταιριάζουν με μια κανονική έκφραση ( regexp ). Μια κανονική έκφραση είναι μια συμβολοσειρά αναζήτησης που αποτελείται από κείμενο και έναν ή περισσότερους από 11 ειδικούς χαρακτήρες. Ένα απλό παράδειγμα είναι η αντιστοίχιση της αρχής μιας γραμμής.



Δείγμα αρχείου

Η βασική μορφή του λαβή μπορεί να χρησιμοποιηθεί για την εύρεση απλού κειμένου μέσα σε ένα συγκεκριμένο αρχείο ή αρχεία. Για να δοκιμάσετε τα παραδείγματα, δημιουργήστε πρώτα το δείγμα αρχείου.



Χρησιμοποιήστε έναν επεξεργαστή όπως το nano ή το vim για να αντιγράψετε το παρακάτω κείμενο σε ένα αρχείο που ονομάζεται myfile Το





xyz
ξυζδε
exyzd
dexyz
d? gxyz
xxz
xzz
x z
x*z
xz
x z
XYZ
ΞΥΥΖ
xYz
xyyz
xyyyz
xyyyyz

Παρόλο που μπορείτε να αντιγράψετε και να επικολλήσετε τα παραδείγματα στο κείμενο (σημειώστε ότι τα διπλά εισαγωγικά ενδέχεται να μην αντιγράφονται σωστά), οι εντολές πρέπει να πληκτρολογηθούν για να τα μάθετε σωστά.

Πριν δοκιμάσετε τα παραδείγματα, δείτε το δείγμα αρχείου:



$Γάταmyfile

Απλή αναζήτηση

Για να βρείτε το κείμενο ‘xyz’ μέσα στο αρχείο εκτελέστε τα εξής:

$λαβήxyz myfile

Χρήση χρωμάτων

Για να εμφανίσετε χρώματα, χρησιμοποιήστε –χρώμα (διπλή παύλα) ή απλώς δημιουργήστε ένα ψευδώνυμο. Για παράδειγμα:

$λαβή --χρώμαxyz myfile

ή

$ψευδώνυμο λαβή= 'λαβή--χρώμα'
$λαβήxyz myfile

Επιλογές

Κοινές επιλογές που χρησιμοποιούνται με το λαβή η εντολή περιλαμβάνει:

  • -βρίσκω όλες τις γραμμές ανεξάρτητος της υπόθεσης
  • -ντο μετρώ πόσες γραμμές περιέχουν το κείμενο
  • -η γραμμή εμφάνισης αριθμούς ταιριάζουν γραμμές
  • -μόνο οθόνη αρχείο ονόματα που ταιριάζουν
  • -r αναδρομική αναζήτηση υποκαταλόγων
  • -β βρείτε όλες τις γραμμές ΔΕΝ που περιέχει το κείμενο

Για παράδειγμα:

$λαβή -Εγώxyz myfile# εύρεση κειμένου ανεξάρτητα από περίπτωση

$λαβή -icxyz myfile# μετρήστε γραμμές με κείμενο

$λαβή -σεxyz myfile# εμφάνιση αριθμών γραμμής

Δημιουργία πολλαπλών αρχείων

Πριν προσπαθήσετε να αναζητήσετε πολλά αρχεία, δημιουργήστε πρώτα πολλά νέα αρχεία:

$πέταξε έξωxyz>>myfile1
$πέταξε έξω -Καιxyz nxzz nXYZ>>myfile2
$πέταξε έξω -Καιxxx nyyy>>myfile3
$Γάταmyfile1
$Γάταmyfile2
$Γάταmyfile3

Αναζήτηση πολλαπλών αρχείων

Για αναζήτηση πολλών αρχείων χρησιμοποιώντας ονόματα αρχείων ή μπαλαντέρ εισάγετε:

$λαβή -icxyz myfile myfile1 myfile2 myfile3
$λαβή -σεxyz μου*
# ονόματα αρχείων αντιστοίχισης που ξεκινούν με 'μου'

Άσκηση Ι

  1. Καταμετρήστε πρώτα πόσες γραμμές υπάρχουν στο αρχείο /etc /passwd.
Υπόδειξη: χρήσητουαλέτα -ο /και τα λοιπά/passwd
  1. Τώρα βρείτε όλες τις εμφανίσεις του κειμένου όπου στο αρχείο /etc /passwd Το
  2. Βρείτε πόσες γραμμές στο αρχείο περιέχουν το κείμενο
  3. Βρείτε πόσες γραμμές ΔΕΝ περιέχουν το κείμενο όπου Το
  4. Βρείτε την καταχώριση για τη σύνδεσή σας στο /etc/passwd

Λύσεις άσκησης μπορείτε να βρείτε στο τέλος αυτού του άρθρου.

Χρήση Κανονικών Εκφράσεων

Η εντολή λαβή μπορεί επίσης να χρησιμοποιηθεί με κανονικές εκφράσεις χρησιμοποιώντας έναν ή περισσότερους από έντεκα ειδικούς χαρακτήρες ή σύμβολα για τη βελτίωση της αναζήτησης. Μια κανονική έκφραση είναι μια συμβολοσειρά χαρακτήρων που περιλαμβάνει ειδικούς χαρακτήρες που επιτρέπουν την αντιστοίχιση μοτίβου σε βοηθητικά προγράμματα, όπως π.χ. λαβή , ήρθα και sed Το Σημειώστε ότι οι συμβολοσειρές ενδέχεται να χρειαστεί να περικλείονται σε εισαγωγικά.

Οι ειδικοί διαθέσιμοι χαρακτήρες περιλαμβάνουν:

^ Έναρξη μιας γραμμής
$ Τέλος μιας γραμμής
Το Οποιοσδήποτε χαρακτήρας (εκτός n νέας γραμμής)
* 0 ή περισσότερες προηγούμενες εκφράσεις
Το να προηγείται ένα σύμβολο το καθιστά κυριολεκτικό χαρακτήρα

Σημειώστε ότι το *, το οποίο μπορεί να χρησιμοποιηθεί στη γραμμή εντολών για να ταιριάζει με οποιονδήποτε αριθμό χαρακτήρων, συμπεριλαμβανομένου κανενός, είναι δεν χρησιμοποιείται με τον ίδιο τρόπο εδώ.

Σημειώστε επίσης τη χρήση εισαγωγικών στα ακόλουθα παραδείγματα.

Παραδείγματα

Για να βρείτε όλες τις γραμμές που ξεκινούν με κείμενο χρησιμοποιώντας τον χαρακτήρα ^:

$λαβή‘^Xyz’ myfile

Για να βρείτε όλες τις γραμμές που τελειώνουν με κείμενο χρησιμοποιώντας τον χαρακτήρα $:

$λαβήMyfile ‘xyz $’

Για να βρείτε γραμμές που περιέχουν μια συμβολοσειρά χρησιμοποιώντας χαρακτήρες ^ και $:

$λαβήMyfile ‘^xyz $’

Για να βρείτε γραμμές χρησιμοποιώντας το Το για να ταιριάζει με οποιονδήποτε χαρακτήρα:

$λαβή‘^X.z’ myfile

Για να βρείτε γραμμές χρησιμοποιώντας το * για να αντιστοιχίσετε 0 ή περισσότερες από την προηγούμενη έκφραση:

$λαβή‘^Xy*z ’myfile

Για να βρείτε γραμμές χρησιμοποιώντας.* Για αντιστοίχιση 0 ή περισσότερων από οποιονδήποτε χαρακτήρα:

$λαβή‘^ Χ.*z ’myfile

Για να βρείτε γραμμές χρησιμοποιώντας το για να ξεφύγετε από τον χαρακτήρα *:

$λαβή‘^ X *z ’myfile

Για να βρείτε τον χαρακτήρα χρησιμοποιήστε:

$λαβή‘\’ αρχείο μου

Έκφραση grep - egrep

ο λαβή Η εντολή υποστηρίζει μόνο ένα υποσύνολο των διαθέσιμων κανονικών εκφράσεων. Ωστόσο, η εντολή egrep:

  • επιτρέπει την πλήρη χρήση όλων των κανονικών εκφράσεων
  • μπορεί ταυτόχρονα να αναζητήσει περισσότερες από μία εκφράσεις

Σημειώστε ότι οι εκφράσεις πρέπει να περικλείονται μέσα σε ένα ζεύγος εισαγωγικών.

Για να χρησιμοποιήσετε χρώματα, χρησιμοποιήστε –χρώμα ή δημιουργήστε ξανά ένα ψευδώνυμο:

$ψευδώνυμο egrep='egrep -χρώμα'

Για να αναζητήσετε περισσότερα από ένα ρεγεξ ο egrep η εντολή μπορεί να γραφτεί σε πολλές γραμμές. Ωστόσο, αυτό μπορεί επίσης να γίνει χρησιμοποιώντας αυτούς τους ειδικούς χαρακτήρες:

| Εναλλαγή, είτε το ένα είτε το άλλο
(…) Λογική ομαδοποίηση μέρους μιας έκφρασης
$egrep '(^root |^uucp |^mail)' /και τα λοιπά/passwd

Αυτό εξάγει τις γραμμές που ξεκινούν με root, uucp ή mail από το αρχείο, το | σύμβολο που σημαίνει οποιαδήποτε από τις επιλογές.

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

$λαβή '(^root |^uucp |^mail)' /και τα λοιπά/passwd

Ωστόσο, στα περισσότερα συστήματα Linux η εντολή grep -E είναι το ίδιο με τη χρήση egrep :

$λαβή -ΚΑΙ '(^root |^uucp |^mail)' /και τα λοιπά/passwd

Χρήση φίλτρων

Σωλήνωση είναι η διαδικασία αποστολής της εξόδου μιας εντολής ως εισόδου σε άλλη εντολή και είναι ένα από τα πιο ισχυρά διαθέσιμα εργαλεία Linux.

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

Στο ακόλουθο παράδειγμα, τυπική έξοδος από ls -l περνά ως τυπική είσοδος στο λαβή εντολή. Έξοδος από το λαβή η εντολή περνά στη συνέχεια ως είσοδος στο περισσότερο εντολή.

Αυτό θα εμφανίσει μόνο καταλόγους στο /και τα λοιπά :

$ls -ο /και τα λοιπά|λαβή'^Δ'|περισσότερο

Οι ακόλουθες εντολές είναι παραδείγματα χρήσης φίλτρων:

$ΥΣΤΕΡΟΓΡΑΦΟ -εφ|λαβήcron

$οι οποίοι|λαβήkdm

Δείγμα αρχείου

Για να δοκιμάσετε την άσκηση αναθεώρησης, δημιουργήστε πρώτα το ακόλουθο δείγμα αρχείου.

Χρησιμοποιήστε έναν επεξεργαστή όπως το nano ή το vim για να αντιγράψετε το παρακάτω κείμενο σε ένα αρχείο που ονομάζεται Ανθρωποι:

Προσωπικός J.Smith 25000
Προσωπικός E.Smith 25400
Εκπαίδευση A.Brown 27500
Εκπαίδευση C.Browen 23400
(Διαχειριστής) R.Bron 30500
Goodsout T.Smyth 30000
Προσωπικό F.Jones 25000
εκπαίδευση* C.Evans 25500
Goodsout W.Pope 30400
Ισόγειο T.Smythe 30500
Προσωπικό J.Maler 33000

Άσκηση II

  1. Εμφάνιση του αρχείου Ανθρωποι και εξετάστε το περιεχόμενό του.
  2. Βρείτε όλες τις γραμμές που περιέχουν τη συμβολοσειρά Σιδηρουργός στο αρχείο people.Hint: χρησιμοποιήστε την εντολή grep αλλά θυμηθείτε ότι από προεπιλογή, είναι κεφαλαία.
  3. Δημιουργήστε ένα νέο αρχείο, npeople, που περιέχει όλες τις γραμμές που ξεκινούν με τη συμβολοσειρά Προσωπικός στο αρχείο ατόμων. Υπόδειξη: χρησιμοποιήστε την εντολή grep με>.
  4. Επιβεβαιώστε τα περιεχόμενα των ατόμων του αρχείου καταχωρίζοντας το αρχείο.
  5. Προσθέστε τώρα όλες τις γραμμές όπου το κείμενο τελειώνει με τη συμβολοσειρά 500 στο αρχείο άτομα στο αρχείο npeople.Hint: χρησιμοποιήστε την εντολή grep με >>.
  6. Και πάλι, επιβεβαιώστε τα περιεχόμενα των ατόμων του αρχείου παραθέτοντας το αρχείο.
  7. Βρείτε τη διεύθυνση IP του διακομιστή που είναι αποθηκευμένη στο αρχείο /etc/hosts . Συμβουλή: χρησιμοποιήστε την εντολή grep με $ (όνομα κεντρικού υπολογιστή)
  8. Χρήση egrep για εξαγωγή από το /etc/passwd γραμμές λογαριασμού αρχείου που περιέχουν lp ή το δικό σας ταυτότητα χρήστη Το

Λύσεις άσκησης μπορείτε να βρείτε στο τέλος αυτού του άρθρου.

Πιο κανονικές εκφράσεις

Μια κανονική έκφραση μπορεί να θεωρηθεί ως μπαλαντέρ στα στεροειδή.

Υπάρχουν έντεκα χαρακτήρες με ειδικές έννοιες: οι τετράγωνες αγκύλες ανοίγματος και κλεισίματος [], το ανάστροφο , το caret ^, το σύμβολο του δολαρίου $, η περίοδος ή η τελεία., Η κάθετη ράβδος ή το σύμβολο σωλήνα |, το ερωτηματικό; αστερίσκο ή αστέρι *, το σύμβολο συν + και τον στρογγυλό βραχίονα ανοίγματος και κλεισίματος {}. Αυτοί οι ειδικοί χαρακτήρες ονομάζονται επίσης συχνά μεταχαρακτήρες.

Ακολουθεί το πλήρες σύνολο ειδικών χαρακτήρων:

^ Έναρξη μιας γραμμής
$ Τέλος μιας γραμμής
Το Οποιοσδήποτε χαρακτήρας (εκτός n νέας γραμμής)
* 0 ή περισσότερες προηγούμενες εκφράσεις
| Εναλλαγή, είτε το ένα είτε το άλλο
[…] Ρητό σύνολο χαρακτήρων που ταιριάζουν
+ 1 ή περισσότερες προηγούμενες εκφράσεις
; 0 ή 1 της προηγούμενης έκφρασης
Το να προηγείται ένα σύμβολο το καθιστά κυριολεκτικό χαρακτήρα
{…} Ρητή σημειωτική ποσοτικοποίηση
(…) Λογική ομαδοποίηση μέρους μιας έκφρασης

Η προεπιλεγμένη έκδοση του λαβή έχει μόνο περιορισμένη υποστήριξη τακτικής έκφρασης. Για να λειτουργήσουν όλα τα παρακάτω παραδείγματα, χρησιμοποιήστε egrep αντ 'αυτού ή grep -E Το

Για να βρείτε γραμμές χρησιμοποιώντας το | για να ταιριάζει με οποιαδήποτε έκφραση:

$egrep‘Xxz|αρχείο xzz ’

Για να βρείτε γραμμές χρησιμοποιώντας το | Για να ταιριάξετε οποιαδήποτε έκφραση μέσα σε μια συμβολοσειρά, χρησιμοποιήστε επίσης ():

$egrep‘^ Χ(Υζ|yz)’Myfile

Για να βρείτε γραμμές χρησιμοποιώντας το [] για να ταιριάξετε με οποιονδήποτε χαρακτήρα:

$egrep‘^ Χ[Yy]z ’myfile

Για να βρείτε γραμμές χρησιμοποιώντας το [] για να ΜΗΝ ταιριάζει με κανέναν χαρακτήρα:

$egrep‘^ Χ[^ Ναι]z ’myfile

Για να βρείτε γραμμές χρησιμοποιώντας το * για να αντιστοιχίσετε 0 ή περισσότερες από την προηγούμενη έκφραση:

$egrep‘^Xy*z ’myfile

Για να βρείτε γραμμές χρησιμοποιώντας το + για να αντιστοιχίσετε 1 ή περισσότερες από την προηγούμενη έκφραση:

$egrep‘^Xy+z’ myfile

Για να βρείτε γραμμές χρησιμοποιώντας το; για να ταιριάζει με το 0 ή το 1 της προηγούμενης έκφρασης:

$egrep‘^Xy? Z’ myfile

Άσκηση III

  1. Βρείτε όλες τις γραμμές που περιέχουν τα ονόματα Έβανς ή ζωγράφος στο αρχείο άτομα.
  2. Βρείτε όλες τις γραμμές που περιέχουν τα ονόματα Smith, Smyth ή Smythe στο αρχείο άτομα.
  3. Βρείτε όλες τις γραμμές που περιέχουν τα ονόματα Μπράουν, Μπρόουν ή Πηγή στο αρχείο άτομα. Εάν έχετε χρόνο:
  4. Βρείτε τη γραμμή που περιέχει τη συμβολοσειρά (διαχειριστής), συμπεριλαμβανομένων των παρενθέσεων, στο αρχείο ατόμων.
  5. Βρείτε τη γραμμή που περιέχει τον χαρακτήρα * στα άτομα αρχείου.
  6. Συνδυάστε τα 5 και 6 παραπάνω για να βρείτε και τις δύο εκφράσεις.

Περισσότερα Παραδείγματα

Για να βρείτε γραμμές χρησιμοποιώντας Το και * για να ταιριάζει με οποιοδήποτε σύνολο χαρακτήρων:

$egrep‘^Xy.*z ’myfile

Για να βρείτε γραμμές χρησιμοποιώντας {} για αντιστοίχιση Ν αριθμού χαρακτήρων:

$egrep‘^Xy{3}z ’myfile
$egrep‘^Xy{4}z ’myfile

Για να βρείτε γραμμές χρησιμοποιώντας {} για αντιστοίχιση N ή περισσότερες φορές:

$egrep‘^Xy{3,}z ’myfile

Για να βρείτε γραμμές χρησιμοποιώντας {} για αντιστοίχιση N φορές αλλά όχι περισσότερες από M φορές:

$egrep‘^Xy{2,3}z ’myfile

συμπέρασμα

Σε αυτό το σεμινάριο εξετάσαμε πρώτα τη χρήση λαβή σε απλή μορφή, μπορείτε να βρείτε κείμενο σε ένα αρχείο ή σε πολλά αρχεία. Στη συνέχεια συνδυάσαμε το κείμενο προς αναζήτηση με απλές κανονικές εκφράσεις και στη συνέχεια πιο σύνθετες με τη χρήση egrep Το

Επόμενα βήματα

Ελπίζω να αξιοποιήσετε σωστά τις γνώσεις που αποκτήσατε εδώ. Δοκίμασε λαβή εντολές στα δικά σας δεδομένα και θυμηθείτε, οι κανονικές εκφράσεις όπως περιγράφονται εδώ μπορούν να χρησιμοποιηθούν με την ίδια μορφή στο εμείς , sed και awk !

Λύσεις άσκησης

Άσκηση Ι

Καταμετρήστε πρώτα πόσες γραμμές υπάρχουν στο αρχείο /etc/passwd Το
$ wc -l /etc/passwd
Τώρα βρείτε όλες τις εμφανίσεις του κειμένου όπου στο αρχείο /etc /passwd.
$ grep var /etc/passwd
Βρείτε πόσες γραμμές στο αρχείο περιέχουν το κείμενο όπου

λαβή -ντοόπου/και τα λοιπά/passwd

Βρείτε πόσες γραμμές ΔΕΝ περιέχουν το κείμενο όπου Το

λαβή -βιογραφικόόπου/και τα λοιπά/passwd

Βρείτε την καταχώριση για τη σύνδεσή σας στο /etc/passwd αρχείο
grep kdm /etc/passwd

Άσκηση II

Εμφάνιση του αρχείου Ανθρωποι και εξετάστε το περιεχόμενό του.
$ cat people
Βρείτε όλες τις γραμμές που περιέχουν τη συμβολοσειρά Σιδηρουργός στο αρχείο Ανθρωποι Το
$ grep 'Smith' people
Δημιουργήστε ένα νέο αρχείο, ανθρωποι , που περιέχει όλες τις γραμμές που ξεκινούν με τη συμβολοσειρά Προσωπικός στο Ανθρωποι αρχείο
$ grep '^Personal' people> npeople
Επιβεβαιώστε το περιεχόμενο του αρχείου ανθρωποι με την καταχώριση του αρχείου.
$ cat npeople
Προσθέστε τώρα όλες τις γραμμές όπου το κείμενο τελειώνει με τη συμβολοσειρά 500 στο αρχείο Ανθρωποι στο αρχείο ανθρωποι Το
$ grep '500$' people>>npeople
Και πάλι, επιβεβαιώστε το περιεχόμενο του αρχείου ανθρωποι με την καταχώριση του αρχείου.
$ cat npeople
Βρείτε τη διεύθυνση IP του διακομιστή που είναι αποθηκευμένη στο αρχείο /etc/hosts Το
$ grep $(hostname) /etc/hosts
Χρήση egrep για εξαγωγή από το /etc/passwd γραμμές λογαριασμού αρχείου που περιέχουν lp ή το δικό σας αναγνωριστικό χρήστη.
$ egrep '(lp|kdm:)' /etc/passwd

Άσκηση III

Βρείτε όλες τις γραμμές που περιέχουν τα ονόματα Έβανς ή ζωγράφος στο αρχείο Ανθρωποι Το
$ egrep 'Evans|Maler' people
Βρείτε όλες τις γραμμές που περιέχουν τα ονόματα Σιδηρουργός , Smyth ή Smythe στο αρχείο Ανθρωποι Το
$ egrep 'Sm(i|y)the?' people
Βρείτε όλες τις γραμμές που περιέχουν τα ονόματα καφέ , Μπρόουν ή Πηγή στο αρχείο άτομα.
$ egrep 'Brow?e?n' people
Βρείτε τη γραμμή που περιέχει τη συμβολοσειρά (διαχειριστής), συμπεριλαμβανομένων των παρενθέσεων, στο αρχείο Ανθρωποι Το

$egrep '(Διαχειριστής)'Ανθρωποι

Βρείτε τη γραμμή που περιέχει τον χαρακτήρα * στο αρχείο άτομα.
$ egrep '*' people
Συνδυάστε τα 5 και 6 παραπάνω για να βρείτε και τις δύο εκφράσεις.

$egrep ' (Διαχειριστής ) | *'Ανθρωποι