3.2 Μάθημα 2
Πιστοποιητικό: |
Linux Essentials |
---|---|
Έκδοση: |
1.6 |
Θέμα: |
3 Η Δύναμη της Γραμμής Εντολών |
Σκοπός: |
3.2 Αναζήτηση και Εξαγωγή Δεδομένων από Αρχεία |
Μάθημα: |
2 απο 2 |
Εισαγωγή
Σε αυτό το μάθημα, θα εξετάσουμε τα εργαλεία που χρησιμοποιούνται για την χειραγώγηση κειμένου. Αυτά τα εργαλεία χρησιμοποιούνται συχνά από διαχειριστές συστήματος ή προγράμματα για αυτόματη παρακολούθηση ή αναγνώριση συγκεκριμένων επαναλαμβανόμενων πληροφοριών.
Αναζήτηση σε Αρχεία με grep
Το πρώτο εργαλείο που θα συζητήσουμε σε αυτό το μάθημα είναι η εντολή grep
. Το grep
είναι η συντομογραφία της φράσης “global regular expression print” και η κύρια λειτουργία του είναι η αναζήτηση εντός αρχείων για το καθορισμένο μοτίβο. Η εντολή εξάγει τη γραμμή που περιέχει το καθορισμένο μοτίβο επισημασμένο με κόκκινο.
$ grep bash /etc/passwd root:x:0:0:root:/root:/bin/bash user:x:1001:1001:User,,,,:/home/user:/bin/bash
Το grep
, όπως οι περισσότερες εντολές, μπορεί επίσης να τροποποιηθεί χρησιμοποιώντας επιλογές. Εδώ είναι οι πιο συνηθισμένες:
-i
-
η αναζήτηση δεν κάνει διάκριση πεζών-κεφαλαίων
-r
-
η αναζήτηση είναι αναδρομική (αναζητά σε όλα τα αρχεία του δεδομένου καταλόγου και των υποκαταλόγων του)
-c
-
η αναζήτηση μετράει τον αριθμό των αντιστοιχιών
-v
-
αντιστρέψτε την αντιστοίχιση, για να εκτυπώσετε γραμμές που δεν ταιριάζουν με τον όρο αναζήτησης
-E
-
ενεργοποιεί τις εκτεταμένες regular expressions (απαιτούνται από ορισμένους από τους πιο προχωρημένους μεταχαρακτήρες όπως
|
,+
και?
)
Το grep
έχει πολλές άλλες χρήσιμες επιλογές. Συμβουλευτείτε τη σελίδα man για να μάθετε περισσότερα σχετικά με αυτό.
Regular Expressions
Το δεύτερο εργαλείο είναι πολύ ισχυρό. Χρησιμοποιείται για να περιγράψει κομμάτια κειμένου μέσα σε αρχεία, που ονομάζονται επίσης regular expressions. Οι regular expressions είναι εξαιρετικά χρήσιμες για την εξαγωγή δεδομένων από αρχεία κειμένου με την κατασκευή μοτίβων. Χρησιμοποιούνται συνήθως μέσα σε scripts ή κατά τον προγραμματισμό με γλώσσες υψηλού επιπέδου, όπως η Perl ή η Python.
Όταν εργάζεστε με regular expressions, είναι πολύ σημαντικό να έχετε κατά νου ότι κάθε χαρακτήρας μετράει και το μοτίβο γράφεται με σκοπό την αντιστοίχιση μιας συγκεκριμένης ακολουθίας χαρακτήρων, γνωστή ως συμβολοσειρά. Τα περισσότερα μοτίβα χρησιμοποιούν τα κανονικά σύμβολα ASCII, όπως γράμματα, ψηφία, σημεία στίξης ή άλλα σύμβολα, αλλά μπορεί επίσης να χρησιμοποιεί χαρακτήρες Unicode για να ταιριάζει με οποιονδήποτε άλλο τύπο κειμένου.
Η ακόλουθη λίστα εξηγεί τους μετα-χαρακτήρες regular expressions που χρησιμοποιούνται για να σχηματίσουν τα μοτίβα.
.
-
Αντιστοίχιση οποιουδήποτε μεμονωμένου χαρακτήρα (εκτός από τη νέα γραμμή)
[abcABC]
-
Αντιστοίχιση οποιουδήποτε χαρακτήρα μέσα στις αγκύλες
[^abcABC]
-
Αντιστοίχιση οποιουδήποτε χαρακτήρα εκτός από αυτούς που βρίσκονται στις αγκύλες
[a-z]
-
Αντιστοίχιση οποιουδήποτε χαρακτήρα στο εύρος
[^a-z]
-
Αντιστοίχιση οποιουδήποτε χαρακτήρα εκτός από αυτούς του εύρους
sun|moon
-
Εύρεση οποιασδήποτε από τις συμβολοσειρές που αναφέρονται
^
-
Αρχή γραμμής
$
-
Τέλος γραμμής
Όλες οι λειτουργίες των regular expressions μπορούν να υλοποιηθούν και μέσω του 'grep'. Μπορείτε να δείτε ότι στο παραπάνω παράδειγμα, η λέξη δεν περιβάλλεται από διπλά εισαγωγικά. Για να αποτρέψετε την ερμηνεία του ίδιου του μεταχαρακτήρα από το shell, συνιστάται το πιο περίπλοκο μοτίβο να είναι μεταξύ διπλών εισαγωγικών (" "). Για λόγους εξάσκησης, θα χρησιμοποιούμε διπλά εισαγωγικά κατά την εφαρμογή regular expressions. Τα άλλα εισαγωγικά διατηρούν την κανονική τους λειτουργικότητα, όπως συζητήθηκε σε προηγούμενα μαθήματα.
Τα ακόλουθα παραδείγματα τονίζουν τη λειτουργικότητα των regular expressions. Θα χρειαστούμε δεδομένα μέσα στο αρχείο, επομένως το επόμενο σύνολο εντολών απλώς προσθέτει διάφορες συμβολοσειρές στο αρχείο text.txt
.
$ echo "aaabbb1" > text.txt $ echo "abab2" >> text.txt $ echo "noone2" >> text.txt $ echo "class1" >> text.txt $ echo "alien2" >> text.txt $ cat text.txt aaabbb1 abab2 noone2 class1 alien2
Το πρώτο παράδειγμα είναι ένας συνδυασμός αναζήτησης μέσα στο αρχείο χωρίς και με regular expressions. Για να κατανοήσουμε πλήρως τις regular expressions, είναι πολύ σημαντικό να δείξουμε τη διαφορά. Η πρώτη εντολή αναζητά την ακριβή συμβολοσειρά, οπουδήποτε στη γραμμή, ενώ η δεύτερη εντολή αναζητά σύνολα χαρακτήρων που περιέχουν οποιονδήποτε από τους χαρακτήρες μεταξύ των αγκυλών. Επομένως, τα αποτελέσματα των εντολών είναι διαφορετικά.
$ grep "ab" text.txt aaabbb1 abab2 $ grep "[ab]" text.txt aaabbb1 abab2 class1 alien2
Το δεύτερο σύνολο παραδειγμάτων δείχνει την εφαρμογή του μεταχαρακτήρα της αρχής και του τέλους της γραμμής. Είναι πολύ σημαντικό να προσδιορίσετε την ανάγκη να τοποθετήσετε τους 2 χαρακτήρες στη σωστή θέση στην έκφραση. Κατά τον καθορισμό της αρχής της γραμμής, ο μεταχαρακτήρας πρέπει να είναι πριν από την έκφραση, ενώ, όταν προσδιορίζεται το τέλος της γραμμής, ο μεταχαρακτήρας πρέπει να βρίσκεται μετά την έκφραση.
$ grep "^a" text.txt aaabbb1 abab2 alien2 $ grep "2$" text.txt abab2 noone2 alien2
Εκτός από τους προηγούμενους μεταχαρακτήρες που εξηγήθηκαν, οι regular expressions έχουν επίσης μεταχαρακτήρες που επιτρέπουν τον πολλαπλασιασμό του μοτίβου που προηγείται:
*
-
Μηδέν ή περισσότερα από το προηγηθέν μοτίβο
+
-
Ένα ή περισσότερα από το προηγηθέν μοτίβο
?
-
Μηδέν ή ένα από το προηγηθέν μοτίβο
Για τους μεταχαρακτήρες πολλαπλασιαστές, η παρακάτω εντολή αναζητά μια συμβολοσειρά που περιέχει ab
, έναν μεμονωμένο χαρακτήρα και έναν ή περισσότερους από τους χαρακτήρες που βρέθηκαν προηγουμένως. Το αποτέλεσμα δείχνει ότι το grep
βρήκε τη συμβολοσειρά aaabbb1
, που ταιριάζει με το τμήμα abbb
καθώς και τη συμβολοσειρά abab2
. Δεδομένου ότι ο χαρακτήρας +
είναι ένας χαρακτήρας εκτεταμένης regular expression, πρέπει να περάσουμε την επιλογή -E
στην εντολή grep
.
$ grep -E "ab.+" text.txt aaabbb1 abab2
Οι περισσότεροι μετα-χαρακτήρες είναι αυτονόητοι, αλλά μπορεί να γίνουν δύσκολοι όταν χρησιμοποιούνται για πρώτη φορά. Τα προηγούμενα παραδείγματα αντιπροσωπεύουν ένα μικρό μέρος της λειτουργικότητας των regular expressions. Δοκιμάστε όλους τους μεταχαρακτήρες από τον παραπάνω πίνακα για να καταλάβετε περισσότερα για το πώς λειτουργούν.
Καθοδηγούμενες Ασκήσεις
Χρησιμοποιώντας grep
και το αρχείο /usr/share/hunspell/en_US.dic
, βρείτε τις γραμμές που ταιριάζουν με τα ακόλουθα κριτήρια:
-
Όλες τις γραμμές που περιέχουν τη λέξη
cat
οπουδήποτε στη γραμμή. -
Όλες τις γραμμές που δεν περιέχουν κανέναν από τους ακόλουθους χαρακτήρες:
sawgtfixk
. -
Όλες τις γραμμές που ξεκινούν με οποιαδήποτε 3 γράμματα και τη λέξη
dig
. -
Όλες τις γραμμές που τελειώνουν με τουλάχιστον ένα
e
. -
Όλες τις γραμμές που περιέχουν μία από τις ακόλουθες λέξεις:
org
,kay
ήtuna
. -
Τον αριθμό των γραμμών που ξεκινούν με ένα ή κανένα
c
ακολουθούμενο από τη συμβολοσειράati
.
Ασκήσεις Εξερεύνησης
-
Βρείτε την regular expression που αντιστοιχεί με τις λέξεις στη γραμμή “Συμπερίληψη” και δεν ταιριάζει με αυτές της γραμμής “Εξαίρεση”:
-
Συμπερίληψη:
pot
,spot
,apot
Εξαίρεση:
potic
,spots
,potatoe
-
Συμπερίληψη:
arp99
,apple
,zipper
Εξαίρεση:
zoo
,arive
,attack
-
Συμπερίληψη:
arcane
,capper
,zoology
Εξαίρεση:
air
,coper
,zoloc
-
Συμπερίληψη:
0th/pt
,3th/tc
,9th/pt
Εξαίρεση:
0/nm
,3/nm
,9/nm
-
Συμπερίληψη:
Hawaii
,Dario
,Ramiro
Εξαίρεση:
hawaii
,Ian
,Alice
-
-
Ποια άλλη χρήσιμη εντολή χρησιμοποιείται συνήθως για την αναζήτηση μέσα στα αρχεία; Τι επιπλέον λειτουργίες έχει;
-
Αφού θυμηθείτε το προηγούμενο μάθημα, χρησιμοποιήστε ένα από τα παραδείγματα και προσπαθήστε να αναζητήσετε ένα συγκεκριμένο μοτίβο στην έξοδο της εντολής, με τη βοήθεια του
grep
.
Σύνοψη
Σε αυτό το εργαστήριο μάθατε:
-
Mετα-χαρακτήρες regular expressions
-
Πώς να δημιουργήσετε μοτίβα με regular expressions
-
Πώς να κάνετε αναζήτηση μέσα στα αρχεία
Εντολές που χρησιμοποιήθηκαν στις ασκήσεις:
grep
-
Αναζητά χαρακτήρες ή συμβολοσειρές μέσα σε ένα αρχείο
Απαντήσεις στις Καθοδηγούμενες Ασκήσεις
Χρησιμοποιώντας grep
και το αρχείο /usr/share/hunspell/en_US.dic
, βρείτε τις γραμμές που ταιριάζουν με τα ακόλουθα κριτήρια:
-
Όλες τις γραμμές που περιέχουν τη λέξη
cat
οπουδήποτε στη γραμμή.$ grep "cat" /usr/share/hunspell/en_US.dic Alcatraz/M Decatur/M Hecate/M ...
-
Όλες τις γραμμές που δεν περιέχουν κανέναν από τους ακόλουθους χαρακτήρες:
sawgtfixk
.$ grep -v "[sawgtfixk]" /usr/share/hunspell/en_US.dic 49269 0/nm 1/n1 2/nm 2nd/p 3/nm 3rd/p 4/nm 5/nm 6/nm 7/nm 8/nm ...
-
Όλες τις γραμμές που ξεκινούν με οποιαδήποτε 3 γράμματα και τη λέξη
dig
.$ grep "^...dig" /usr/share/hunspell/en_US.dic cardigan/SM condign predigest/GDS ...
-
Όλες τις γραμμές που τελειώνουν με τουλάχιστον ένα
e
.$ grep -E "e+$" /usr/share/hunspell/en_US.dic Anglicize Anglophobe Anthropocene ...
-
Όλες τις γραμμές που περιέχουν μία από τις ακόλουθες λέξεις:
org
,kay
ήtuna
.$ grep -E "org|kay|tuna" /usr/share/hunspell/en_US.dic Borg/SM George/MS Tokay/M fortunate/UY ...
-
Τον αριθμό των γραμμών που ξεκινούν με ένα ή κανένα
c
ακολουθούμενο από τη συμβολοσειράati
.$ grep -cE "^c?ati" /usr/share/hunspell/en_US.dic 3
Απαντήσεις στις Ασκήσεις Εξερεύνησης
-
Βρείτε την regular expression που αντιστοιχεί με τις λέξεις στη γραμμή “Συμπερίληψη” και δεν ταιριάζει με αυτές της γραμμής “Εξαίρεση”:
-
Συμπερίληψη:
pot
,spot
,apot
Εξαίρεση:
potic
,spots
,potatoe
Απάντηση:
pot$
-
Συμπερίληψη:
arp99
,apple
,zipper
Εξαίρεση:
zoo
,arive
,attack
Απάντηση:
p+
-
Συμπερίληψη:
arcane
,capper
,zoology
Εξαίρεση:
air
,coper
,zoloc
Απάντηση:
arc|cap|zoo
-
Συμπερίληψη:
0th/pt
,3th/tc
,9th/pt
Εξαίρεση:
0/nm
,3/nm
,9/nm
Απάντηση:
[0-9]th.+
-
Συμπερίληψη:
Hawaii
,Dario
,Ramiro
Εξαίρεση:
hawaii
,Ian
,Alice
Απάντηση:
^[A-Z]a.*i+
-
-
Ποια άλλη χρήσιμη εντολή χρησιμοποιείται συνήθως για την αναζήτηση μέσα στα αρχεία; Τι επιπλέον λειτουργίες έχει;
Η εντολή
sed
. Η εντολή μπορεί να βρει και να αντικαταστήσει χαρακτήρες ή σύνολα χαρακτήρων μέσα σε ένα αρχείο. -
Αφού θυμηθείτε το προηγούμενο μάθημα, χρησιμοποιήστε ένα από τα παραδείγματα και προσπαθήστε να αναζητήσετε ένα συγκεκριμένο μοτίβο στην έξοδο της εντολής, με τη βοήθεια του
grep
.Πήρα μία από τις απαντήσεις από τις Ασκήσεις Εξερεύνησης και έψαξα τη γραμμή που έχει ανάγνωση, εγγραφή και εκτέλεση ως τα δικαιώματα της ομάδας. Η απάντησή σας μπορεί να είναι διαφορετική, ανάλογα με την εντολή που επιλέξατε και το μοτίβο που δημιουργήσατε.
$ cat contents.txt | tr -s " " | grep "^....rwx"
Αυτή η άσκηση είναι για να σας δείξει ότι το
grep
μπορεί επίσης να λάβει δεδομένα από διαφορετικές εντολές και μπορεί να βοηθήσει στο φιλτράρισμα των παραγόμενων πληροφοριών.