Εκπαιδευτικό πρόγραμμα για το GREP και τις κανονικές εκφράσεις. Χρήση τυπικών εκφράσεων (regex) στο Linux Πίνακας κανονικών εκφράσεων grep

Το βοηθητικό πρόγραμμα grep είναι ένα πολύ ισχυρό εργαλείο αναζήτησης και φιλτραρίσματος. πληροφορίες κειμένου. Αυτό το άρθρο παρουσιάζει πολλά παραδείγματα χρήσης του που θα σας επιτρέψουν να εκτιμήσετε τις δυνατότητές του.
Η κύρια χρήση του grep είναι η αναζήτηση λέξεων ή φράσεων σε αρχεία και ροές εξόδου. Μπορείτε να κάνετε αναζήτηση πληκτρολογώντας ένα ερώτημα και την περιοχή αναζήτησης (αρχείο) στη γραμμή εντολών.
Για παράδειγμα, για να βρείτε τη συμβολοσειρά "needle" στο αρχείο hystack.txt, χρησιμοποιήστε την ακόλουθη εντολή:

$ grep βελόνα haystack.txt

Ως αποτέλεσμα, το grep θα εμφανίσει όλες τις εμφανίσεις βελόνας που συναντά στα περιεχόμενα του αρχείου haystack.txt. Είναι σημαντικό να σημειωθεί ότι σε αυτήν την περίπτωση, το grep αναζητά ένα σύνολο χαρακτήρων, όχι μια λέξη. Για παράδειγμα, θα εμφανιστούν συμβολοσειρές που περιλαμβάνουν τη λέξη "needless" και άλλες λέξεις που περιέχουν την ακολουθία "needle".


Για να πείτε στο grep ότι ψάχνετε για μια συγκεκριμένη λέξη, χρησιμοποιήστε το διακόπτη -w. Αυτό το πλήκτρο θα περιορίσει την αναζήτηση μόνο στην καθορισμένη λέξη. Μια λέξη είναι ένα ερώτημα που οριοθετείται και στις δύο πλευρές με οποιοδήποτε κενό διάστημα, σημεία στίξης ή αλλαγές γραμμής.

$ grep -w βελόνα haystack.txt

Δεν είναι απαραίτητο να περιορίσετε την αναζήτηση σε ένα μόνο αρχείο· το grep μπορεί να πραγματοποιήσει αναζήτηση σε μια ομάδα αρχείων και τα αποτελέσματα αναζήτησης θα υποδείξουν το αρχείο στο οποίο βρέθηκε η αντιστοίχιση. Ο διακόπτης -n θα προσθέσει επίσης τον αριθμό γραμμής στην οποία βρέθηκε η αντιστοίχιση και ο διακόπτης -r θα σας επιτρέψει να εκτελέσετε μια αναδρομική αναζήτηση. Αυτό είναι πολύ βολικό κατά την αναζήτηση μεταξύ αρχείων με πηγαίους κωδικούς προγραμμάτων.

$ grep -rnw function_name /home/www/dev/myprogram/

Το όνομα του αρχείου θα εμφανίζεται πριν από κάθε αγώνα. Εάν θέλετε να αποκρύψετε ονόματα αρχείων, χρησιμοποιήστε το διακόπτη -h, αντίθετα, εάν χρειάζεστε μόνο ονόματα αρχείων, στη συνέχεια καθορίστε το διακόπτη -l
Στο παρακάτω παράδειγμα, θα αναζητήσουμε διευθύνσεις URL στο αρχείο καταγραφής IRC και θα εμφανίσουμε τις τελευταίες 10 αντιστοιχίσεις.

$ grep -wo http://.* channel.log | ουρά

Η επιλογή -o λέει στο grep να εκτυπώσει μόνο το ταίριασμα του μοτίβου και όχι ολόκληρη τη γραμμή. Χρησιμοποιώντας το pipe, ανακατευθύνουμε την έξοδο του grep στην εντολή tail, η οποία από προεπιλογή βγάζει τις τελευταίες 10 γραμμές.
Τώρα θα μετρήσουμε τον αριθμό των μηνυμάτων που αποστέλλονται στο κανάλι irc από ορισμένους χρήστες. Για παράδειγμα, όλα τα μηνύματα που έστειλα από το σπίτι και τη δουλειά. Διαφέρουν στο ψευδώνυμο, στο σπίτι χρησιμοποιώ το ψευδώνυμο user_at_home και στη δουλειά user_at_work.

$ grep -c "^user_at_(home|work)" channel.log

Με την επιλογή -c, το grep εκτυπώνει μόνο τον αριθμό των αντιστοιχιών που βρέθηκαν, όχι τις ίδιες τις αντιστοιχίσεις. Η συμβολοσειρά αναζήτησης περικλείεται σε εισαγωγικά επειδή περιέχει ειδικούς χαρακτήρες που μπορούν να αναγνωριστούν από το κέλυφος ως χαρακτήρες ελέγχου. Λάβετε υπόψη ότι τα εισαγωγικά δεν περιλαμβάνονται στο μοτίβο αναζήτησης. Η ανάστροφη κάθετο "" χρησιμοποιείται για διαφυγή ειδικών χαρακτήρων.
Ας αναζητήσουμε μηνύματα από άτομα που τους αρέσει να «ουρλιάζουν» στο κανάλι. Με τον όρο «κραυγή» εννοούμε μηνύματα γραμμένα σε ξανθό στυλ, με όλα τα ΚΕΦΑΛΑΙΑ. Για να εξαιρέσουμε τυχαίες επισκέψεις συντομογραφιών από την αναζήτηση, θα αναζητήσουμε λέξεις πέντε ή περισσότερων χαρακτήρων:

$ grep -w "+(5,)" channel.log

Για πιο λεπτομερή περιγραφή, μπορείτε να ανατρέξετε στη σελίδα grep man.
Μερικά ακόμη παραδείγματα:

# grep root /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin

Εμφανίζει γραμμές από το αρχείο /etc/passwd που περιέχουν τη ρίζα συμβολοσειράς.

# grep -n root /etc/passwd 1:root:x:0:0:root:/root:/bin/bash 12:operator:x:11:0:operator:/root:/sbin/nologin

Επιπλέον, εμφανίζονται οι αριθμοί γραμμών που περιέχουν τη γραμμή που αναζητήθηκε.

# grep -v bash /etc/passwd | grep -v nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin :/sbin/halt news:x:9:13:news:/var/spool/news: mailnull:x:47:47::/var/spool/mqueue:/dev/null xfs:x:43:43: X Font Server:/etc/X11/fs:/bin/false rpc:x:32:32:Portmapper RPC user:/:/bin/false nscd:x:28:28:NSCD Daemon:/:/bin/false named:x:25:25:Named:/var/named:/bin/false squid:x:23:23::/var/spool/squid:/dev/null ldap:x:55:55:LDAP Χρήστης: /var/lib/ldap:/bin/false apache:x:48:48:Apache:/var/www:/bin/false

Ελέγχει ποιοι χρήστες δεν χρησιμοποιούν το bash, εξαιρουμένων των λογαριασμών χρηστών που έχουν ορίσει το nologin ως κέλυφος τους.

# grep -c false /etc/passwd 7

Μετρά τον αριθμό των λογαριασμών που έχουν το /bin/false ως κέλυφος.

# grep -i παιχνίδια ~/.bash* | grep -v ιστορία

Αυτή η εντολή εμφανίζει γραμμές από όλα τα αρχεία στον αρχικό κατάλογο τρέχων χρήστης, τα ονόματα των οποίων αρχίζουν με ~/.bash, εκτός από εκείνα τα αρχεία των οποίων τα ονόματα περιέχουν το ιστορικό συμβολοσειρών, προκειμένου να εξαιρεθούν οι αντιστοιχίσεις που βρίσκονται στο αρχείο ~/.bash_history, το οποίο μπορεί να έχει την ίδια γραμμή στην κορυφή ή στα πεζά. Λάβετε υπόψη ότι η αναζήτηση για τη λέξη "παιχνίδια" πραγματοποιείται, μπορείτε να αντικαταστήσετε οποιαδήποτε άλλη λέξη.
εντολή grep και κανονικές εκφράσεις

Σε αντίθεση με το προηγούμενο παράδειγμα, θα εμφανίσουμε τώρα μόνο εκείνες τις γραμμές που ξεκινούν με τη γραμμή "root":

# grep ^root /etc/passwd root:x:0:0:root:/root:/bin/bash

Αν θέλουμε να δούμε ποιοι λογαριασμοί δεν έχουν χρησιμοποιήσει καθόλου το κέλυφος, αναζητούμε γραμμές που τελειώνουν με χαρακτήρα ":":

# grep:$ /etc/passwd news:x:9:13:news:/var/spool/news:

Για να ελέγξετε εάν η μεταβλητή PATH στο αρχείο σας ~/.bashrc έχει εξαχθεί, επιλέξτε πρώτα τις γραμμές με "export" και, στη συνέχεια, αναζητήστε γραμμές που ξεκινούν με τη γραμμή "PATH". Σε αυτήν την περίπτωση, το MANPATH και άλλα δεν θα εμφανίζονται πιθανούς τρόπους:

# grep export ~/.bashrc | grep "PATH" εξαγωγή PATH="/bin:/usr/lib/mh:/lib:/usr/bin:/usr/local/bin:/usr/ucb:/usr/dbin:$PATH"

Κατηγορίες χαρακτήρων

Η έκφραση σε αγκύλες είναι μια λίστα χαρακτήρων που περικλείονται μέσα στους χαρακτήρες [" και "]"". Ταιριάζει με οποιονδήποτε μεμονωμένο χαρακτήρα που καθορίζεται σε αυτήν τη λίστα. εάν ο πρώτος χαρακτήρας της λίστας είναι "^", τότε ταιριάζει με οποιονδήποτε χαρακτήρα ΔΕΝ υπάρχει στη λίστα. Για παράδειγμα, η κανονική έκφραση "" ταιριάζει με οποιοδήποτε μονοψήφιο.

Μέσα σε μια έκφραση σε αγκύλες, μπορείτε να καθορίσετε ένα εύρος που αποτελείται από δύο χαρακτήρες που χωρίζονται με παύλα. Στη συνέχεια, η έκφραση ταιριάζει με οποιοδήποτε singleton που, σύμφωνα με τους κανόνες ταξινόμησης, εμπίπτει σε αυτούς τους δύο χαρακτήρες, συμπεριλαμβανομένων αυτών των δύο χαρακτήρων. Αυτό λαμβάνει υπόψη τη συγκρότηση και το σύνολο χαρακτήρων που καθορίζονται στις τοπικές ρυθμίσεις. Για παράδειγμα, όταν η προεπιλεγμένη τοπική ρύθμιση είναι C, η έκφραση "" είναι ισοδύναμη με την έκφραση "". Υπάρχουν πολλές τοπικές ρυθμίσεις στις οποίες η ταξινόμηση γίνεται με σειρά λεξικού και σε αυτές τις τοπικές ρυθμίσεις το "" δεν είναι γενικά ισοδύναμο με το "", όπου, για παράδειγμα, μπορεί να είναι ισοδύναμο με την έκφραση "". Για να χρησιμοποιήσετε την παραδοσιακή ερμηνεία της έκφρασης σε αγκύλες, μπορείτε να χρησιμοποιήσετε την τοπική ρύθμιση C ορίζοντας τη μεταβλητή περιβάλλοντος LC_ALL σε "C".

Τέλος, υπάρχουν ειδικά ονομασμένες κατηγορίες χαρακτήρων, οι οποίες καθορίζονται μέσα σε εκφράσεις σε αγκύλες. Επιπλέον πληροφορίεςΓια πληροφορίες σχετικά με αυτές τις προκαθορισμένες εκφράσεις, ανατρέξτε στις σελίδες man ή στην τεκμηρίωση της εντολής grep.

# grep /etc/group sys:x:3:root,bin,adm tty:x:5: mail:x:12:mail,postfix ftp:x:50: κανένας:x:99: δισκέτα:x:19: xfs:x:43: nfsnobody:x:65534: postfix:x:89:

Το παράδειγμα εμφανίζει όλες τις γραμμές που περιέχουν είτε τον χαρακτήρα "y" ή τον χαρακτήρα "f".
Καθολικοί χαρακτήρες (μεταχαρακτήρες)

Χρήση "." να ταιριάζει με οποιονδήποτε μεμονωμένο χαρακτήρα. Εάν θέλετε μια λίστα με όλες τις αγγλικές λέξεις που λαμβάνονται από το λεξικό που περιέχει πέντε χαρακτήρες που ξεκινούν με "c" και τελειώνουν με "h" (χρήσιμο για την επίλυση σταυρόλεξων):

# grep" " /usr/share/dict/words catch clash πανί προπονητής καναπές βήχας συντριβή

Εάν θέλετε να εμφανίσετε γραμμές που περιέχουν έναν χαρακτήρα τελείας ως κυριολεκτική, τότε καθορίστε την επιλογή -F στην εντολή grep. σύμβολα"< " и «>" σημαίνει την παρουσία μιας κενή γραμμής πριν και, κατά συνέπεια, μετά τα καθορισμένα γράμματα. Αυτό σημαίνει ότι οι λέξεις στο αρχείο λέξεων πρέπει να γράφονται ανάλογα. Εάν θέλετε να βρείτε όλες τις λέξεις στο κείμενο σύμφωνα με τα καθορισμένα μοτίβα χωρίς να λάβετε υπόψη κενές γραμμές, παραλείψτε τα σύμβολα "< " и «>", για πιο ακριβή αναζήτηση μόνο λέξεων, χρησιμοποιήστε το διακόπτη -w.

Για να βρείτε ομοίως λέξεις που μπορούν να έχουν οποιονδήποτε αριθμό χαρακτήρων μεταξύ του "c" και του "h", χρησιμοποιήστε έναν αστερίσκο (*). Το παρακάτω παράδειγμα επιλέγει όλες τις λέξεις που ξεκινούν με "c" και τελειώνουν με "h" από το λεξικό συστήματος:

# grep" " /usr/share/dict/words caliph cash catch cheesecloth cheetah --output mitted--

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

# grep * /etc/profile # grep "*" /etc/profile για i στο /etc/profile.d/*.sh ; κάνω

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

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

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

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


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

Τύποι κανονικών εκφράσεων

Οι υλοποιήσεις κανονικών εκφράσεων σε διαφορετικά περιβάλλοντα, για παράδειγμα, σε γλώσσες προγραμματισμού όπως Java, Perl και Python, και σε εργαλεία Linux όπως sed, awk και grep, έχουν ορισμένα χαρακτηριστικά. Αυτά τα χαρακτηριστικά εξαρτώνται από τις λεγόμενες μηχανές κανονικής έκφρασης, οι οποίες ερμηνεύουν τα μοτίβα.
Το Linux έχει δύο μηχανές κανονικής έκφρασης:
  • Ένας κινητήρας που υποστηρίζει το πρότυπο POSIX Basic Regular Expression (BRE).
  • Ένας κινητήρας που υποστηρίζει το πρότυπο POSIX Extended Regular Expression (ERE).
Τα περισσότερα βοηθητικά προγράμματα Linux συμμορφώνονται τουλάχιστον με το πρότυπο POSIX BRE, αλλά ορισμένα βοηθητικά προγράμματα (συμπεριλαμβανομένου του sed) κατανοούν μόνο ένα υποσύνολο του προτύπου BRE. Ένας από τους λόγους για αυτόν τον περιορισμό είναι η επιθυμία να γίνουν αυτά τα βοηθητικά προγράμματα όσο το δυνατόν πιο γρήγορα στην επεξεργασία κειμένου.

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

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

Κανονικές εκφράσεις POSIX BRE

Ίσως το απλούστερο μοτίβο BRE είναι μια κανονική έκφραση για την αναζήτηση της ακριβούς εμφάνισης μιας ακολουθίας χαρακτήρων στο κείμενο. Έτσι μοιάζει η αναζήτηση μιας συμβολοσειράς στα sed και awk:

$ echo "Αυτό είναι μια δοκιμή" | sed -n "/test/p" $ echo "Αυτό είναι δοκιμή" | awk "/test/(print $0)"

Εύρεση κειμένου με μοτίβο στο sed


Εύρεση κειμένου με μοτίβο στο awk

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

Όταν εργάζεστε με κανονικές εκφράσεις, πρέπει να λάβετε υπόψη ότι κάνουν διάκριση πεζών-κεφαλαίων:

$ echo "Αυτό είναι μια δοκιμή" | awk "/Test/(print $0)" $ echo "Αυτό είναι δοκιμή" | awk "/test/(print $0)"

Οι τυπικές εκφράσεις κάνουν διάκριση πεζών-κεφαλαίων

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

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

$ echo "Αυτό είναι ένα τεστ 2 ξανά" | awk "/test 2/(print $0)"

Εύρεση ενός κειμένου που περιέχει κενά και αριθμούς

Οι χώροι αντιμετωπίζονται ως κανονικοί χαρακτήρες από τη μηχανή κανονικής έκφρασης.

Ειδικά σύμβολα

Χρησιμοποιώντας διάφορους χαρακτήρεςΣε κανονικές εκφράσεις, πρέπει να λάβετε υπόψη ορισμένα χαρακτηριστικά. Έτσι, υπάρχουν κάποιοι ειδικοί χαρακτήρες, ή μεταχαρακτήρες, η χρήση των οποίων σε ένα πρότυπο απαιτεί ειδική προσέγγιση. Εδώ είναι:

.*^${}\+?|()
Εάν ένα από αυτά χρειάζεται στο πρότυπο, θα πρέπει να διαφύγει χρησιμοποιώντας μια ανάστροφη κάθετο (πίσω κάθετο) - \ .

Για παράδειγμα, εάν πρέπει να βρείτε ένα σύμβολο του δολαρίου στο κείμενο, πρέπει να το συμπεριλάβετε στο πρότυπο, πριν από έναν χαρακτήρα διαφυγής. Ας υποθέσουμε ότι υπάρχει ένα αρχείο myfile με το ακόλουθο κείμενο:

Υπάρχουν 10 $ στην τσέπη μου
Το σύμβολο του δολαρίου μπορεί να ανιχνευθεί χρησιμοποιώντας αυτό το μοτίβο:

$awk "/\$/(εκτύπωση $0)" myfile

Χρησιμοποιώντας έναν ειδικό χαρακτήρα σε ένα μοτίβο

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

$ echo "\ είναι ένας ειδικός χαρακτήρας" | awk "/\\/(εκτύπωση $0)"

Ξεφεύγοντας από μια ανάποδη κάθετο

Αν και η κάθετο προς τα εμπρός δεν περιλαμβάνεται στη λίστα των ειδικών χαρακτήρων παραπάνω, η απόπειρα χρήσης της σε μια κανονική έκφραση γραμμένη για sed ή awk θα έχει ως αποτέλεσμα ένα σφάλμα:

$ echo "3 / 2" | awk "///(εκτύπωση $0)"

Λανθασμένη χρήση κάθετου προς τα εμπρός σε μοτίβο

Εάν χρειάζεται, πρέπει επίσης να διαφύγει:

$ echo "3 / 2" | awk "/\//(εκτύπωση $0)"

Διαφυγή από κάθετο προς τα εμπρός

Σύμβολα άγκυρας

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

$ echo "καλώς ήρθατε στον ιστότοπο likegeeks" | awk "/^likegeeks/(print $0)" $ echo "likegeeks website" | awk "/^likegeeks/(εκτύπωση $0)"

Εύρεση μοτίβου στην αρχή μιας συμβολοσειράς

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

$awk "/^this/(print $0)" myfile


Εύρεση ενός μοτίβου στην αρχή μιας γραμμής σε κείμενο από ένα αρχείο

Όταν χρησιμοποιείτε το sed, εάν τοποθετήσετε ένα καπάκι κάπου μέσα στο μοτίβο, θα αντιμετωπίζεται όπως κάθε άλλος κανονικός χαρακτήρας:

$ echo "Αυτό το ^ είναι μια δοκιμή" | sed -n "/s ^/p"

Καπάκι όχι στην αρχή του μοτίβου στο sed

Στο awk, όταν χρησιμοποιείτε το ίδιο πρότυπο, αυτός ο χαρακτήρας πρέπει να διαφύγει:

$ echo "Αυτό το ^ είναι μια δοκιμή" | awk "/s\^/(εκτύπωση $0)"

Κάλυμμα όχι στην αρχή του προτύπου στο awk

Έχουμε καταλάβει την αναζήτηση για θραύσματα κειμένου που βρίσκονται στην αρχή μιας γραμμής. Τι γίνεται αν χρειαστεί να βρείτε κάτι που βρίσκεται στο τέλος μιας γραμμής;

Το σύμβολο του δολαρίου - $, που είναι ο χαρακτήρας άγκυρας για το τέλος της γραμμής, θα μας βοηθήσει σε αυτό:

$ echo "Αυτό είναι μια δοκιμή" | awk "/test$/(εκτύπωση $0)"

Εύρεση κειμένου στο τέλος μιας γραμμής

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

$ awk "/^this is a test$/(print $0)" myfile


Ένα μοτίβο που χρησιμοποιεί ειδικούς χαρακτήρες για να ξεκινήσει και να τελειώσει μια γραμμή

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

Δείτε πώς μπορείτε να φιλτράρετε κενές γραμμές χρησιμοποιώντας χαρακτήρες αγκύρωσης:

$awk "!/^$/(εκτύπωση $0)" myfile
Σε αυτό το πρότυπο χρησιμοποίησα ένα σύμβολο άρνησης, ένα θαυμαστικό - ! . Χρησιμοποιώντας αυτό το μοτίβο αναζητούνται γραμμές που δεν περιέχουν τίποτα μεταξύ της αρχής και του τέλους της γραμμής και χάρη σε θαυμαστικόΕκτυπώνονται μόνο γραμμές που δεν ταιριάζουν με αυτό το μοτίβο.

Σύμβολο κουκκίδας

Η τελεία χρησιμοποιείται για να ταιριάζει με οποιονδήποτε μεμονωμένο χαρακτήρα εκτός από τον χαρακτήρα νέας γραμμής. Ας περάσουμε το αρχείο myfile σε αυτήν την κανονική έκφραση, τα περιεχόμενα της οποίας δίνονται παρακάτω:

$awk "/.st/(εκτύπωση $0)" myfile


Χρήση κουκκίδας σε κανονικές εκφράσεις

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

Κατηγορίες χαρακτήρων

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

Χάρη σε αυτήν την προσέγγιση, μπορείτε να οργανώσετε μια αναζήτηση για οποιονδήποτε χαρακτήρα από ένα δεδομένο σύνολο. Για να περιγράψουμε μια κατηγορία χαρακτήρων, χρησιμοποιούνται αγκύλες:

$awk "/th/(print $0)" myfile


Περιγραφή μιας κατηγορίας χαρακτήρων σε μια τυπική έκφραση

Εδώ ψάχνουμε για μια ακολουθία χαρακτήρων "ου" πριν από έναν χαρακτήρα "o" ή έναν χαρακτήρα "i".

Οι τάξεις είναι χρήσιμες κατά την αναζήτηση λέξεων που μπορούν να ξεκινούν είτε με κεφαλαία είτε με πεζά γράμματα:

$ echo "αυτό είναι μια δοκιμή" | awk "/his is a test/(print $0)" $ echo "This is a test" | awk "/his is a test/(print $0)"

Αναζητήστε λέξεις που μπορεί να ξεκινούν με πεζό ή κεφαλαίο γράμμα

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

Άρνηση τάξεων χαρακτήρων

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

$ awk "/[^oi]th/(εκτύπωση $0)" myfile


Εύρεση χαρακτήρων που δεν ανήκουν σε τάξη

Σε αυτήν την περίπτωση, θα βρεθούν ακολουθίες χαρακτήρων «ου» που δεν προηγούνται ούτε «o» ούτε «i».

Εύρος χαρακτήρων

Στις κατηγορίες χαρακτήρων, μπορείτε να περιγράψετε εύρη χαρακτήρων χρησιμοποιώντας παύλες:

$awk "/st/(print $0)" myfile


Περιγραφή μιας σειράς χαρακτήρων σε μια κατηγορία χαρακτήρων

ΣΕ σε αυτό το παράδειγμαη κανονική έκφραση ανταποκρίνεται στην ακολουθία χαρακτήρων "st" που προηγείται από οποιονδήποτε χαρακτήρα βρίσκεται μέσα αλφαβητική σειρά, μεταξύ των χαρακτήρων "e" και "p".

Τα εύρη μπορούν επίσης να δημιουργηθούν από αριθμούς:

$ ηχώ "123" | awk "//" $ echo "12a" | οκ "//"

Κανονική έκφραση για να βρείτε οποιουσδήποτε τρεις αριθμούς

Μια κατηγορία χαρακτήρων μπορεί να περιλαμβάνει πολλά εύρη:

$awk "/st/(print $0)" myfile


Μια κατηγορία χαρακτήρων που αποτελείται από πολλά εύρη

Αυτή η κανονική έκφραση θα βρει όλες τις ακολουθίες του "st" που προηγούνται από χαρακτήρες από κυμαίνεται α-φκαι m-z.

Ειδικά μαθήματα χαρακτήρων

Το BRE έχει ειδικές κατηγορίες χαρακτήρων που μπορείτε να χρησιμοποιήσετε όταν γράφετε κανονικές εκφράσεις:
  • [[:alpha:]] - ταιριάζει με οποιονδήποτε αλφαβητικό χαρακτήρα, γραμμένο με κεφαλαία ή πεζά.
  • [[:alnum:]] - ταιριάζει με οποιονδήποτε αλφαριθμητικό χαρακτήρα, συγκεκριμένα χαρακτήρες στις περιοχές 0-9 , A-Z , a-z .
  • [[:blank:]] - ταιριάζει με ένα κενό και έναν χαρακτήρα καρτέλας.
  • [[:digit:]] - οποιοσδήποτε ψηφιακός χαρακτήρας από το 0 έως το 9.
  • [[:upper:]] - κεφαλαίους αλφαβητικούς χαρακτήρες - A-Z .
  • [[:lower:]] - πεζούς αλφαβητικούς χαρακτήρες - a-z .
  • [[:print:]] - ταιριάζει με οποιονδήποτε εκτυπώσιμο χαρακτήρα.
  • [[:punct:]] - ταιριάζει με σημεία στίξης.
  • [[:χώρος:]] - κενού χαρακτήρες, ειδικότερα - διάστημα, καρτέλα, χαρακτήρες NL, FF, VT, CR.
Μπορείτε να χρησιμοποιήσετε ειδικές κλάσεις σε πρότυπα όπως αυτό:

$ echo "abc" | awk "/[[:alpha:]]/(εκτύπωση $0)" $ echo "abc" | awk "/[[:digit:]]/(εκτύπωση $0)" $ echo "abc123" | awk "/[[:digit:]]/(εκτύπωση $0)"


Ειδικές κατηγορίες χαρακτήρων σε κανονικές εκφράσεις

σύμβολο αστέρι

Εάν τοποθετήσετε έναν αστερίσκο μετά από έναν χαρακτήρα σε ένα μοτίβο, αυτό θα σημαίνει ότι η κανονική έκφραση θα λειτουργήσει εάν ο χαρακτήρας εμφανίζεται στη συμβολοσειρά πολλές φορές - συμπεριλαμβανομένης της κατάστασης όταν ο χαρακτήρας απουσιάζει από τη συμβολοσειρά.

$ echo "δοκιμή" | awk "/tes*t/(print $0)" $ echo "tessst" | awk "/tes*t/(εκτύπωση $0)"


Χρήση του χαρακτήρα * σε κανονικές εκφράσεις

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

$ echo "Μου αρέσει το πράσινο χρώμα" | awk "/colou*r/(print $0)" $ echo "μου αρέσει το πράσινο χρώμα" | awk "/colou*r/(εκτύπωση $0)"

Εύρεση λέξης με διαφορετική ορθογραφία

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

Ένα άλλο χρήσιμο χαρακτηριστικό που προέρχεται από το σύμβολο του αστερίσκου είναι να το συνδυάσετε με μια τελεία. Αυτός ο συνδυασμός επιτρέπει στην τυπική έκφραση να ανταποκρίνεται σε οποιονδήποτε αριθμό χαρακτήρων:

$ awk "/this.*test/(print $0)" myfile


Ένα πρότυπο που ανταποκρίνεται σε οποιονδήποτε αριθμό χαρακτήρων

Σε αυτήν την περίπτωση, δεν έχει σημασία πόσοι και ποιοι χαρακτήρες βρίσκονται μεταξύ των λέξεων "αυτό" και "δοκιμή".

Ο αστερίσκος μπορεί επίσης να χρησιμοποιηθεί με κατηγορίες χαρακτήρων:

$ ηχώ "στ" | awk "/s*t/(print $0)" $ echo "sat" | awk "/s*t/(print $0)" $ echo "set" | awk "/s*t/(εκτύπωση $0)"


Χρήση αστερίσκου με κατηγορίες χαρακτήρων

Και στα τρία παραδείγματα, η τυπική έκφραση λειτουργεί επειδή ο αστερίσκος μετά την κλάση χαρακτήρων σημαίνει ότι εάν βρεθεί οποιοσδήποτε αριθμός χαρακτήρων "a" ή "e" ή εάν δεν βρεθεί κανένας, η συμβολοσειρά θα ταιριάζει με το δεδομένο μοτίβο.

Κανονικές εκφράσεις POSIX ERE

Τα πρότυπα POSIX ERE που υποστηρίζουν ορισμένα βοηθητικά προγράμματα Linux ενδέχεται να περιέχουν επιπλέον χαρακτήρες. Όπως αναφέρθηκε ήδη, το awk υποστηρίζει αυτό το πρότυπο, αλλά το sed όχι.

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

▍Ερωτηματικό

Ένα ερωτηματικό υποδεικνύει ότι ο προηγούμενος χαρακτήρας μπορεί να εμφανίζεται μία φορά ή καθόλου στο κείμενο. Αυτός ο χαρακτήρας είναι ένας από τους επαναλαμβανόμενους μεταχαρακτήρες. Να μερικά παραδείγματα:

$ ηχώ "τετ" | awk "/tes?t/(print $0)" $ echo "test" | awk "/tes?t/(εκτύπωση $0)" $ echo "test" | awk "/tes?t/(εκτύπωση $0)"


Ερωτηματικό σε κανονικές εκφράσεις

Όπως μπορείτε να δείτε, στην τρίτη περίπτωση το γράμμα "s" εμφανίζεται δύο φορές, επομένως η κανονική έκφραση δεν ανταποκρίνεται στη λέξη "testst".

Το ερωτηματικό μπορεί επίσης να χρησιμοποιηθεί με κατηγορίες χαρακτήρων:

$ ηχώ "tst" | awk "/t?st/(print $0)" $ echo "test" | awk "/t?st/(εκτύπωση $0)" $ echo "γεύση" | awk "/t?st/(print $0)" $ echo "taest" | awk "/t?st/(print $0)" $ echo "test" | awk "/t?st/(εκτύπωση $0)"


Ερωτηματικό και τάξεις χαρακτήρων

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

▍Σύμβολο συν

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

$ echo "δοκιμή" | awk "/te+st/(print $0)" $ echo "test" | awk "/te+st/(print $0)" $ echo "tst" | awk "/te+st/(print $0)"


Το σύμβολο συν σε κανονικές εκφράσεις

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

$ ηχώ "tst" | awk "/t+st/(print $0)" $ echo "test" | awk "/t+st/(print $0)" $ echo "test" | awk "/t+st/(print $0)" $ echo "teeast" | awk "/t+st/(εκτύπωση $0)"


Συν τάξεις σημαδιών και χαρακτήρων

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

▍Σγουρά τιράντες

Τα σγουρά τιράντες, τα οποία μπορούν να χρησιμοποιηθούν σε μοτίβα ERE, είναι παρόμοια με τα σύμβολα που συζητήθηκαν παραπάνω, αλλά σας επιτρέπουν να προσδιορίσετε με μεγαλύτερη ακρίβεια τον απαιτούμενο αριθμό εμφανίσεων του συμβόλου που προηγείται τους. Μπορείτε να καθορίσετε έναν περιορισμό σε δύο μορφές:
  • n - ένας αριθμός που καθορίζει τον ακριβή αριθμό των εμφανίσεων που αναζητήθηκαν
  • Τα n, m είναι δύο αριθμοί που ερμηνεύονται ως εξής: "τουλάχιστον n φορές, αλλά όχι περισσότερο από m."
Ακολουθούν παραδείγματα της πρώτης επιλογής:

$ ηχώ "tst" | awk "/te(1)st/(print $0)" $ echo "test" | awk "/te(1)st/(print $0)"

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

Σε παλαιότερες εκδόσεις του awk έπρεπε να χρησιμοποιήσετε την επιλογή της γραμμής εντολών --re-interval για να κάνετε το πρόγραμμα να αναγνωρίζει διαστήματα σε κανονικές εκφράσεις, αλλά σε νεότερες εκδόσεις αυτό δεν είναι απαραίτητο.

$ ηχώ "tst" | awk "/te(1,2)st/(print $0)" $ echo "test" | awk "/te(1,2)st/(print $0)" $ echo "test" | awk "/te(1,2)st/(print $0)" $ echo "teeest" | awk "/te(1,2)st/(print $0)"


Το διάστημα καθορίζεται σε σγουρά τιράντες

Σε αυτό το παράδειγμα, ο χαρακτήρας "e" πρέπει να εμφανίζεται 1 ή 2 φορές στη γραμμή και, στη συνέχεια, η τυπική έκφραση θα ανταποκρίνεται στο κείμενο.

Τα σγουρά τιράντες μπορούν επίσης να χρησιμοποιηθούν με κατηγορίες χαρακτήρων. Οι αρχές που ήδη γνωρίζετε ισχύουν εδώ:

$ ηχώ "tst" | awk "/t(1,2)st/(print $0)" $ echo "test" | awk "/t(1,2)st/(print $0)" $ echo "test" | awk "/t(1,2)st/(print $0)" $ echo "teeast" | awk "/t(1,2)st/(print $0)"


Σγουρά τιράντες και κατηγορίες χαρακτήρων

Το πρότυπο θα αντιδράσει στο κείμενο εάν περιέχει τον χαρακτήρα "a" ή τον χαρακτήρα "e" μία ή δύο φορές.

▍Λογικό σύμβολο «ή».

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

$ echo "Αυτό είναι μια δοκιμή" | awk "/test|exam/(print $0)" $ echo "Αυτή είναι μια εξέταση" | awk "/test|exam/(print $0)" $ echo "Αυτό είναι κάτι άλλο" | awk "/test|exam/(print $0)"


Λογικό «ή» σε κανονικές εκφράσεις

Σε αυτό το παράδειγμα, η κανονική έκφραση έχει ρυθμιστεί για αναζήτηση στο κείμενο για τις λέξεις "test" ή "exam". Λάβετε υπόψη ότι μεταξύ των θραυσμάτων του προτύπου και του συμβόλου που τα χωρίζει | δεν πρέπει να υπάρχουν κενά.

Τα θραύσματα κανονικής έκφρασης μπορούν να ομαδοποιηθούν χρησιμοποιώντας παρενθέσεις. Εάν ομαδοποιήσετε μια συγκεκριμένη ακολουθία χαρακτήρων, θα γίνει αντιληπτή από το σύστημα ως ένας συνηθισμένος χαρακτήρας. Δηλαδή, για παράδειγμα, μπορούν να εφαρμοστούν σε αυτό μεταχαρακτήρες επανάληψης. Έτσι φαίνεται:

$ echo "Like" | awk "/Like(Geeks)?/(εκτύπωση $0)" $ echo "LikeGeeks" | awk "/Like(Geeks)?/(print $0)"


Ομαδοποίηση θραυσμάτων κανονικής έκφρασης

Σε αυτά τα παραδείγματα, η λέξη "Geeks" περικλείεται σε παρένθεση, ακολουθούμενη από ένα ερωτηματικό. Θυμηθείτε ότι ένα ερωτηματικό σημαίνει "0 ή 1 επανάληψη", επομένως η κανονική έκφραση θα ανταποκρίνεται τόσο στη συμβολοσειρά "Like" και στη συμβολοσειρά "LikeGeeks".

Πρακτικά παραδείγματα

Τώρα που καλύψαμε τα βασικά των κανονικών εκφράσεων, ήρθε η ώρα να κάνουμε κάτι χρήσιμο με αυτές.

▍Μέτρηση του αριθμού των αρχείων

Ας γράψουμε ένα σενάριο bash που μετρά αρχεία που βρίσκονται σε καταλόγους που είναι γραμμένα σε μια μεταβλητή περιβάλλον ΠΑΘ. Για να το κάνετε αυτό, θα χρειαστεί πρώτα να δημιουργήσετε μια λίστα με διαδρομές καταλόγου. Ας το κάνουμε αυτό χρησιμοποιώντας sed, αντικαθιστώντας τα άνω και κάτω τελεία με κενά:

$ ηχώ $PATH | sed "s/:/ /g"
Η εντολή αντικατάστασης υποστηρίζει κανονικές εκφράσεις ως μοτίβα για την αναζήτηση κειμένου. Σε αυτήν την περίπτωση, όλα είναι εξαιρετικά απλά, ψάχνουμε για το σύμβολο άνω και κάτω τελείας, αλλά κανείς δεν μας ενοχλεί να χρησιμοποιήσουμε κάτι άλλο εδώ - όλα εξαρτώνται από τη συγκεκριμένη εργασία.
Τώρα πρέπει να περάσετε από τη λίστα που προκύπτει σε έναν βρόχο και να εκτελέσετε τις απαραίτητες ενέργειες για να μετρήσετε τον αριθμό των αρχείων. Το γενικό περίγραμμα του σεναρίου θα έχει ως εξής:

Mypath=$(echo $PATH | sed "s/:/ /g") για κατάλογο στο $mypath ολοκληρώθηκε
Τώρα ας γράψουμε το πλήρες κείμενο του σεναρίου, χρησιμοποιώντας την εντολή ls για να λάβουμε πληροφορίες σχετικά με τον αριθμό των αρχείων σε κάθε κατάλογο:

#!/bin/bash mypath=$(echo $PATH | sed "s/:/ /g") count=0 για κατάλογο στο $mypath do check=$(ls $directory) για το στοιχείο στο $check do count=$ [ $count + 1 ] ολοκληρώθηκε ηχώ "$directory - $count" count=0 ολοκληρωθεί
Κατά την εκτέλεση του σεναρίου, μπορεί να αποδειχθεί ότι ορισμένοι κατάλογοι από το PATH δεν υπάρχουν, ωστόσο, αυτό δεν θα το εμποδίσει να μετράει αρχεία σε υπάρχοντες καταλόγους.


Καταμέτρηση αρχείων

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

▍Επαλήθευση διευθύνσεων email

Υπάρχουν ιστότοποι με τεράστιες συλλογές κανονικών εκφράσεων που σας επιτρέπουν να ελέγχετε διευθύνσεις ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ, τηλεφωνικοί αριθμοί, και ούτω καθεξής. Ωστόσο, άλλο πράγμα είναι να παίρνεις κάτι έτοιμο και άλλο να δημιουργείς κάτι μόνος σου. Ας γράψουμε λοιπόν μια τυπική έκφραση για να ελέγξουμε τις διευθύνσεις email. Ας ξεκινήσουμε με την ανάλυση των δεδομένων πηγής. Εδώ, για παράδειγμα, είναι μια συγκεκριμένη διεύθυνση:

[email προστατευμένο]
Το όνομα χρήστη, το όνομα χρήστη, μπορεί να αποτελείται από αλφαριθμητικούς και μερικούς άλλους χαρακτήρες. Δηλαδή, αυτό είναι μια τελεία, μια παύλα, μια υπογράμμιση, ένα σύμβολο συν. Το όνομα χρήστη ακολουθείται από ένα σύμβολο @.

Έχοντας αυτή τη γνώση, ας αρχίσουμε να συναρμολογούμε την τυπική έκφραση από την αριστερή πλευρά, η οποία χρησιμοποιείται για τον έλεγχο του ονόματος χρήστη. Να τι πήραμε:

^(+)@
Αυτή η τυπική έκφραση μπορεί να διαβαστεί ως εξής: "Η γραμμή πρέπει να ξεκινά με τουλάχιστον έναν χαρακτήρα από αυτούς της ομάδας που καθορίζονται σε αγκύλες, ακολουθούμενο από ένα σύμβολο @."

Τώρα - η ουρά ονόματος κεντρικού υπολογιστή - όνομα κεντρικού υπολογιστή . Εδώ ισχύουν οι ίδιοι κανόνες όπως και για το όνομα χρήστη, οπότε το πρότυπο για αυτό θα μοιάζει με αυτό:

(+)
Το όνομα τομέα ανώτατου επιπέδου υπόκειται σε ειδικούς κανόνες. Μπορούν να υπάρχουν μόνο αλφαβητικοί χαρακτήρες, από τους οποίους πρέπει να υπάρχουν τουλάχιστον δύο (για παράδειγμα, τέτοιοι τομείς συνήθως περιέχουν κωδικό χώρας) και όχι περισσότεροι από πέντε. Όλα αυτά σημαίνουν ότι το πρότυπο για τον έλεγχο του τελευταίου μέρους της διεύθυνσης θα είναι ως εξής:

\.({2,5})$
Μπορείτε να το διαβάσετε ως εξής: "Πρώτα πρέπει να υπάρχει μια τελεία, μετά 2 έως 5 αλφαβητικούς χαρακτήρες και μετά τελειώνει η γραμμή."

Έχοντας προετοιμάσει πρότυπα για μεμονωμένα μέρη της κανονικής έκφρασης, ας τα συγκεντρώσουμε:

^(+)@(+)\.({2,5})$
Τώρα το μόνο που μένει είναι να δοκιμάσουμε τι συνέβη:

$ ηχώ" [email προστατευμένο]" | awk "/^(+)@(+)\.((2,5))$/(εκτύπωση $0)" $ echo " [email προστατευμένο]" | awk "/^(+)@(+)\.((2,5))$/(εκτύπωση $0)"


Επικύρωση διεύθυνσης email χρησιμοποιώντας κανονικές εκφράσεις

Το γεγονός ότι το κείμενο που μεταβιβάστηκε σε awk εμφανίζεται στην οθόνη σημαίνει ότι το σύστημα το αναγνώρισε ως διεύθυνση email.

Αποτελέσματα

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

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

Αγαπητοι αναγνωστες! Χρησιμοποιείτε κανονικές εκφράσεις κατά την επεξεργασία κειμένου σε σενάρια γραμμής εντολών;

Μία από τις πιο χρήσιμες και πλούσιες σε χαρακτηριστικά ομάδες τερματικό Linux– Εντολή “grep”. Το Grep είναι ένα ακρωνύμιο που σημαίνει "global regular expression print" (δηλαδή, "αναζητήστε παντού για συμβολοσειρές που ταιριάζουν με μια κανονική έκφραση και εκτυπώστε τις"). Αυτό σημαίνει ότι το grep μπορεί να χρησιμοποιηθεί για να δει αν η είσοδος ταιριάζει με καθορισμένα μοτίβα.

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

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

Βασικά στοιχεία χρήσης

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

Για παράδειγμα, μπορείτε να χρησιμοποιήσετε το grep για να βρείτε γραμμές που περιέχουν τη λέξη "GNU" στην έκδοση 3 της Γενικής Άδειας Δημόσιας Χρήσης GNU σε ένα σύστημα Ubuntu.

cd /usr/share/common-licenses
grep "GNU" GPL-3
GNU ΓΕΝΙΚΗ ΔΗΜΟΣΙΑ ΑΔΕΙΑ





13. Χρήση με τη Γενική Δημόσια Άδεια GNU Affero.
υπό την έκδοση 3 της Γενικής Άδειας Δημόσιας Χρήσης GNU Affero σε ένα single
...
...

Το πρώτο όρισμα, "GNU", είναι το μοτίβο για αναζήτηση και το δεύτερο όρισμα, "GPL-3", είναι το αρχείο εισόδου που πρέπει να βρεθεί.

Ως αποτέλεσμα, θα βγουν όλες οι γραμμές που περιέχουν το μοτίβο κειμένου. Σε ορισμένες Διανομές Linuxτο μοτίβο που αναζητάτε θα τονιστεί στις γραμμές εξόδου.

Γενικές επιλογές

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

Εάν πρέπει να αγνοήσετε τα πεζά γράμματα της παραμέτρου αναζήτησης και να αναζητήσετε παραλλαγές κεφαλαίων και πεζών του μοτίβου, μπορείτε να χρησιμοποιήσετε τα βοηθητικά προγράμματα "-i" ή "--ignore-case".

Για παράδειγμα, μπορείτε να χρησιμοποιήσετε το grep για να αναζητήσετε στο ίδιο αρχείο τη λέξη "άδεια χρήσης" γραμμένη με κεφαλαία, πεζά ή μεικτά.

grep -i "άδεια" GPL-3
GNU ΓΕΝΙΚΗ ΔΗΜΟΣΙΑ ΑΔΕΙΑ
αυτού του εγγράφου άδειας, αλλά δεν επιτρέπεται η αλλαγή του.
Η Γενική Δημόσια Άδεια GNU είναι μια δωρεάν άδεια copyleft για
Οι άδειες χρήσης για τα περισσότερα λογισμικά και άλλες πρακτικές εργασίες έχουν σχεδιαστεί
η Γενική Δημόσια Άδεια GNU προορίζεται να εγγυηθεί την ελευθερία σας
GNU General Public License για το μεγαλύτερο μέρος του λογισμικού μας. ισχύει επίσης για


Η "Αυτή η Άδεια" αναφέρεται στην έκδοση 3 της Γενικής Δημόσιας Άδειας GNU.
Ο όρος "Το Πρόγραμμα" αναφέρεται σε οποιοδήποτε έργο που προστατεύεται από πνευματικά δικαιώματα με άδεια χρήσης βάσει αυτής
...
...

Όπως μπορείτε να δείτε, η έξοδος περιέχει "LICENSE", "license" και "License". Εάν υπήρχε μια παρουσία του "LiCeNsE" στο αρχείο, θα έβγαινε επίσης.
Εάν πρέπει να βρείτε όλες τις γραμμές που δεν περιέχουν το καθορισμένο μοτίβο, μπορείτε να χρησιμοποιήσετε τις σημαίες "-v" ή "--invert-match".

Για παράδειγμα, μπορείτε να χρησιμοποιήσετε την ακόλουθη εντολή για να αναζητήσετε την άδεια BSD για όλες τις γραμμές που δεν περιέχουν τη λέξη "the":

grep -v "το" BSD
Ολα τα δικαιώματα διατηρούνται.
Αναδιανομή και χρήση σε πηγαία και δυαδική μορφή, με ή χωρίς
συναντήθηκαν:
μπορεί να χρησιμοποιηθεί για την έγκριση ή την προώθηση προϊόντων που προέρχονται από αυτό το λογισμικό
χωρίς συγκεκριμένη προηγούμενη γραπτή άδεια.
ΑΥΤΟ ΤΟ ΛΟΓΙΣΜΙΚΟ ΠΑΡΕΧΕΤΑΙ ΑΠΟ ΤΟΥΣ REGENTS ΚΑΙ ΣΥΝΤΕΛΕΣΤΕΣ "ΩΣ ΕΧΕΙ"" ΚΑΙ
ΟΠΟΙΑΔΗΠΟΤΕ ΡΗΤΗ Ή ΣΙΩΠΗΡΗ ΕΓΓΥΗΣΗ, ΣΥΜΠΕΡΙΛΑΜΒΑΝΟΜΕΝΩΝ, ΑΛΛΑ ΟΧΙ ΠΕΡΙΟΡΙΣΜΕΝΩΝ,
...
...

Όπως μπορείτε να δείτε, οι δύο τελευταίες γραμμές βγήκαν ως μη περιέχουσες τη λέξη "the" επειδή δεν χρησιμοποιήθηκε η εντολή "ignore case".

Είναι πάντα χρήσιμο να γνωρίζετε τους αριθμούς των γραμμών όπου βρέθηκαν οι αντιστοιχίσεις. Μπορούν να βρεθούν χρησιμοποιώντας τις σημαίες "-n" ή "--line-number".

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

grep -vn "το" BSD
2: Με την επιφύλαξη παντός δικαιώματος.
3:
4: Αναδιανομή και χρήση σε πηγαία και δυαδική μορφή, με ή χωρίς
6: πληρούνται:
13: μπορεί να χρησιμοποιηθεί για την έγκριση ή την προώθηση προϊόντων που προέρχονται από αυτό το λογισμικό
14: χωρίς συγκεκριμένη προηγούμενη γραπτή άδεια.
15:
16: ΑΥΤΟ ΤΟ ΛΟΓΙΣΜΙΚΟ ΠΑΡΕΧΕΤΑΙ ΑΠΟ ΤΟΥΣ REGENTS ΚΑΙ ΣΥΝΤΕΛΕΣΤΕΣ "ΩΣ ΕΧΕΙ"" ΚΑΙ
17: ΟΠΟΙΑΔΗΠΟΤΕ ΡΗΤΗ Ή ΣΙΩΠΗΡΗ ΕΓΓΥΗΣΗ, ΣΥΜΠΕΡΙΛΑΜΒΑΝΟΝΤΑΣ, ΑΛΛΑ ΟΧΙ ΠΕΡΙΟΡΙΣΜΕΝΗ ΣΕ
...
...

Τώρα μπορείτε να ανατρέξετε στον αριθμό γραμμής όταν πρέπει να κάνετε αλλαγές σε κάθε γραμμή που δεν περιέχει "το".

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

Όπως αναφέρθηκε στην εισαγωγή, το grep σημαίνει «παγκόσμια κανονική εκτύπωση έκφρασης». Μια τυπική έκφραση είναι μια συμβολοσειρά κειμένου που περιγράφει ένα συγκεκριμένο μοτίβο αναζήτησης.

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

Ταιριάζει γράμματα

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

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

Τα μοτίβα που ταιριάζουν ακριβώς με δεδομένους χαρακτήρες ονομάζονται μοτίβα "γράμματος" επειδή ταιριάζουν με το μοτίβο γράμμα προς γράμμα, χαρακτήρα προς χαρακτήρα.

Όλοι οι αλφαβητικοί και αριθμητικοί χαρακτήρες (και ορισμένοι άλλοι χαρακτήρες) ταιριάζουν κυριολεκτικά εκτός εάν έχουν τροποποιηθεί από άλλους μηχανισμούς έκφρασης.

Αγκυρα αγώνες

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

Για παράδειγμα, μπορείτε να καθορίσετε ότι η αναζήτηση χρειάζεται μόνο γραμμές που περιέχουν τη λέξη "GNU" στην αρχή. Για να το κάνετε αυτό, πρέπει να χρησιμοποιήσετε την άγκυρα "^" πριν από τη συμβολοσειρά γραμμάτων.

Αυτό το παράδειγμα εκτυπώνει μόνο γραμμές που περιέχουν τη λέξη "GNU" στην αρχή.

grep "^GNU" GPL-3
GNU General Public License για το μεγαλύτερο μέρος του λογισμικού μας. ισχύει επίσης για
GNU General Public License, μπορείτε να επιλέξετε οποιαδήποτε έκδοση έχει δημοσιευτεί ποτέ

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

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

grep "and$" GPL-3
ότι δεν υπάρχει εγγύηση για αυτό το δωρεάν λογισμικό. Και για τους δύο χρήστες" και
Οι ακριβείς όροι και προϋποθέσεις αντιγραφής, διανομής και


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

Ταιριάξτε οποιονδήποτε χαρακτήρα

Η τελεία (.) χρησιμοποιείται σε κανονικές εκφράσεις για να υποδείξει ότι οποιοσδήποτε χαρακτήρας μπορεί να εμφανιστεί στην καθορισμένη θέση.

Για παράδειγμα, εάν θέλετε να βρείτε αντιστοιχίσεις που περιέχουν δύο χαρακτήρες και στη συνέχεια την ακολουθία "cept", θα χρησιμοποιήσετε το ακόλουθο μοτίβο:

grep "..cept" GPL-3
χρήση, που είναι ακριβώς εκεί που είναι πιο απαράδεκτο. Ως εκ τούτου, εμείς
παραβίαση σύμφωνα με την ισχύουσα νομοθεσία περί πνευματικών δικαιωμάτων, εκτός από την εκτέλεσή της σε α
λέει στον χρήστη ότι δεν υπάρχει εγγύηση για την εργασία (εκτός από την

έντυπο ξεχωριστής γραπτής άδειας ή που αναφέρεται ως εξαιρέσεις·
Δεν μπορείτε να διαδώσετε ή να τροποποιήσετε ένα καλυμμένο έργο παρά μόνο όπως ρητά
9. Δεν απαιτείται αποδοχή για την κατοχή αντιγράφων.
...
...

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

Εκφράσεις σε παρένθεση

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

Αυτό σημαίνει ότι εάν πρέπει να βρείτε συμβολοσειρές που περιέχουν "too" ή "two", μπορείτε να υποδείξετε εν συντομία αυτές τις παραλλαγές χρησιμοποιώντας το ακόλουθο μοτίβο:

grep "to" GPL-3
τα προγράμματά σας επίσης.

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

Αντίστοιχη πηγή από διακομιστή δικτύου χωρίς χρέωση.
...
...

Όπως μπορείτε να δείτε, και οι δύο παραλλαγές βρέθηκαν στο αρχείο.

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

Αυτό το παράδειγμα χρησιμοποιεί το μοτίβο ".ode", το οποίο δεν πρέπει να ταιριάζει με την ακολουθία "code".

grep "[^c]ode" GPL-3
1. Πηγαίος κώδικας.
μοντέλο, για να δώσει σε όποιον έχει τον κωδικό αντικειμένου είτε (1) α
ο μόνος σημαντικός τρόπος χρήσης του προϊόντος.
παρατηρήστε ως εξής όταν ξεκινά σε διαδραστική λειτουργία:

Αξίζει να σημειωθεί ότι η έξοδος δεύτερης γραμμής περιέχει τη λέξη "code". Αυτό δεν είναι σφάλμα regex ή grep.

Μάλλον, αυτή η γραμμή εκτυπώθηκε επειδή περιέχει επίσης την ακολουθία αντιστοίχισης προτύπων "mode" που βρίσκεται στη λέξη "model". Δηλαδή, η συμβολοσειρά τυπώθηκε επειδή ταίριαζε με το μοτίβο.

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

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

grep "^" GPL-3
GNU General Public License για το μεγαλύτερο μέρος του λογισμικού μας. ισχύει επίσης για

Αδεια. Κάθε κάτοχος άδειας απευθύνεται ως "εσείς". «Άδειες» και


Βιβλιοθήκες συστήματος ή εργαλεία γενικής χρήσης ή γενικά διαθέσιμα δωρεάν
Πηγή.

...
...

Λόγω ορισμένων εγγενών προβλημάτων ταξινόμησης, για πιο ακριβή αποτελέσματα είναι προτιμότερο να χρησιμοποιείτε κατηγορίες χαρακτήρων POSIX αντί για το εύρος χαρακτήρων που χρησιμοποιείται στο παραπάνω παράδειγμα.
Υπάρχουν πολλές κατηγορίες χαρακτήρων που δεν καλύπτονται σε αυτό το εγχειρίδιο. για παράδειγμα, για να εκτελέσετε την ίδια διαδικασία όπως στο παραπάνω παράδειγμα, μπορείτε να χρησιμοποιήσετε την κλάση χαρακτήρων "[:upper:]" σε παρένθεση.

grep "^[[:upper:]]" GPL-3
GNU General Public License για το μεγαλύτερο μέρος του λογισμικού μας. ισχύει επίσης για
Τα κράτη δεν θα πρέπει να επιτρέπουν στα διπλώματα ευρεσιτεχνίας να περιορίζουν την ανάπτυξη και τη χρήση
Αδεια. Κάθε κάτοχος άδειας απευθύνεται ως "εσείς". «Άδειες» και
Το στοιχείο και (β) χρησιμεύει μόνο για να επιτρέπει τη χρήση της εργασίας με αυτό
Κύριο στοιχείο ή για την υλοποίηση μιας τυπικής διεπαφής για την οποία ένα
Βιβλιοθήκες συστήματος ή εργαλεία γενικής χρήσης ή γενικά διαθέσιμα δωρεάν
Πηγή.
Το προϊόν χρήστη μεταφέρεται στον παραλήπτη στο διηνεκές ή για α
...
...

Επαναλάβετε το μοτίβο (0 ή περισσότερες φορές)

Ένας από τους πιο συχνά χρησιμοποιούμενους μεταχαρακτήρες είναι το σύμβολο "*", που σημαίνει "επαναλάβετε τον προηγούμενο χαρακτήρα ή έκφραση 0 ή περισσότερες φορές."

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

grep "(*)" GPL-3

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

Πώς να αποφύγετε τους μεταχαρακτήρες

Μερικές φορές μπορεί να χρειαστεί να αναζητήσετε μια κυριολεκτική περίοδο ή μια κυριολεκτική ανοιχτή παρένθεση. Επειδή αυτοί οι χαρακτήρες έχουν συγκεκριμένο νόημα στις κανονικές εκφράσεις, πρέπει να τους «ξεφύγετε» λέγοντας στον grep ότι η ειδική τους σημασία δεν χρειάζεται σε αυτή την περίπτωση.

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

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

grep "^.*\.$" GPL-3
Πηγή.
Άδεια χρήσης κάνοντας εξαιρέσεις από έναν ή περισσότερους όρους της.
Η άδεια θα ήταν η πλήρης αποχή από τη μετάδοση του Προγράμματος.
ΟΛΕΣ ΟΙ ΑΠΑΡΑΙΤΗΤΕΣ ΣΕΡΒΙΣ, ΕΠΙΣΚΕΥΗ Ή ΔΙΟΡΘΩΣΗ.
ΤΕΤΟΙΕΣ ΖΗΜΙΕΣ.
Προσθέστε επίσης πληροφορίες σχετικά με τον τρόπο επικοινωνίας μαζί σας μέσω ηλεκτρονικού και έντυπου ταχυδρομείου.

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

Η εντολή Grep μπορεί επίσης να χρησιμοποιηθεί με μια εκτεταμένη κανονική γλώσσα έκφρασης χρησιμοποιώντας τη σημαία -E ή καλώντας την εντολή egrep αντί για grep.

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

Ομαδοποίηση

Ένα από τα απλούστερα και πιο χρήσιμα χαρακτηριστικά που παρέχουν οι εκτεταμένες κανονικές εκφράσεις είναι η δυνατότητα ομαδοποίησης παραστάσεων και χρήσης τους ως ενιαίας ενότητας.

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

grep "\(ομαδοποίηση\)" file.txt
grep -E "(ομαδοποίηση)" file.txt
egrep "(ομαδοποίηση)" file.txt

Οι παραπάνω εκφράσεις είναι ισοδύναμες.

Εναλλαγή

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

Το σύμβολο της κάθετης γραμμής «|» χρησιμοποιείται για να υποδείξει την εναλλαγή. Η εναλλαγή χρησιμοποιείται συχνά στην ομαδοποίηση για να υποδείξει ότι μία από τις δύο ή περισσότερες πιθανές επιλογές πρέπει να θεωρηθεί ως ταίριασμα.

Σε αυτό το παράδειγμα, πρέπει να αναζητήσετε "GPL" ή "General Public License":

grep -E "(GPL|Γενική δημόσια άδεια)" GPL-3
Η Γενική Δημόσια Άδεια GNU είναι μια δωρεάν άδεια copyleft για
η Γενική Δημόσια Άδεια GNU προορίζεται να εγγυηθεί την ελευθερία σας
GNU General Public License για το μεγαλύτερο μέρος του λογισμικού μας. ισχύει επίσης για
τιμή. Οι Γενικές Δημόσιες Άδειες μας έχουν σχεδιαστεί για να διασφαλίζουν ότι εσείς
Οι προγραμματιστές που χρησιμοποιούν την GNU GPL προστατεύουν τα δικαιώματά σας με δύο βήματα:
Για την προστασία των προγραμματιστών και των δημιουργών, η GPL εξηγεί ξεκάθαρα
Για λόγους συγγραφέων, η GPL απαιτεί οι τροποποιημένες εκδόσεις να επισημαίνονται ως
έχουν σχεδιάσει αυτήν την έκδοση της GPL για να απαγορεύσει την πρακτική για αυτούς
...
...

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

Ποσοτικοί δείκτες

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

Για να αντιστοιχίσετε έναν χαρακτήρα 0 ή περισσότερες φορές, μπορείτε να χρησιμοποιήσετε τον χαρακτήρα "?". Θα κάνει τον προηγούμενο χαρακτήρα ή σειρά χαρακτήρων ουσιαστικά προαιρετικό.

Σε αυτό το παράδειγμα, εισάγοντας την ακολουθία "αντιγραφή" στην προαιρετική ομάδα, εμφανίζονται οι αντιστοιχίες "copyright" και "right":

grep -E "(αντιγραφή)?δεξιά" GPL-3
Πνευματικά δικαιώματα (C) 2007 Free Software Foundation, Inc.
Για να προστατεύσουμε τα δικαιώματά σας, πρέπει να εμποδίσουμε άλλους να σας αρνηθούν
αυτά τα δικαιώματα ή ζητώντας σας να παραδώσετε τα δικαιώματα. Επομένως, έχετε
γνωρίζουν τα δικαιώματά τους.
Οι προγραμματιστές που χρησιμοποιούν την GNU GPL προστατεύουν τα δικαιώματά σας με δύο βήματα:
(1) διεκδικήστε τα πνευματικά δικαιώματα για το λογισμικό και (2) σας προσφέρουμε αυτήν την Άδεια χρήσης
"Πνευματικά δικαιώματα" σημαίνει επίσης νόμους που μοιάζουν με πνευματικά δικαιώματα που ισχύουν για άλλα είδη
...
...

Ο χαρακτήρας "+" ταιριάζει με εκφράσεις 1 ή περισσότερες φορές. Λειτουργεί σχεδόν όπως το σύμβολο "*", αλλά όταν χρησιμοποιείται "+" η έκφραση πρέπει να ταιριάζει τουλάχιστον 1 φορά.

Η ακόλουθη έκφραση ταιριάζει με τη συμβολοσειρά "δωρεάν" συν 1 ή περισσότερους χαρακτήρες που δεν είναι κενό διάστημα:

grep -E "free[^[:space:]]+" GPL-3
Η Γενική Δημόσια Άδεια GNU είναι μια δωρεάν άδεια copyleft για
να σου αφαιρέσει την ελευθερία να μοιράζεσαι και να αλλάζεις τα έργα. Σε αντίθεση,
η Γενική Δημόσια Άδεια GNU προορίζεται να εγγυηθεί την ελευθερία σας
Όταν μιλάμε για ελεύθερο λογισμικό, αναφερόμαστε στην ελευθερία, όχι
έχουν την ελευθερία να διανέμουν αντίγραφα του ελεύθερου λογισμικού (και να χρεώνουν για

ελευθερίες που λάβατε. Πρέπει να βεβαιωθείτε ότι λαμβάνουν και αυτοί
προστασία των χρηστών" ελευθερία αλλαγής του λογισμικού. Η συστηματική
της GPL, όπως απαιτείται για την προστασία της ελευθερίας των χρηστών.
τα διπλώματα ευρεσιτεχνίας δεν μπορούν να χρησιμοποιηθούν για να καταστεί το πρόγραμμα μη ελεύθερο.

Αριθμός επαναλαμβανόμενων αγώνων

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

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

grep -E "(3)" GPL-3
άλλαξε, ώστε να μην αποδοθούν εσφαλμένα τα προβλήματά τους
συγγραφείς προηγούμενων εκδόσεων.
λάβετε το, σε οποιοδήποτε μέσο, ​​με την προϋπόθεση ότι εμφανώς και
δίνουν σύμφωνα με την προηγούμενη παράγραφο, συν δικαίωμα κατοχής του
καλυπτόμενη εργασία, ώστε να ικανοποιούνται ταυτόχρονα οι υποχρεώσεις σας βάσει αυτής
Εάν πρέπει να βρείτε όλες τις λέξεις που αποτελούνται από 16-20 χαρακτήρες, χρησιμοποιήστε την ακόλουθη έκφραση:
grep -E "[[:alpha:]](16,20)" GPL-3
ορισμένες ευθύνες εάν διανέμετε αντίγραφα του λογισμικού ή εάν
το τροποποιείτε: ευθύνες σεβασμού της ελευθερίας των άλλων.
γ) Απαγόρευση ψευδούς δήλωσης της προέλευσης αυτού του υλικού, ή

συμπεράσματα

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

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

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

Ετικέτες: ,

Καλησπέρα, καλεσμένοι!

Στο σημερινό άρθρο θέλω να θίξω ένα τόσο τεράστιο θέμα όπως Κανονικές εκφράσεις. Νομίζω ότι όλοι γνωρίζουν ότι το θέμα των regexes (όπως ονομάζονται οι κανονικές εκφράσεις στην αργκό) είναι τεράστιο στο εύρος μιας ανάρτησης. Ως εκ τούτου, θα προσπαθήσω να συγκεντρώσω εν συντομία, αλλά όσο πιο ξεκάθαρα γίνεται, τις σκέψεις μου και να σας τις μεταφέρω στο .

Επιτρέψτε μου να ξεκινήσω λέγοντας ότι υπάρχουν διάφοροι τύποι κανονικών εκφράσεων:

1. Παραδοσιακές κανονικές εκφράσεις(είναι επίσης βασικά, βασικά και βασικές κανονικές εκφράσεις(BRE))

  • Η σύνταξη αυτών των εκφράσεων ορίζεται ως ξεπερασμένη, αλλά παρόλα αυτά εξακολουθεί να είναι ευρέως διαδεδομένη και χρησιμοποιείται από πολλά βοηθητικά προγράμματα UNIX
  • Οι βασικές κανονικές εκφράσεις περιλαμβάνουν τους ακόλουθους μεταχαρακτήρες (περισσότερα για τη σημασία τους παρακάτω):
    • \( \) - αρχική έκδοση για ( ) (σε εκτεταμένη)
    • \(\) - αρχική έκδοση για () (σε εκτεταμένη)
    • \n, Οπου n- αριθμός από 1 έως 9
  • Χαρακτηριστικά της χρήσης αυτών των μεταχαρακτόρων:
    • Ένας αστερίσκος πρέπει να ακολουθεί την έκφραση που αντιστοιχεί σε έναν μεμονωμένο χαρακτήρα. Παράδειγμα: *.
    • Έκφραση \( ΟΙΚΟΔΟΜΙΚΟ ΤΕΤΡΑΓΩΝΟ\)* θα πρέπει να θεωρείται λανθασμένο. Σε ορισμένες περιπτώσεις ταιριάζει με μηδέν ή περισσότερες επαναλήψεις της συμβολοσειράς ΟΙΚΟΔΟΜΙΚΟ ΤΕΤΡΑΓΩΝΟ. Σε άλλα αντιστοιχεί στη χορδή ΟΙΚΟΔΟΜΙΚΟ ΤΕΤΡΑΓΩΝΟ* .
    • Μέσα σε μια κατηγορία χαρακτήρων, οι ειδικές έννοιες χαρακτήρων αγνοούνται σε μεγάλο βαθμό. Ειδικές περιπτώσεις:
    • Για να προσθέσετε έναν χαρακτήρα ^ σε ένα σύνολο, δεν πρέπει να τοποθετηθεί πρώτα εκεί.
    • Για να προσθέσετε έναν χαρακτήρα - σε ένα σύνολο, πρέπει να τοποθετηθεί εκεί πρώτο ή τελευταίο. Για παράδειγμα:
      • Πρότυπο ονόματος DNS, το οποίο μπορεί να περιλαμβάνει γράμματα, αριθμούς, μείον και μια τελεία: [-0-9a-zA-Z.] ;
      • οποιοσδήποτε χαρακτήρας εκτός από το μείον και τους αριθμούς: [^-0-9] .
    • Για να προσθέσετε έναν χαρακτήρα [ ή ] σε ένα σύνολο, πρέπει πρώτα να τοποθετηθεί εκεί. Για παράδειγμα:
      • ταιριάζει ], [, a ή b.

2. Προηγμένες κανονικές εκφράσεις(αυτοί είναι εκτεταμένες κανονικές εκφράσεις(ΠΡΙΝ))

  • Η σύνταξη αυτών των εκφράσεων είναι παρόμοια με τη σύνταξη των κύριων εκφράσεων, με εξαίρεση:
    • Καταργήθηκε η χρήση ανάστροφης κάθετης για τους μεταχαρακτήρες ( ) και ().
    • Μια ανάστροφη κάθετο πριν ένας μεταχαρακτήρας υπερκεράσει την ιδιαίτερη σημασία του.
    • Απορρίφθηκε θεωρητικά ακανόνιστοςσχέδιο\ n .
    • Προστέθηκαν μεταχαρακτήρες + , ? , | .

3. Κανονικές εκφράσεις συμβατές με Perl(αυτοί είναι Τακτικές εκφράσεις συμβατές με Perl(PCRE))

  • έχουν πιο πλούσια και ταυτόχρονα προβλέψιμη σύνταξη ακόμη και από το POSIX ERE, επομένως χρησιμοποιούνται συχνά από εφαρμογές.

Κανονικές εκφράσεις αποτελείται απόπρότυπα, ή μάλλον ορίστε ένα πρότυποΑναζήτηση. Το πρότυπο αποτελείταιαπό κανόνεςαναζητήσεις, οι οποίες αποτελούνται από χαρακτήρεςΚαι μεταχαρακτήρες.

Κανόνες αναζήτησηςκαθορίζονται από τα ακόλουθα επιχειρήσεις:

Απαρίθμηση |

Σωλήνας (|)διαχωρίζει έγκυρες επιλογές, θα έλεγε κανείς - λογικό Ή. Για παράδειγμα, το "γκρι|γκρίζο" ταιριάζει γκρίή γκρί.

Ομάδα ή ένωση()

Στρογγυλά στηρίγματαχρησιμοποιούνται για τον καθορισμό του εύρους και της προτεραιότητας των τελεστών. Για παράδειγμα, το "γκρι|γκρι" και το "gr(a|e)y" είναι διαφορετικά μοτίβα, αλλά και τα δύο περιγράφουν ένα σύνολο που περιέχει γκρίΚαι γκρί.

Ποσοτικοποίηση (); * +

Ποσοτικοποιητήςμετά από έναν χαρακτήρα ή μια ομάδα καθορίζει πόσες φορές προηγούμενοςμπορεί να εμφανιστεί έκφραση.

γενική έκφραση, μπορεί να είναι επαναλήψεις από m έως n συμπεριλαμβανομένου.

γενική έκφραση m ή περισσότερες επαναλήψεις.

γενική έκφραση όχι περισσότερες από n επαναλήψεις.

λείοςn επαναλήψεις.

Ερωτηματικόπου σημαίνει 0 ή 1φορές, όπως {0,1} . Για παράδειγμα, το "colou?r" ταιριάζει και χρώμα, Και χρώμα.

Αστέριπου σημαίνει 0, 1 ή οποιοσδήποτε αριθμόςμια φορά ( {0,} ). Για παράδειγμα, το "go*gle" ταιριάζει γελάω, Google, googleκαι τα λοιπά.

Συνπου σημαίνει τουλάχιστον 1μια φορά ( {1,} ). Για παράδειγμα, το "go+gle" ταιριάζει Google, googleκλπ. (αλλά όχι γελάω).

Η ακριβής σύνταξη αυτών των κανονικών εκφράσεων εξαρτάται από την υλοποίηση. (δηλαδή στο βασικές κανονικές εκφράσειςσύμβολα ( Και )- δραπέτευσε με ανάδρομη κάθετο)

Μεταχαρακτήρες, με απλά λόγια, είναι σύμβολα που δεν ανταποκρίνονται στην πραγματική τους σημασία, δηλαδή σύμβολο. (dot) δεν είναι μια τελεία, αλλά οποιοσδήποτε χαρακτήρας, κ.λπ. Εξοικειωθείτε με τους μεταχαρακτήρες και τη σημασία τους:

. αντιστοιχεί μόνοςοποιοδήποτε σύμβολο
[κάτι] Υποχωρητικός οποιοδήποτε singleχαρακτήρας από αυτούς που περικλείονται σε αγκύλες. Σε αυτήν την περίπτωση: Ο χαρακτήρας «-» ερμηνεύεται κυριολεκτικά μόνο εάν βρίσκεται αμέσως μετά από ένα άνοιγμα ή πριν από μια παρένθεση κλεισίματος: ή [-abc]. Διαφορετικά, υποδηλώνει ένα διάστημα χαρακτήρων. Για παράδειγμα, ταιριάζει με "a", "b" ή "c". αντιστοιχεί σε πεζά γράμματα του λατινικού αλφαβήτου. Αυτοί οι χαρακτηρισμοί μπορούν να συνδυαστούν: ταιριάζει με a, b, c, q, r, s, t, u, v, w, x, y, z. Για να ταιριάζει με τους χαρακτήρες «[» ή «]», αρκεί να Η αγκύλη κλεισίματος ήταν ο πρώτος χαρακτήρας μετά τον αρχικό χαρακτήρα: ταιριάζει με "]", "[", "a" ή "b". Εάν η τιμή σε αγκύλες προηγείται από έναν χαρακτήρα ^, τότε η τιμή της έκφρασης ταιριάζει ενιαίο χαρακτήρααπό αυτά που δεν είναι μέσα σε αγκύλες. Για παράδειγμα, το [^abc] ταιριάζει με οποιονδήποτε άλλο χαρακτήρα εκτός από "a", "b" ή "c". Το [^a-z] ταιριάζει με οποιονδήποτε χαρακτήρα εκτός από πεζούς χαρακτήρες στο λατινικό αλφάβητο.
^ Ταιριάζει με την αρχή του κειμένου (ή την αρχή οποιασδήποτε γραμμής εάν η λειτουργία είναι γραμμή προς γραμμή).
$ Ταιριάζει με το τέλος του κειμένου (ή το τέλος οποιασδήποτε γραμμής αν η λειτουργία είναι γραμμή προς γραμμή).
\(\) ή () Δηλώνει μια "επισημασμένη υποέκφραση" (ομαδοποιημένη έκφραση) που μπορεί να χρησιμοποιηθεί αργότερα (δείτε το ακόλουθο στοιχείο: \ n). Μια "επισημασμένη υποέκφραση" είναι επίσης "μπλοκ". Σε αντίθεση με άλλους τελεστές, αυτός (στην παραδοσιακή σύνταξη) απαιτεί μια ανάστροφη κάθετο· στους εκτεταμένους και Perl, ο χαρακτήρας \ δεν χρειάζεται.
\n Οπου n- αυτός είναι ένας αριθμός από το 1 έως το 9. αντιστοιχεί nη ου σημειωμένη υποέκφραση (για παράδειγμα (abcd)\0, δηλαδή οι χαρακτήρες abcd σημειώνονται με μηδέν). Αυτός ο σχεδιασμός είναι θεωρητικά ακανόνιστος, δεν έγινε αποδεκτό στην εκτεταμένη σύνταξη κανονικής έκφρασης.
*
  • Αστέριμετά από μια έκφραση που ταιριάζει με έναν χαρακτήρα, ταιριάζει μηδένή περισσότερο αντίγραφααυτή η (προηγούμενη) έκφραση. Για παράδειγμα, το "*" ταιριάζει με την κενή συμβολοσειρά, "x", "y", "zx", "zyx" κ.λπ.
  • \n*, Οπου nείναι ένα ψηφίο από το 1 έως το 9, ταιριάζει με μηδέν ή περισσότερες εμφανίσεις nου σημειωμένη υποέκφραση. Για παράδειγμα, το "\(a.\)c\1*" ταιριάζει με το "abcab" και το "abcaba", αλλά όχι το "abcac".

Μια έκφραση που περικλείεται σε "\(" και "\)" ακολουθούμενη από "*" θα πρέπει να θεωρείται παράνομη. Σε ορισμένες περιπτώσεις, ταιριάζει με μηδέν ή περισσότερες εμφανίσεις της συμβολοσειράς που περικλείεται σε παρένθεση. Σε άλλα, ταιριάζει με την έκφραση που περικλείεται σε παρένθεση, δεδομένου του χαρακτήρα "*".

\{Χ,y\} Αντιστοιχεί στο τελευταίο ( ανερχόμενος) εμφανίζεται τουλάχιστον μπλοκ Χκαι όχι περισσότερο yμια φορά. Για παράδειγμα, το "a\(3,5\)" ταιριάζει με "aaa", "aaaa" ή "aaaaa". Σε αντίθεση με άλλους τελεστές, αυτός (στην παραδοσιακή σύνταξη) απαιτεί ανάστροφη κάθετο.
.* Προσδιορισμός οποιουδήποτε αριθμού χαρακτήρων ανάμεσα σε δύο μέρη μιας κανονικής έκφρασης.

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

  • πρέπει να προηγηθεί ( ασπίδα) μεταχαρακτήρας (. * + \ ? ( )) ανάστροφη κάθετο. Για παράδειγμα \. ή \[

Για να απλοποιηθεί ο ορισμός ορισμένων συνόλων χαρακτήρων, συνδυάστηκαν στο λεγόμενο. τάξεις και κατηγορίες χαρακτήρων. Το POSIX έχει τυποποιήσει τη δήλωση ορισμένων κατηγοριών και κατηγοριών χαρακτήρων, όπως φαίνεται στον παρακάτω πίνακα:

Τάξη POSIX ομοίως ονομασία
[:ανώτερος:] κεφαλαίους χαρακτήρες
[:πιο χαμηλα:] πεζούς χαρακτήρες
[:άλφα:] κεφαλαίους και πεζούς χαρακτήρες
[:alnum:] αριθμούς, κεφαλαίους και πεζούς χαρακτήρες
[:ψηφίο:] αριθμοί
[:xdigit:] δεκαεξαδικά ψηφία
[:punct:] [.,!?:…] σημεία στίξης
[:κενό:] [\t] χώρο και TAB
[:χώρος:] [\t\n\r\f\v] παράλειψη χαρακτήρων
[:cntrl:] χαρακτήρες ελέγχου
[:γραφική παράσταση:] [^\t\n\r\f\v] σύμβολα σφραγίδων
[:Τυπώνω:] [^\t\n\r\f\v] σφραγίστε σύμβολα και παραλείψτε τα σύμβολα

Στο regex υπάρχει κάτι όπως:

Regex απληστίας

Θα προσπαθήσω να το περιγράψω όσο πιο ξεκάθαρα γίνεται. Ας πούμε ότι θέλουμε να τα βρούμε όλα Ετικέτες HTMLσε κάποιο κείμενο. Έχοντας εντοπίσει το πρόβλημα, θέλουμε να βρούμε τις τιμές που περιέχονται μεταξύ τους< и >, μαζί με αυτές τις ίδιες αγκύλες. Αλλά ξέρουμε ότι οι ετικέτες έχουν διαφορετικά μήκη και υπάρχουν τουλάχιστον 50 ετικέτες οι ίδιες. Το να τις καταχωρήσεις όλες, να τις περικλείεις σε μετασύμβολα, είναι πολύ χρονοβόρο έργο. Αλλά ξέρουμε ότι έχουμε μια έκφραση.* (αστερίσκος με τελεία), η οποία χαρακτηρίζει οποιονδήποτε αριθμό χαρακτήρων στη γραμμή. Με τη χρήση δεδομένη έκφρασηθα προσπαθήσουμε να βρούμε στο κείμενο (

Ετσι, Πώς να δημιουργήσετε Επίπεδο RAID 10/50 στον ελεγκτή LSI MegaRAID (επίσης σχετικός για: Intel SRCU42x, Intel SRCS16):

) όλες οι τιμές μεταξύ< и >. Ως αποτέλεσμα, ΟΛΗ η γραμμή θα ταιριάζει με αυτήν την έκφραση. γιατί, επειδή το regex είναι ΑΠΙΣΤΕΥΤΟ και προσπαθεί να συλλάβει ΟΠΟΙΟΔΗΠΟΤΕ ΟΛΟΥΣ τον αριθμό των χαρακτήρων μεταξύ τους< и >, αντίστοιχα ολόκληρη η γραμμή, ξεκινώντας < p>Λοιπόν...και τελειώνει ...> θα ανήκει σε αυτόν τον κανόνα!

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

  • λάβετε υπόψη τα σύμβολα Δενπου αντιστοιχεί στο επιθυμητό μοτίβο (για παράδειγμα:<[^>]*> για την παραπάνω περίπτωση)
  • απαλλαγείτε από την απληστία προσθέτοντας έναν ορισμό του ποσοτικού δείκτη ως μη άπληστος:
    • *? - ισοδύναμο "not greedy" ("τεμπέλης") *
    • +? - «not greedy» («τεμπέλης») ισοδύναμο +
    • (n,); - "not greedy" ("τεμπέλης") ισοδύναμο (n,)
    • .*; - ισοδύναμο "not greedy" ("τεμπέλης").*

Θα ήθελα να προσθέσω σε όλα τα παραπάνω εκτεταμένη σύνταξη κανονικής έκφρασης:

Οι κανονικές εκφράσεις στο POSIX είναι παρόμοιες με την παραδοσιακή σύνταξη Unix, αλλά με την προσθήκη ορισμένων μεταχαρακτόρων:

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

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

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

Η χρήση των ανάστροφων καθέτων έχει επίσης καταργηθεί: το \(…\) γίνεται (…) και το \(…\) γίνεται (…).

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

$ cat text1 1 μήλο 2 αχλάδι 3 μπανάνα $ grep p κείμενο1 1 μήλο 2 αχλάδι $ grep "pp*" κείμενο1 1 μήλο 2 αχλάδι $ cat text1 | grep "l\|n" 1 μήλο 3 μπανάνα $ echo -e "βρες ένα\n* εδώ" | grep "\*" * εδώ $ grep "pl\?.*r" text1 # p, σε γραμμές όπου υπάρχει ένα r 2 pear $ grep "a.." text1 # γραμμές με ένα a ακολουθούμενο από τουλάχιστον 2 χαρακτήρες 1 apple 3 banana $ grep "" text1 # αναζήτηση για γραμμές που περιέχουν 3 ή p 1 apple 2 pear 3 banana $ echo -e "βρες ένα\n* εδώ\nκάπου." | grep "[.*]" * εδώ κάπου..name]$ echo -e "123\n456\n789\n0" | grep "" 123,456,789 $ sed -e "/\(a.*a\)\|\(p.*p\)/s/a/A/g" text1 # αντικαταστήστε το a με το A σε όλες τις γραμμές όπου μετά το a έρχεται a ή μετά το p έρχεται p 1 Μήλο 2 αχλάδι 3 bAnAnA *\./ ΤΕΛΕΥΤΑΙΑ ΛΕΞΗ./g" Πρώτα. ΜΙΑ ΤΕΛΕΥΤΑΙΑ ΛΕΞΗ. Αυτή είναι μια ΤΕΛΕΥΤΑΙΑ ΛΕΞΗ.

Με εκτίμηση, McSim!

Το grep σημαίνει «σφαιρικός εκτυπωτής κανονικής έκφρασης». Το grep κόβει τις γραμμές που χρειάζεστε αρχεία κειμένουπου περιέχουν κείμενο που καθορίζεται από το χρήστη.

Το grep μπορεί να χρησιμοποιηθεί με δύο τρόπους - μόνο του ή σε συνδυασμό με ρέματα.

Το grep είναι πολύ εκτεταμένο σε λειτουργικότητα λόγω του μεγάλου αριθμού επιλογών που υποστηρίζει, όπως: αναζήτηση χρησιμοποιώντας μοτίβο συμβολοσειράς ή κανονικό μοτίβο έκφρασης RegExp ή κανονικές εκφράσεις με βάση την perl κ.λπ.

Λόγω της διαφορετικότητάς του λειτουργικότηταΤο εργαλείο grep έχει πολλές επιλογές όπως egrep (Εκτεταμένο GREP), fgrep (Σταθερό GREP), pgrep (Διαδικασία GREP), rgrep (αναδρομικό GREP)και τα λοιπά. Αλλά αυτές οι επιλογές έχουν μικρές διαφορές από το αρχικό grep.

επιλογές grep

$ grep -V grep (GNU grep) 2.10 Πνευματικά δικαιώματα (C) 2011 Free Software Foundation, Inc. Άδεια GPLv3+

Υπάρχουν τροποποιήσεις του βοηθητικού προγράμματος grep: egrep (με εκτεταμένη επεξεργασία κανονικών εκφράσεων), fgrep (το οποίο αντιμετωπίζει τα σύμβολα $*^|()\ ως κυριολεκτικά, δηλαδή κυριολεκτικά), rgrep (με ενεργοποιημένη την αναδρομική αναζήτηση).

    Το egrep είναι το ίδιο με το grep -E

    Το fgrep είναι το ίδιο με το grep -F

    Το rgrep είναι το ίδιο με το grep -r

    grep [-b] [-c] [-i] [-l] [-n] [-s] [-v] limited_regex_BRE [αρχείο ...]

Η εντολή grep αντιστοιχίζει τις γραμμές στα αρχεία προέλευσης με το μοτίβο που καθορίζεται από το limited_regex. Εάν δεν έχουν καθοριστεί αρχεία, χρησιμοποιείται η τυπική είσοδος. Συνήθως, κάθε συμβολοσειρά που ταιριάζει με επιτυχία αντιγράφεται στην τυπική έξοδο. εάν υπάρχουν πολλά αρχεία προέλευσης, το όνομα του αρχείου δίνεται πριν από τη γραμμή που βρέθηκε. Το grep χρησιμοποιεί έναν συμπαγή, μη ντετερμινιστικό αλγόριθμο. Οι περιορισμένες κανονικές εκφράσεις (εκφράσεις που έχουν σειρές χαρακτήρων με τις έννοιές τους και χρησιμοποιούν περιορισμένο σύνολο αλφαριθμητικών και ειδικών χαρακτήρων) γίνονται αντιληπτές ως πρότυπα. Έχουν την ίδια σημασία με τις κανονικές εκφράσεις στο ed.

Για να αποφύγετε τους χαρακτήρες $, *, , ^, |, () και \ από την ερμηνεία του κελύφους, είναι πιο εύκολο να περικλείσετε το constrained_regex σε μεμονωμένα εισαγωγικά.

Επιλογές:

B Προλογίζει κάθε γραμμή με τον αριθμό μπλοκ στο οποίο βρέθηκε. Αυτό μπορεί να είναι χρήσιμο κατά την αναζήτηση μπλοκ ανά πλαίσιο (τα μπλοκ αριθμούνται ξεκινώντας από το 0). -c Εκτυπώνει μόνο τον αριθμό των γραμμών που περιέχουν το μοτίβο. -h Αποτρέπει την εκτύπωση του ονόματος αρχείου που περιέχει την αντιστοιχισμένη γραμμή πριν από την ίδια τη γραμμή. Χρησιμοποιείται κατά την αναζήτηση σε πολλά αρχεία. -i Αγνοεί περίπτωση κατά τη σύγκριση. -l Εκτυπώνει μόνο τα ονόματα των αρχείων που περιέχουν τις αντίστοιχες συμβολοσειρές, μία ανά γραμμή. Εάν βρεθεί ένα μοτίβο σε πολλές γραμμές ενός αρχείου, το όνομα του αρχείου δεν επαναλαμβάνεται. -n Εκτυπώνει πριν από κάθε γραμμή τον αριθμό της στο αρχείο (οι γραμμές αριθμούνται ξεκινώντας από το 1). -s Καταστέλλει μηνύματα σχετικά με ανύπαρκτα ή μη αναγνώσιμα αρχεία. -v Εκτυπώνει όλες τις γραμμές εκτός από αυτές που περιέχουν μοτίβο. -w Αναζητά την έκφραση ως λέξη, σαν να περιβάλλεται από μεταχαρακτήρες \< и \>.

grep --βοήθεια

Χρήση: grep [OPTION]... PATTERN [FILE]... Αναζητά PATTERN σε κάθε ΑΡΧΕΙΟ ή τυπική είσοδο. Από προεπιλογή, το PATTERN είναι μια απλή τυπική έκφραση (BRE). Παράδειγμα: grep -i "hello world" menu.h main.c Επιλογή του τύπου της κανονικής έκφρασης και της ερμηνείας της: -E, --extended-regexp PATTERN - εκτεταμένη τυπική έκφραση (ERE) -F, --fixed-regexp PATTERN - συμβολοσειρές σταθερού μήκους, διαχωρισμένες με χαρακτήρα νέας γραμμής -G, --basic-regexp PATTERN - απλή κανονική έκφραση (BRE) -P, --perl-regexp PATTERN - κανονικές εκφράσεις Perl -e, --regexp=PATTERN χρήση PATTERN σε αναζήτηση - f, --file=FILE λήψη PATTERN από FILE -i, --ignore-case ignore case ignore difference -w, --word-regexp PATTERN πρέπει να ταιριάζει με όλες τις λέξεις -x, --line-regexp PATTERN πρέπει να ταιριάζει με ολόκληρη τη γραμμή -z, --null-data lines διαχωρίζονται από ένα null byte αντί για έναν χαρακτήρα τέλους γραμμής Διάφορα: -s, --no-messages suppress messages error -v, --rever-match επιλογή μη αντιστοιχισμένων γραμμών -V, - - έκδοση εκτύπωσης πληροφορίες έκδοσης και έξοδος --help εμφάνιση αυτής της βοήθειας και έξοδος --mmap για συμβατότητα προς τα πίσω, αγνόησε Έλεγχος εξόδου: -m, --max-count=NUMBER διακοπή μετά τον καθορισμένο ΑΡΙΘΜΟ αντιστοιχιών -b, --byte-offset εκτυπώστε τη μετατόπιση byte μαζί με τις γραμμές εξόδου -n, --line-number εκτυπώστε τη γραμμή αριθμός μαζί με τις γραμμές εξόδου --line-buffered ξεπλύνετε το buffer μετά από κάθε γραμμή -H, --with-filename εκτυπώστε το όνομα αρχείου για κάθε αντιστοίχιση -h, --no-filename δεν ξεκινά την έξοδο με το όνομα αρχείου -- label=LABEL χρήση LABEL ως όνομα αρχείου για την τυπική είσοδο -o, --only-matching εμφανίζει μόνο μέρος της γραμμής που ταιριάζει PATTERN -q, --quiet, --silent suppress all normal output --binary-files=TYPE assume ότι δυαδικό αρχείοέχει ΤΥΠΟ: δυαδικό, κείμενο ή χωρίς αντιστοίχιση. -a, --text ίδιο με --binary-files=text -I ίδιο με --binary-files=without-match -d, --directories=ACTION τρόπος χειρισμού καταλόγων Η ACTION μπορεί να διαβαστεί ), recurse (αναδρομικά) ή πηδήξω (παραλείπω). -D, --devices=ACTION τρόπος χειρισμού συσκευών, FIFO και υποδοχών Η ACTION μπορεί να διαβαστεί ή να παραλειφθεί -R, -r, --recursive ίδια με --directories=recurse --include=F_PATTERN επεξεργασία μόνο αρχείων που ταιριάζουν στο F_TEMPLATE - -exclude=F_TEMPLATE παράβλεψη αρχείων και καταλόγων που ταιριάζουν με F_TEMPLATE --exclude-from=FILE παράβλεψη αρχείων που αντιστοιχούν στα αρχεία προτύπων από FILE --exclude-dir=TEMPLATE οι κατάλογοι που ταιριάζουν με PATTERN θα παραβλεφθούν -L, - -αρχεία-χωρίς-αντίστοιχη εκτύπωση μόνο Ονόματα ΑΡΧΕΙΩΝ χωρίς αντιστοιχίσεις -l, --αρχεία-με αντιστοιχίσεις εκτυπώνουν μόνο ονόματα ΑΡΧΕΙΩΝ με αντιστοιχίσεις -c, --μέτρηση εκτύπωση μόνο του αριθμού των γραμμών που ταιριάζουν ανά ΑΡΧΕΙΟ -T, --καρτέλα στοίχισης αρχικής καρτέλας (εάν είναι απαραίτητο) - Z, --null εκτύπωση byte 0 μετά το όνομα ΑΡΧΕΙΟΥ Διαχείριση περιβάλλοντος: -B, --before-context=NUM εκτύπωση του NUMBER γραμμών του προηγούμενου περιβάλλοντος -A, --after-context=NUM εκτύπωση του NUMBER γραμμών του το επόμενο πλαίσιο -C, --context[=NUMBER] εκτυπώνει τον ΑΡΙΘΜΟ των γραμμών περιβάλλοντος -ΑΡΙΘΜΟΣ είναι το ίδιο με --context=NUMBER --color[=WHEN], --colour[=WHEN] χρησιμοποιούν δείκτες για να διακρίνουν την αντιστοίχιση γραμμές? WHEN μπορεί να είναι πάντα, ποτέ ή αυτόματα -U, --binary μην αφαιρείτε χαρακτήρες CR στο τέλος της γραμμής (MSDOS) -u, --unix-byte-offsets εμφανίζουν μετατόπιση σαν να μην υπήρχε κανένα CR-s (MSDOS ) Αντί για "egrep", υποτίθεται ότι τρέχει "grep -E". Το "grep -F" υποτίθεται αντί του "fgrep". Είναι καλύτερα να μην τρέχετε ως "egrep" ή "fgrep". Όταν το FILE δεν έχει καθοριστεί ή όταν το FILE είναι -, τότε διαβάζεται η τυπική είσοδος. Εάν έχουν καθοριστεί λιγότερα από δύο αρχεία, θεωρείται -h. Εάν βρεθεί αντιστοίχιση, ο κωδικός εξόδου θα είναι 0 και 1 εάν όχι. Εάν προκύψουν σφάλματα ή εάν δεν έχει καθοριστεί η επιλογή -q, ο κωδικός εξόδου θα είναι 2. Αναφέρετε σφάλματα στη διεύθυνση: Αναφέρετε σφάλματα στη μετάφραση στη διεύθυνση: Αρχική σελίδα GNU Grep: Βοήθεια για εργασία με προγράμματα GNU: