Η σωστή χρήση των εντολών Find και Grep στο Linux

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

Χρησιμοποιώντας εντολές Find και Grep στο Linux.

ΒΡΕΙΤΕ

Η εντολή εντοπισμού Linux είναι ένα βοηθητικό πρόγραμμα γραμμής εντολών για τη μετακίνηση της ιεραρχίας αρχείων. Μπορεί να χρησιμοποιηθεί για την αναζήτηση αρχείων και καταλόγων και για την πραγματοποίηση επακόλουθων λειτουργιών μαζί τους. Υποστηρίζει την αναζήτηση ανά αρχείο, φάκελο, όνομα, ημερομηνία δημιουργίας, ημερομηνία αλλαγής, ιδιοκτήτη και δικαιώματα. Χρησιμοποιώντας -exec, άλλες εντολές UNIX μπορούν να εκτελεστούν για τα αρχεία ή τους φακέλους που βρέθηκαν. Σύνταξη:

$ find [από πού να ξεκινήσει η αναζήτηση] [έκφραση καθορίζει τι να βρει] [-ποθέσεις] [τι να βρεθεί]

Επιλογές:

  • -exec - το απαιτούμενο αρχείο που πληροί τα παραπάνω κριτήρια και επιστρέφει 0 ως κατάσταση εξόδου για την επιτυχή εκτέλεση εντολών.
  • -ok - λειτουργεί το ίδιο με το -exec, με την εξαίρεση ότι ο χρήστης θα σας ζητηθεί πρώτα.
  • -inum N - αναζήτηση με τον αριθμό "N";
  • -links N - αναζήτηση με συνδέσμους "N";
  • - επίδειξη ονόματος - αναζήτηση για αρχεία που ορίζονται στο "demo".
  • -newer αρχείο - αναζήτηση αρχείων που έχουν τροποποιηθεί / δημιουργηθεί μετά από "αρχείο".
  • -perm octal - αναζήτηση εάν η ανάλυση είναι οκταδικός.
  • -print - εμφάνιση της διαδρομής στα έγγραφα που βρέθηκαν χρησιμοποιώντας τα άλλα κριτήρια.
  • -empty - αναζήτηση κενών εγγράφων και καταλόγων.
  • -size + N / -Ν - μπλοκ αναζήτησης "N"; "N" και "c" μπορούν να χρησιμοποιηθούν για τη μέτρηση του μεγέθους με χαρακτήρες. "+ N" σημαίνει μεγαλύτερο μέγεθος μπλοκ "N" και "-N" σημαίνει μικρότερο μέγεθος μπλοκ "N".
  • -νομα χρήστη - αναζήτηση εγγράφων που ανήκουν στο όνομα χρήστη ή στο όνομα "όνομα".
  • \ (expr \) - True αν το "expr" είναι αληθές. Χρησιμοποιείται για την ομαδοποίηση κριτηρίων σε συνδυασμό με OR ή AND.

Grep

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

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

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

[ΕΠΙΛΟΓΕΣ] ΠΙΝΑΚΑΣ [ΑΡΧΕΙΟ ...]

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

  • ΕΠΙΛΟΓΕΣ - μηδέν ή περισσότερες επιλογές. Η ομάδα παρέχει διάφορες επιλογές που ελέγχουν τη συμπεριφορά της.
  • PATTERN - Πρότυπο αναζήτησης.
  • FILE - μηδέν ή περισσότερα ονόματα αρχείων εισόδου.

Πώς να εισαγάγετε μια εντολή για την αναζήτηση αρχείων

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

$ grep bash / etc / passwd

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

root 0: 0: root: / root: / bin / bash

domain1000: 1000: domain: / home / domain: / bin / bash

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

$ "Διαχειριστής προβολής Gnome" / etc / passwd

Επαναφορά αγώνα (πρώην)

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

$ -v nologin / etc / passwd

Έξοδος:

root 0: 0: root: / root: / bin / bash

colour 124: 124 :: / var / lib / colord: / bin / false

git 994: 994: χρήστης daemon git: /: / usr / bin / git-shell

linuxize 1000: 1000: linuxize: / home / linuxize: / bin / bash

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

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

$ ps -ef | www-δεδομένα

Έξοδος:

www-στοιχεία 18247 12675 4 16:00; 00:00:00 php-fpm: πισίνα www

ρίζα 18272 17714 0 16:00 pts / 0 00:00:00 -color = auto-exclude-dir = .bzr -exclude-dir = CVS -exclude-dir = .git -exclude-dir = .hg -exclude-dir = .svn www-δεδομένα

www-δεδομένα 31147 12770 0 Οκτώβριος 22; 00:05:51 nginx: διαδικασία εργασίας

www-δεδομένα 31148 12770 0 Οκτώβριος 22; 00:00:00 nginx: διαδικασία διαχειριστή cache

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

$ ps -ef | www-δεδομένα | grep -v grep

Έξοδος:

www-στοιχεία 18247 12675 4 16:00; 00:00:00 php-fpm: πισίνα www

ρίζα 18272 17714 0 16:00 pts / 0 00:00:00 -color = auto-exclude-dir = .bzr -exclude-dir = CVS -exclude-dir = .git -exclude-dir = .hg -exclude-dir = .svn www-δεδομένα

www-δεδομένα 31147 12770 0 Οκτώβριος 22; 00:05:51 nginx: διαδικασία εργασίας

www-δεδομένα 31148 12770 0 Οκτώβριος 22; 00:00:00 nginx: διαδικασία διαχειριστή cache

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

Για να αναζητήσετε αναδρομικά ένα μοτίβο, εισαγάγετε την επιλογή -r (ή -recursive). Αυτό θα σας επιτρέψει να κάνετε αναζήτηση σε όλα τα αρχεία στον καθορισμένο κατάλογο, παρακάμπτοντας συμβολικούς συνδέσμους που συμβαίνουν αναδρομικά. Για να περάσετε από όλους τους συμβολικούς συνδέσμους, χρησιμοποιήστε την επιλογή -r (ή -κατάληξη -αναδρομικό). Στο παρακάτω παράδειγμα, αναζητούμε domain.com σε όλα τα αρχεία μέσα στον κατάλογο / etc:

$ -r domain.com / etc

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

/etc/hosts:127.0.0.1 node2.domain.com /etc/nginx/sites-available/domain.com: domain_name domain.com www.domain.com;

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

$ -R domain.com / κτλ

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

Έξοδος:

/etc/hosts:127.0.0.1 node2.domain.com

/etc/nginx/sites-available/domain.com: όνομα_διακομιστή domain.com www.domain.com;

/etc/nginx/sites-enabled/domain.com: όνομα_διακομιστή domain.com www.domain.com;

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

Για να καταργήσετε την προεπιλεγμένη έξοδο και να εκτυπώσετε μόνο τα ονόματα των αρχείων που περιέχουν το αντιστοιχισμένο μοτίβο, μπορείτε να εισαγάγετε την επιλογή -l (ή -files-with-matches). Για παράδειγμα, για να αναζητήσετε όλα τα αρχεία που τελειώνουν στο .conf στον τρέχοντα κατάλογο εργασίας και για να εκτυπώσετε μόνο ονόματα αρχείων που περιέχουν τον τομέα domain.com, πληκτρολογήστε:

$ -L domain.com * .conf

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

tmux.conf

haproxy.conf

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

$ -Rl domain.com / tmp

Ανυπαρξία περιπτώσεων

Από προεπιλογή, στην εντολή γίνεται διάκριση πεζών-κεφαλαίων, πράγμα που σημαίνει ότι οι κεφαλαίοι και οι πεζά χαρακτήρες αντιμετωπίζονται διαφορετικά. Για να αγνοήσετε την περίπτωση κατά την αναζήτηση, εισαγάγετε την επιλογή -i (ή -για περίπτωση εγγραφής). Για παράδειγμα, αν κάνετε αναζήτηση για Zebra χωρίς καμία επιλογή, η ακόλουθη εντολή δεν θα εμφανίσει καμία έξοδο, δηλ. υπάρχουν αντιστοίχιση.

$ Zebra / usr / share / words

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

$ grep -i Zebra / usr / share / λέξεις

Η ένδειξη "Zebra" θα αντιστοιχεί σε "Zebra", "ZEbrA" ή σε οποιοδήποτε άλλο συνδυασμό κεφαλαίων και πεζών γραμμάτων.

Έξοδος:

ζέβρα

το ζέβρα

ζέβρες

Ακριβής αντιστοίχιση

Κατά την αναζήτηση, το gnu θα εκτυπώσει επίσης το gnu, στο οποίο εισάγονται μεγαλύτερες λέξεις, όπως cygnus ή magnum.

$ gnu / usr / share / λέξεις

Έξοδος:

cygnus

gnu

interregnum

lgnu9d

lignum

magnum

magnuson

σφάγνου

wingnut

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

ΣΗΜΑΝΤΙΚΟ. Οι χαρακτήρες της λέξης περιλαμβάνουν αλφαριθμητικούς χαρακτήρες (az, AZ και 0-9) και υπογράμμισης (_). Όλοι οι άλλοι χαρακτήρες αντιμετωπίζονται ως μη λεκτικοί χαρακτήρες.

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

$ grep -w gnu / usr / share / λέξεις

Έξοδος: gnu

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

Για να εμφανίσετε τον αριθμό των γραμμών που περιέχουν ένα πρότυπο, χρησιμοποιήστε την παράμετρο -n (ή -γραμμή-αριθμός). Με τη χρήση αυτής της επιλογής θα εκτυπωθούν οι αντιστοιχίσεις στην τυπική έξοδο με το πρόθεμα του αριθμού στον οποίο βρέθηκε. Για παράδειγμα, για να εμφανίσετε από το αρχείο / etc / services που περιέχει το πρόθεμα bash με τον αντίστοιχο αριθμό, μπορείτε να χρησιμοποιήσετε την ακόλουθη εντολή:

$ grep -n 10000 / etc / services

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

Έξοδος:

10423: ndmp 10.000 / tcp

10424: ndmp 10000 / udp

Μετρώντας

Για να εκτυπώσετε τον αριθμό των γραμμών που ταιριάζουν με την τυπική έξοδο, χρησιμοποιήστε την παράμετρο -c (ή -count). Στο παρακάτω παράδειγμα, υπολογίζουμε τον αριθμό των λογαριασμών που έχουν το shell / usr / bin / zsh.

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

Έξοδος: 4

Αρκετές γραμμές (μοτίβα)

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

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

Αν χρησιμοποιείτε την εκτεταμένη επιλογή κανονικής έκφρασης -E (ή -extended-regexp), η δήλωση δεν πρέπει να ξεφύγει, όπως φαίνεται παρακάτω:

$ grep -E 'θανατηφόρος | σφάλμα | κρίσιμο' /var/log/nginx/error.log

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

Το GNU Grep έχει δύο ομάδες λειτουργιών κανονικής έκφρασης - Basic και Extended. Από προεπιλογή, η συνάρτηση ερμηνεύει το πρότυπο ως βασική κανονική έκφραση, για να μεταβείτε σε εκτεταμένες κανονικές εκφράσεις, πρέπει να χρησιμοποιήσετε την επιλογή -E. Όταν χρησιμοποιείτε κανονικές εκφράσεις στην κύρια λειτουργία, όλοι οι άλλοι χαρακτήρες, εκτός από τα metacharacters, είναι στην πραγματικότητα κανονικές εκφράσεις που αντιστοιχούν μεταξύ τους. Παρακάτω είναι μια λίστα με τα πιο συνηθισμένα metacharacters:

  • Χρησιμοποιήστε το χαρακτήρα ^ (τον χαρακτήρα κηλίδας) για να ταιριάζει με την έκφραση στην αρχή μιας γραμμής. Στο ακόλουθο παράδειγμα, το ^ kangaroo θα ταιριάζει μόνο αν εμφανίζεται στην αρχή: $ grep "^ kangaroo" file.txt
  • Χρησιμοποιήστε το σύμβολο $ (δολάριο) για να ταιριάξετε με την έκφραση στο τέλος. Στο παρακάτω παράδειγμα, το καγκουρό $ θα ταιριάζει μόνο αν συναντάται στο τέλος: grep "kangaroo $" file.txt
  • Χρησιμοποιήστε το σύμβολο. (τελεία) για να ταιριάζει με κάθε ένα χαρακτήρα. Για παράδειγμα, για να ταιριάζει όλα όσα αρχίζουν με kan δύο χαρακτήρων και τελειώνουν με roo, μπορείτε να χρησιμοποιήσετε το παρακάτω πρότυπο: $ grep "kan..roo" file.txt
  • Χρησιμοποιήστε το [] (παρενθέσεις) για να ταιριάζει με κάθε χαρακτήρα που περικλείεται σε αγκύλες. Για παράδειγμα, βρείτε αυτά που περιέχουν αποδοχή ή "προφορά, μπορείτε να χρησιμοποιήσετε το παρακάτω πρότυπο: $ grep" acce [np] t "file.txt

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

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

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

  • Ταιριάξτε και εξαγάγετε όλες τις διευθύνσεις ηλεκτρονικού ταχυδρομείου από αυτό το αρχείο: $ grep -E -o "\ b [A-Za-z0-9 ._% + -] [A-Za-z0-9. \ [A-Za-z] {2.6} \ b "αρχείο.txt
  • Χάρτης και εξαγωγή όλων των έγκυρων διευθύνσεων IP από αυτό το αρχείο: $ grep -E -o '(25 [0-5] | 2 [0-4] [0-9] | [01]; [0-9] [0 [0-9] β) (25 [0-5]] 2 [0-4] [0-9] | [01] 5] 2 [0-4] [0-9] | [01] β [0-9] [0-9] β) (25 [0-5] 9] | [01]? [0-9] [0-9]?) 'File.txt

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

Εκτυπώστε πριν μετρήσετε

Για να εκτυπώσετε έναν συγκεκριμένο αριθμό γραμμών πριν από την αντιστοίχιση, χρησιμοποιήστε την παράμετρο -B (ή -προηγούμενη). Για παράδειγμα, για να εμφανίσετε 5 γραμμές αρχικού πλαισίου πριν από την αντιστοίχιση, μπορείτε να χρησιμοποιήσετε την ακόλουθη εντολή: $ grep -A 5 root / etc / passwd

Εκτύπωση μετά την αναζήτηση

Για να εκτυπώσετε έναν συγκεκριμένο αριθμό γραμμών μετά από μια αντιστοίχιση, χρησιμοποιήστε την παράμετρο -A (ή -από-πλαίσιο). Για παράδειγμα, για να εμφανίσετε 5 γραμμές του τελικού πλαισίου μετά την αντιστοίχιση των συμβολοσειρών, μπορείτε να χρησιμοποιήσετε την ακόλουθη εντολή: $ grep -B 5 root / etc / passwd

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