Android

Grep εντολή στο linux (εύρεση κειμένου σε αρχεία)

Words at War: The Veteran Comes Back / One Man Air Force / Journey Through Chaos

Words at War: The Veteran Comes Back / One Man Air Force / Journey Through Chaos

Πίνακας περιεχομένων:

Anonim

Η εντολή grep που αντιπροσωπεύει την "παγκόσμια κανονική εκτύπωση" είναι μία από τις πιο ισχυρές και συχνά χρησιμοποιούμενες εντολές στο Linux.

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

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

Σύνταξη εντολών Grep

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

Οι εκφράσεις χρηστών grep έχουν την ακόλουθη μορφή:

grep PATTERN

Τα στοιχεία σε αγκύλες είναι προαιρετικά.

  • OPTIONS - Μηδενικές ή περισσότερες επιλογές. Το Grep παρέχει διάφορες επιλογές που ελέγχουν τη συμπεριφορά του. PATTERN - PATTERN αναζήτησης. FILE - Μηδέν ή περισσότερα ονόματα αρχείων εισόδου.

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

Πώς να χρησιμοποιήσετε grep για να αναζητήσετε ένα string σε αρχεία

Η πιο βασική χρήση της εντολής grep είναι η αναζήτηση μιας συμβολοσειράς (κειμένου) σε ένα αρχείο.

Για παράδειγμα, για να εμφανίσετε τις γραμμές από το αρχείο /etc/passwd που περιέχει το bash string, μπορείτε να χρησιμοποιήσετε την ακόλουθη εντολή:

grep bash /etc/passwd

Η έξοδος θα πρέπει να φαίνεται κάπως έτσι:

root:x:0:0:root:/root:/bin/bash linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

Εάν η συμβολοσειρά περιλαμβάνει κενά, θα πρέπει να την επισυνάψετε σε μοναδικά ή διπλά εισαγωγικά:

grep "Gnome Display Manager" /etc/passwd

Επαναφορά αντιστοίχισης (Εξαίρεση)

Για να εμφανίσετε τις γραμμές που δεν ταιριάζουν με ένα μοτίβο, χρησιμοποιήστε την επιλογή -v --invert-match ).

Για παράδειγμα, για να εμφανίσετε τις γραμμές από το αρχείο /etc/passwd που δεν περιέχουν το string nologin μπορείτε να χρησιμοποιήσετε την ακόλουθη εντολή:

grep -v nologin /etc/passwd

root:x:0:0:root:/root:/bin/bash colord:x:124:124::/var/lib/colord:/bin/false git:x:994:994:git daemon user:/:/usr/bin/git-shell linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

Πώς να χρησιμοποιήσετε το Grep για να αναζητήσετε μια συμβολοσειρά στην έξοδο εντολών

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

Για παράδειγμα, για να διαπιστώσετε ποιες διεργασίες εκτελούνται στο σύστημά σας ως δεδομένα χρήστη www-data μπορείτε να χρησιμοποιήσετε την ακόλουθη εντολή ps :

ps -ef | grep www-data

www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www root 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process

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

ps -ef | grep www-data | grep -v grep

www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www root 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process

Αναδρομική αναζήτηση

Για να αναζητήσετε αναδρομικά ένα πρότυπο χρησιμοποιήστε το, χρησιμοποιήστε την επιλογή -r --recursive ). Αυτό θα πραγματοποιήσει αναζήτηση σε όλα τα αρχεία στον καθορισμένο κατάλογο, παρακάμπτοντας τους συμβολικούς συμβόλλους που συναντώνται αναδρομικά. Για να ακολουθήσετε όλους τους συμβολικούς δεσμούς, χρησιμοποιήστε την επιλογή -R --dereference-recursive ).

Στο ακόλουθο παράδειγμα ψάχνουμε για το string linuxize.com σε όλα τα αρχεία μέσα στον κατάλογο /etc :

grep -r linuxize.com /etc

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

/etc/hosts:127.0.0.1 node2.linuxize.com /etc/nginx/sites-available/linuxize.com: server_name linuxize.com www.linuxize.com;

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

grep -R linuxize.com /etc

Παρατηρήστε την τελευταία γραμμή της εξόδου. Αυτή η γραμμή δεν εκτυπώνεται στο παραπάνω παράδειγμα, επειδή τα αρχεία μέσα στον κατάλογο με sites-enabled Nginx είναι σύμβολα στα αρχεία ρυθμίσεων εντός του sites-available καταλόγου sites-available .

/etc/hosts:127.0.0.1 node2.linuxize.com /etc/nginx/sites-available/linuxize.com: server_name linuxize.com www.linuxize.com; /etc/nginx/sites-enabled/linuxize.com: server_name linuxize.com www.linuxize.com;

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

Για να καταργήσετε την προεπιλεγμένη έξοδο grep και να εκτυπώσετε μόνο τα ονόματα των αρχείων που περιέχουν το αντιστοιχισμένο μοτίβο, μπορείτε να χρησιμοποιήσετε την επιλογή -l --files-with-matches ).

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

grep -l linuxize.com *.conf

Η έξοδος θα φαίνεται κάπως έτσι:

tmux.conf haproxy.conf

Η επιλογή -l χρησιμοποιείται συνήθως σε συνδυασμό με την αναδρομική επιλογή -R :

grep -Rl linuxize.com /tmp

Ανίχνευση ανίχνευσης περιπτώσεων

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

Για να αγνοήσετε την περίπτωση κατά την αναζήτηση, χρησιμοποιήστε την επιλογή -i --ignore-case ).

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

grep Zebra /usr/share/words

Αν όμως εκτελείτε μια αναζήτηση χωρίς ευαισθησία σε περίπτωση που χρησιμοποιεί την επιλογή -i , θα ταιριάζει τόσο με κεφαλαία όσο και με κεφαλαία γράμματα:

grep -i Zebra /usr/share/words

Ο ορισμός του "Zebra" θα ταιριάζει με το "zebra", το "ZEbrA" ή οποιονδήποτε άλλο συνδυασμό κεφαλαίων και πεζών γραμμάτων για αυτήν τη συμβολοσειρά.

zebra zebra's zebras

Αναζήτηση πλήρων λέξεων

Όταν ψάχνετε για "gnu", το grep θα τυπώσει επίσης τις γραμμές όπου το gnu είναι ενσωματωμένο σε μεγαλύτερες λέξεις, όπως "cygnus" ή "magnum".

grep gnu /usr/share/words

cygnus gnu interregnum lgnu9d lignum magnum magnuson sphagnum wingnut

Για να επιστρέψετε μόνο εκείνες τις γραμμές όπου η καθορισμένη συμβολοσειρά είναι μια ολόκληρη λέξη (που περικλείεται από χαρακτήρες που δεν είναι λέξεις), χρησιμοποιήστε την επιλογή -w --word-regexp ).

Οι χαρακτήρες Word περιλαμβάνουν αλφαριθμητικούς χαρακτήρες ( az , AZ και 0-9 ) και υπογράμμισης ( _ ). Όλοι οι άλλοι χαρακτήρες θεωρούνται χαρακτήρες που δεν είναι λέξεις.

grep -w gnu /usr/share/words

gnu

Εμφάνιση γραμμών αριθμών

Για να εμφανίσετε τον αριθμό των γραμμών που περιέχουν μια συμβολοσειρά που ταιριάζει με ένα μοτίβο, χρησιμοποιήστε την επιλογή -n (ή - --line-number ). Όταν χρησιμοποιείτε αυτήν την επιλογή, το grep θα εκτυπώσει τις αντιστοιχίσεις στην πρότυπη έξοδο με πρόθεμα τον αριθμό γραμμής στον οποίο βρέθηκε.

Για παράδειγμα, για να εμφανίσετε τις γραμμές από το αρχείο /etc/services που περιέχει το string bash με τον αριθμό γραμμής που ταιριάζει, μπορείτε να χρησιμοποιήσετε την ακόλουθη εντολή:

grep -n 10000 /etc/services

Η παρακάτω έξοδος δείχνει ότι οι αντιστοιχίες βρίσκονται στις γραμμές 10423 και 10424.

10423:ndmp 10000/tcp 10424:ndmp 10000/udp

Μετρητές αρίθμησης

Για να εκτυπώσετε μια μέτρηση των αντίστοιχων γραμμών στην τυπική έξοδο, χρησιμοποιήστε την επιλογή -c --count ).

Στο παρακάτω παράδειγμα, μετράμε τον αριθμό των λογαριασμών που έχουν /usr/bin/zsh ως κέλυφος.

grep -c '/usr/bin/zsh' /etc/passwd

4

Αναζήτηση πολλαπλών χορδών (μοτίβα)

Δύο ή περισσότερα μοτίβα αναζήτησης μπορούν να ενωθούν χρησιμοποιώντας τον τελεστή OR. | .

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

Στο παρακάτω παράδειγμα ψάχνουμε όλες τις εμφανίσεις των φαινομένων fatal , error και critical στο αρχείο καταγραφής Nginx:

grep 'fatal\|error\|critical' /var/log/nginx/error.log

grep -E 'fatal|error|critical' /var/log/nginx/error.log

Ήσυχη λειτουργία

Το -q --quiet ) λέει στο grep να μη γράψει τίποτα στο τερματικό (τυπική έξοδος). Εάν εντοπιστεί μια αντιστοίχιση, η εντολή θα τερματίσει με την κατάσταση 0 . Αυτό είναι χρήσιμο όταν χρησιμοποιείτε grep σε κέλυφος όπου θέλετε να ελέγξετε εάν ένα αρχείο περιέχει μια συμβολοσειρά και εκτελέστε μια συγκεκριμένη ενέργεια ανάλογα με το αποτέλεσμα.

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

if grep -q PATTERN filename then echo pattern found else echo pattern not found fi

Βασική κανονική έκφραση

Το GNU Grep έχει δύο σύνολα χαρακτηριστικών κανονικής έκφρασης, Basic και Extended. Από προεπιλογή, ο grep ερμηνεύει το πρότυπο ως βασική κανονική έκφραση.

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

  • Χρησιμοποιήστε το σύμβολο ^ (caret) για να ταιριάξετε την έκφραση στην αρχή μιας γραμμής. Στο ακόλουθο παράδειγμα, το string ^kangaroo θα ταιριάζει μόνο αν εμφανίζεται στην αρχή μιας γραμμής.

    grep "^kangaroo" file.txt

    Χρησιμοποιήστε το σύμβολο $ (δολάριο) για να ταιριάξετε την έκφραση στο τέλος μιας γραμμής. Στο ακόλουθο παράδειγμα, το string kangaroo$ θα ταιριάζει μόνο αν εμφανίζεται στο άκρο μιας γραμμής.

    grep "kangaroo$" file.txt

    Χρησιμοποιήστε το . (περίοδο) σύμβολο για να ταιριάζει με κάθε ένα χαρακτήρα. Για παράδειγμα, για να ταιριάξετε οτιδήποτε ξεκινά με το kan τότε έχει δύο χαρακτήρες και τελειώνει με το string roo , θα μπορούσατε να χρησιμοποιήσετε το ακόλουθο μοτίβο:

    grep "kan..roo" file.txt

    Χρήση (αγκύλες) για να ταιριάζει με κάθε χαρακτήρα που περικλείεται στις αγκύλες. Για παράδειγμα, βρείτε τις γραμμές που περιέχουν accept ή " accent , θα μπορούσατε να χρησιμοποιήσετε το ακόλουθο μοτίβο:

    grep "accet" file.txt

    Χρήση (αγκύλες) για να ταιριάζει με κάθε χαρακτήρα που περικλείεται στις αγκύλες. Το ακόλουθο μοτίβο θα ταιριάζει με οποιοδήποτε συνδυασμό συμβολοσειρών που περιέχει co(any_letter_except_l)a , όπως coca , cobalt κ.ο.κ., αλλά δεν θα ταιριάζει με τις γραμμές που περιέχουν cola , grep "coa" file.txt

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

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

Για να ερμηνεύσετε το πρότυπο ως μια εκτεταμένη κανονική έκφραση, χρησιμοποιήστε την επιλογή -E --extended-regexp ). Οι εκτεταμένες κανονικές εκφράσεις περιλαμβάνουν όλους τους βασικούς μετα-χαρακτήρες, μαζί με πρόσθετους μετα-χαρακτήρες για να δημιουργήσετε πιο σύνθετα και ισχυρά μοτίβα αναζήτησης. Ακολουθούν μερικά παραδείγματα:

  • Ταίριασμα και εξαγωγή όλων των διευθύνσεων ηλεκτρονικού ταχυδρομείου από ένα δεδομένο αρχείο:

    grep -E -o "\b+@+\.{2, 6}\b" file.txt

    Ταίριασμα και εξαγωγή όλων των έγκυρων διευθύνσεων IP από ένα δεδομένο αρχείο:

    grep -E -o '(25|2|??)\.(25|2|??)\.(25|2|??)\.(25|2|??)' file.txt

Η επιλογή -o χρησιμοποιείται για την εκτύπωση μόνο της αντίστοιχης συμβολοσειράς.

Γραμμές εκτύπωσης πριν από έναν αγώνα

Για να εκτυπώσετε έναν συγκεκριμένο αριθμό γραμμών πριν από την αντιστοίχιση των γραμμών, χρησιμοποιήστε την επιλογή -B (ή - --before-context ).

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

grep -B 5 root /etc/passwd

Γραμμές εκτύπωσης μετά από έναν αγώνα

Για να εκτυπώσετε έναν συγκεκριμένο αριθμό γραμμών μετά την αντιστοίχιση γραμμών, χρησιμοποιήστε την επιλογή -A --after-context ).

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

grep -A 5 root /etc/passwd

συμπέρασμα

Η εντολή grep σας επιτρέπει να αναζητήσετε ένα μοτίβο μέσα στα αρχεία. Αν ένας αγώνας αν βρεθεί, grep θα εκτυπώσει τις γραμμές που περιέχουν το καθορισμένο μοτίβο.

Υπάρχουν πολλά περισσότερα για να μάθετε σχετικά με τη σελίδα του Grep Grep User Manual.

grep terminal