Πώς να χρησιμοποιήσετε την εντολή grep στο Linux

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

The Story Behind grep

Η εντολή grep είναι διάσημη στο Linux και Unix κύκλους για τρεις λόγους. Πρώτον, είναι εξαιρετικά χρήσιμο. Δεύτερον, το Ο πλούτος των επιλογών μπορεί να είναι συντριπτικός. Τρίτον, γράφτηκε εν μία νυκτί για να ικανοποιήσει μια συγκεκριμένη ανάγκη. Τα δύο πρώτα είναι δυναμικά. το τρίτο είναι ελαφρώς μακριά.

Κεν Τόμσον είχε εξαγάγει τις δυνατότητες αναζήτησης κανονικών εκφράσεων από το πρόγραμμα επεξεργασίας (προφέρεται ee-dee) και δημιούργησε ένα μικρό πρόγραμμα —για δική του χρήση— για αναζήτηση σε αρχεία κειμένου. Ο επικεφαλής του τμήματός του στο Bell Labs, Νταγκ Μακιλρόι, πλησίασε τον Thompson και περιέγραψε το πρόβλημα σε έναν από τους συναδέλφους του, Λι Μακ Μάχον, αντιμετώπιζε.

Ο McMahon προσπαθούσε να αναγνωρίσει τους συντάκτες του Φεντεραλιστικές εφημερίδες μέσω ανάλυσης κειμένου. Χρειαζόταν ένα εργαλείο που θα μπορούσε να αναζητήσει φράσεις και συμβολοσειρές μέσα σε αρχεία κειμένου. Ο Thompson αφιέρωσε περίπου μια ώρα εκείνο το βράδυ κάνοντας το εργαλείο του ένα γενικό εργαλείο που θα μπορούσε να χρησιμοποιηθεί από άλλους και το μετονόμασε σε grep. Πήρε το όνομα από τη συμβολοσειρά εντολών ed g/re/p, η οποία μεταφράζεται ως “καθολική αναζήτηση κανονικής έκφρασης”.

Μπορείτε να παρακολουθήσετε τον Thompson να μιλάει προς το Μπράιαν Κέρνιγκαν για τη γέννηση του grep.

Απλές αναζητήσεις με grep

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

Εμφανίζονται οι αντίστοιχες γραμμές. Σε αυτή την περίπτωση, είναι μια ενιαία γραμμή. Το κείμενο που ταιριάζει επισημαίνεται. Αυτό συμβαίνει επειδή στις περισσότερες διανομές το grep ονομάζεται:

alias grep='grep --colour=auto'

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

grep -i Average geek-1.log

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

Μπορούμε να εμφανίσουμε τις μη ταιριαστές γραμμές χρησιμοποιώντας την επιλογή -v (αντίστροφη αντιστοίχιση).

grep -v Mem geek-1.log

Δεν υπάρχει καμία επισήμανση γιατί αυτές είναι οι γραμμές που δεν ταιριάζουν.

  Πώς να εγκαταστήσετε το JetBrains RubyMine στο Linux

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

grep -q average geek-1.log
echo $?
grep -q wdzwdz geek-1.log
echo $?

Αναδρομικές αναζητήσεις με grep

Για αναζήτηση σε ένθετους καταλόγους και υποκαταλόγους, χρησιμοποιήστε την επιλογή -r (αναδρομική). Σημειώστε ότι δεν παρέχετε όνομα αρχείου στη γραμμή εντολών, πρέπει να δώσετε μια διαδρομή. Εδώ κάνουμε αναζήτηση στον τρέχοντα κατάλογο “.” και τυχόν υποκαταλόγους:

grep -r -i memfree .

Η έξοδος περιλαμβάνει τον κατάλογο και το όνομα αρχείου κάθε γραμμής που ταιριάζει.

Μπορούμε να κάνουμε το grep να ακολουθεί συμβολικούς συνδέσμους χρησιμοποιώντας την επιλογή -R (recursive dereference). Έχουμε έναν συμβολικό σύνδεσμο σε αυτόν τον κατάλογο, που ονομάζεται logs-folder. Δείχνει στο /home/dave/logs.

ls -l logs-folder

Ας επαναλάβουμε την τελευταία μας αναζήτηση με την επιλογή -R (recursive dereference):

grep -R -i memfree .

Ο συμβολικός σύνδεσμος ακολουθείται και ο κατάλογος στον οποίο οδηγεί αναζητείται επίσης από το grep.

Αναζήτηση ολόκληρων λέξεων

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

grep -i free geek-1.log

Τα αποτελέσματα είναι γραμμές που έχουν τη συμβολοσειρά “ελεύθερη” μέσα τους, αλλά δεν είναι ξεχωριστές λέξεις. Αποτελούν μέρος της συμβολοσειράς “MemFree”.

Για να αναγκάσετε το grep να ταιριάζει μόνο με ξεχωριστές «λέξεις», χρησιμοποιήστε την επιλογή -w (λέξη regexp).

grep -w -i free geek-1.log
echo $?

Αυτή τη φορά δεν υπάρχουν αποτελέσματα επειδή ο όρος αναζήτησης “δωρεάν” δεν εμφανίζεται στο αρχείο ως ξεχωριστή λέξη.

Χρήση πολλαπλών όρων αναζήτησης

Η επιλογή -E (extended regexp) σάς επιτρέπει να αναζητήσετε πολλές λέξεις. (Η επιλογή -E αντικαθιστά το καταργημένο egrep έκδοση του grep.)

Αυτή η εντολή αναζητά δύο όρους αναζήτησης, “μέσος όρος” και “memfree”.

grep -E -w -i "average|memfree" geek-1.log

grep -E -w -i

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

Έξοδος από grep -E -w -i

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

Η επιλογή -e (μοτίβα) σάς επιτρέπει να χρησιμοποιείτε πολλούς όρους αναζήτησης στη γραμμή εντολών. Χρησιμοποιούμε τη δυνατότητα αγκύλης κανονικής έκφρασης για να δημιουργήσουμε ένα μοτίβο αναζήτησης. Λέει στο grep να ταιριάζει με οποιονδήποτε από τους χαρακτήρες που περιέχονται στις αγκύλες “[].» Αυτό σημαίνει ότι το grep θα ταιριάζει είτε με “kB” ή “KB” καθώς αναζητά.

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

Ακριβώς αντιστοίχιση γραμμών

Το -x (γραμμή regexp) θα ταιριάζει μόνο με γραμμές όπου ολόκληρη η γραμμή ταιριάζει με τον όρο αναζήτησης. Ας αναζητήσουμε μια σφραγίδα ημερομηνίας και ώρας που γνωρίζουμε ότι εμφανίζεται μόνο μία φορά στο αρχείο καταγραφής:

grep -x "20-Jan--06 15:24:35" geek-1.log

grep -χ

Βρίσκεται και εμφανίζεται η μεμονωμένη γραμμή που ταιριάζει.

  Πώς να μετατρέψετε ιστότοπους σε εφαρμογές Linux με τον κατάλογο Ιστού

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

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

sudo grep -v "https://www.wdzwdz.com/496056/how-to-use-the-grep-command-on-linux/#" /etc/sudoers

sudo grep -v

Αυτό είναι πολύ πιο εύκολο να αναλυθεί.

Εμφάνιση μόνο αντιστοίχισης κειμένου

Μπορεί να υπάρξει περίπτωση που δεν θέλετε να δείτε ολόκληρη τη γραμμή που ταιριάζει, μόνο το αντίστοιχο κείμενο. Η επιλογή -o (μόνο ταίριασμα) κάνει ακριβώς αυτό.

grep -o MemFree geek-1.log

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

Μετρώντας με grep

Το grep δεν είναι μόνο κείμενο, μπορεί να παρέχει και αριθμητικές πληροφορίες. Μπορούμε να κάνουμε το grep να μετράει για εμάς με διάφορους τρόπους. Αν θέλουμε να μάθουμε πόσες φορές εμφανίζεται ένας όρος αναζήτησης σε ένα αρχείο, μπορούμε να χρησιμοποιήσουμε την επιλογή -c (count).

grep -c average geek-1.log

Το grep αναφέρει ότι ο όρος αναζήτησης εμφανίζεται 240 φορές σε αυτό το αρχείο.

Μπορείτε να κάνετε το grep να εμφανίζει τον αριθμό γραμμής για κάθε γραμμή που ταιριάζει χρησιμοποιώντας την επιλογή -n (αριθμός γραμμής).

grep -n Jan geek-1.log

Ο αριθμός γραμμής για κάθε αντίστοιχη γραμμή εμφανίζεται στην αρχή της γραμμής.

Για να μειώσετε τον αριθμό των αποτελεσμάτων που εμφανίζονται, χρησιμοποιήστε την επιλογή -m (max count). Θα περιορίσουμε την έξοδο σε πέντε αντίστοιχες γραμμές:

grep -m5 -n Jan geek-1.log

Προσθήκη περιβάλλοντος

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

Για να εμφανίσετε μερικές γραμμές μετά την αντίστοιχη γραμμή, χρησιμοποιήστε την επιλογή -A (μετά το πλαίσιο). Ζητάμε τρεις γραμμές σε αυτό το παράδειγμα:

grep -A 3 -x "20-Jan-06 15:24:35" geek-1.log

grep -A 3 -x

Για να δείτε μερικές γραμμές πριν από την αντίστοιχη γραμμή, χρησιμοποιήστε την επιλογή -B (πλαίσιο πριν).

grep -B 3 -x "20-Jan-06 15:24:35" geek-1.log

grep -B 3 -x

Και για να συμπεριλάβετε γραμμές από πριν και μετά την αντίστοιχη γραμμή χρησιμοποιήστε την επιλογή -C (context).

grep -C 3 -x "20-Jan-06 15:24:35" geek-1.log

grep -C 3 -x

Εμφάνιση αρχείων που ταιριάζουν

Για να δείτε τα ονόματα των αρχείων που περιέχουν τον όρο αναζήτησης, χρησιμοποιήστε την επιλογή -l (αρχεία με αντιστοίχιση). Για να μάθετε ποια αρχεία πηγαίου κώδικα C περιέχουν αναφορές στο αρχείο κεφαλίδας sl.h, χρησιμοποιήστε αυτήν την εντολή:

grep -l "sl.h" *.c

grep -l

Τα ονόματα των αρχείων παρατίθενται, όχι οι αντίστοιχες γραμμές.

  Λάβετε υγιεινές υπενθυμίσεις στην επιφάνεια εργασίας Linux χρησιμοποιώντας το Stretchly

Έξοδος από grep -l

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

grep -L "sl.h" *.c

grep -L

Έναρξη και Τέλος Γραμμών

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

grep "^ " geek-1.log

grep

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

Έξοδος grep

Για να ταιριάζει με το τέλος της γραμμής, χρησιμοποιήστε τον τελεστή τυπικής έκφρασης “$”. Θα αναζητήσουμε γραμμές που τελειώνουν με “00”.

grep "00$" geek-1.log

grep

Στην οθόνη εμφανίζονται οι γραμμές που έχουν ως τελικούς χαρακτήρες το “00”.

έξοδος του grep

Χρήση σωλήνων με grep

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

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

grep "ExtractParameters" *.c | less

grep

Η έξοδος παρουσιάζεται σε λιγότερα.

Έξοδος από grep

Αυτό σας επιτρέπει να σελιδοποιήσετε τη λίστα αρχείων και να χρησιμοποιήσετε τη δυνατότητα αναζήτησης του less.

Αν διοχετεύσουμε την έξοδο από το grep στο wc και χρησιμοποιήσουμε την επιλογή -l (γραμμές), τότε μπορεί να μετρήσει τον αριθμό των γραμμών στα αρχεία πηγαίου κώδικα που περιέχουν “ExtractParameters”. (Θα μπορούσαμε να το πετύχουμε αυτό χρησιμοποιώντας την επιλογή grep -c (count), αλλά αυτός είναι ένας τακτοποιημένος τρόπος για να δείξουμε τη διοχέτευση εκτός grep.)

grep "ExtractParameters" *.c | wc -l

grep

Με την επόμενη εντολή, σωληνώνουμε την έξοδο από ls σε grep και σωληνώνουμε την έξοδο από grep σε ταξινόμηση . Παραθέτουμε τα αρχεία στον τρέχοντα κατάλογο, επιλέγοντας εκείνα με τη συμβολοσειρά “Aug” σε αυτά, και ταξινομήστε τα κατά μέγεθος αρχείου:

ls -l | grep "Aug" | sort +4n

ls -l |  grep

Ας το αναλύσουμε:

ls -l: Εκτελέστε μια λίστα μακράς μορφής των αρχείων χρησιμοποιώντας ls.
grep “Aug”: Επιλέξτε τις γραμμές από τη λίστα ls που έχουν το “Aug”. Σημειώστε ότι αυτό θα βρει επίσης αρχεία που έχουν “Aug” στα ονόματά τους.
sort +4n: Ταξινόμηση της εξόδου από το grep στην τέταρτη στήλη (μέγεθος αρχείου).

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

grep: Λιγότερη εντολή, περισσότερο σύμμαχος

Το grep είναι ένα καταπληκτικό εργαλείο που πρέπει να έχετε στη διάθεσή σας. Χρονολογείται από το 1974 και εξακολουθεί να είναι ισχυρό γιατί χρειαζόμαστε αυτό που κάνει και τίποτα δεν το κάνει καλύτερα.

Η σύζευξη του grep με μερικές κανονικές εκφράσεις-fu το πηγαίνει πραγματικά στο επόμενο επίπεδο.