Ποια είναι η διαφορά μεταξύ Grep, Egrep και Fgrep στο Linux;


Ένα από τα διάσημα εργαλεία αναζήτησης σε συστήματα παρόμοια με το Unix που μπορεί να χρησιμοποιηθεί για την αναζήτηση οτιδήποτε είτε πρόκειται για αρχείο είτε για γραμμή ή πολλές γραμμές σε αρχείο είναι το βοηθητικό πρόγραμμα grep. Είναι πολύ μεγάλη σε λειτουργικότητα που μπορεί να αποδοθεί στον μεγάλο αριθμό επιλογών που υποστηρίζει, όπως: αναζήτηση χρησιμοποιώντας μοτίβο συμβολοσειράς ή μοτίβο reg-ex ή reg-ex με βάση την perl κ.λπ.

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

Το κύριο πράγμα που μένει να διερευνηθεί είναι ποιες είναι οι διαφορές μεταξύ των τριών κύριων παραλλαγών, δηλαδή 'grep', 'egrep' και 'fgrep' του grep που κάνει τους χρήστες Linux να επιλέγουν τη μία ή την άλλη έκδοση σύμφωνα με την απαίτηση.

Μερικοί Ειδικοί Μετα-Χαρακτήρες του grep

  1. + – Ισοδυναμεί με μία ή περισσότερες εμφανίσεις προηγούμενου χαρακτήρα.
  2. ? – Αυτό υποδηλώνει σχεδόν 1 επανάληψη προηγούμενου χαρακτήρα. Όπως: a? Θα ταιριάζει με a ή aa.
  3. ( – Έναρξη έκφρασης εναλλαγής.
  4. ) – Τέλος έκφρασης εναλλαγής.
  5. | – Ταίριασμα με οποιαδήποτε από τις εκφράσεις που διαχωρίζονται με |. Όπως: \(a|b)cde θα ταιριάζει είτε με abcde είτε με bbcde.
  6. { – Αυτός ο μεταχαρακτήρας υποδεικνύει την αρχή του προσδιοριστή εύρους. Όπως: το \a{2} αντιστοιχεί στο \aa στο αρχείο, δηλαδή ένα 2 φορές.
  7. } – Αυτός ο μεταχαρακτήρας υποδεικνύει τον προσδιοριστή τέλους εύρους.

Διαφορές μεταξύ grep, egrep και fgrep

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

Εντολή Grep

Το grep ή το Global Regular Expression Print είναι το κύριο πρόγραμμα αναζήτησης σε συστήματα που μοιάζουν με Unix που μπορούν να αναζητήσουν οποιονδήποτε τύπο συμβολοσειράς σε οποιοδήποτε αρχείο ή λίστα αρχείων ή ακόμα και έξοδο οποιουδήποτε εντολή.

Χρησιμοποιεί Βασικές κανονικές εκφράσεις εκτός από κανονικές συμβολοσειρές ως μοτίβο αναζήτησης. Στις βασικές κανονικές εκφράσεις (BRE), μεταχαρακτήρες όπως: {,},(,),|,+,? χάνουν το νόημά τους και αντιμετωπίζονται ως κανονικοί χαρακτήρες συμβολοσειράς και πρέπει να διαφύγουν εάν πρόκειται να αντιμετωπιστούν ως ειδικοί χαρακτήρες.

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

$ grep -C 0 '(f|g)ile' check_file
$ grep -C 0 '\(f\|g\)ile' check_file

Όπως εδώ, όταν η εντολή εκτελείται χωρίς διαφυγή ( ) και |, τότε αναζήτησε την πλήρη συμβολοσειρά, π.χ. \(f|g)ile” στο αρχείο. Αλλά όταν οι ειδικοί χαρακτήρες διαφεύγουν, τότε αντί να τους αντιμετωπίζει ως μέρος της συμβολοσειράς, το grep τους αντιμετώπισε ως μετα-χαρακτήρες και αναζήτησε λέξεις \file ή \gile στο αρχείο.

Εντολή Egrep

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

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

$ egrep -C 0 '(f|g)ile' check_file
$ egrep -C 0 '\(f\|g\)ile' check_file

Όπως εδώ, το egrep αναζήτησε τη συμβολοσειρά \file όταν οι μετα-χαρακτήρες δεν είχαν διαφύγει, όπως θα σήμαινε από τη σημασία αυτών των χαρακτήρων. Αλλά, όταν αυτοί οι χαρακτήρες ήταν δραπέτευσε, στη συνέχεια το egrep τα αντιμετώπισε ως μέρος της συμβολοσειράς και αναζήτησε πλήρη συμβολοσειρά \(f|g)ile στο αρχείο.

Εντολή fgrep

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

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

$ fgrep -C 0 '(f|g)ile' check_file
$ fgrep -C 0 '\(f\|g\)ile' check_file

Όπως, όταν δεν έγινε διαφυγή μετα-χαρακτήρων, το fgrep αναζήτησε την πλήρη συμβολοσειρά \(f|g)ile” στο αρχείο και όταν οι μεταχαρακτήρες διαφεύγουν, τότε η εντολή fgrep αναζητά για \\(f\|g\)ile όλους τους χαρακτήρες όπως είναι στο αρχείο.

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

συμπέρασμα

Παραπάνω επισημαίνονται οι διαφορές μεταξύ grep, egrep και fgrep. Εκτός από τη διαφορά στο σύνολο των τυπικών εκφράσεων που χρησιμοποιούνται και την ταχύτητα εκτέλεσης, οι παράμετροι της γραμμής εντολών rest παραμένουν ίδιες και για τις τρεις εκδόσεις του grep και ακόμη και αντί για \egrep ή \fgrep, \grep -E ή Συνιστάται η χρήση του \grep -F.

Εάν βρείτε άλλες διαφορές μεταξύ αυτών των τριών εκδόσεων του grep, αναφέρετέ τις στα σχόλιά σας.