Αναζήτηση κειμένου σε αρχείο

Εικόνα: markos
Submitted by markos on Δευ, 05/03/2007 - 21:07

Αν προσπαθήσατε ποτέ να εισχωρήσετε στα πιο “βαθειά νερά” του UNIX, θα χρειαστήκατε σίγουρα σε κάποια στιγμή να βρείτε κάποιο αρχείο που να περιέχει κάποιο συγκεκριμένο κείμενο. Κατά πάσα πιθανότητα θα χρησιμοποιήσατε κάποια από τις εντολές grep για να κάνετε την αναζήτηση. Οι εντολές αυτές προσφέρουν, με μικρές παραλλαγές η κάθε μία, τρόπους αναζήτησης κειμένου ή κανονικών παραστασεων (regular expressions) σε αρχεία κειμένου (χωρίς να περιορίζεται η χρήση τους μόνο σε αυτά).

Οι εντολές grep, fgrep, egrep, rgrep

Υπάρχουν τέσσερις εντολές grep, η γενικής χρήσης grep, η fgrep που δε χρησιμοποιεί μεταχαρακτήρες, η egrep που ειδικεύεται στην αναζήτηση με μεταχαρακτήρες και η rgrep που δρα αναδρομικά σε καταλόγους. Συγκεκριμένα,

  • Η fgrep ειδικεύεται στην αναζήτηση αυτούσιων κομματιών κειμένου, χωρίς την ανάγκη χρήσης μεταχαρακτήρων όπως *, ?, $, ^, κλπ.
  • Η egrep χρησιμοποιεί το πλήρες σύνολο των μεταχαρακτήρων και κανονικών παραστάσεων και θεωρείται η πιο γρήγορη από τις τρεις.
  • Η rgrep δεν είναι άλλο από αναδρομική grep (ενεργοποιεί την επιλογή -r στη grep).

Στην πραγματικότητα δεν πρόκειται για τεσσερις διαφορετικές εντολές αλλά για συντομεύσεις της ίδιας εντολής. Σε παλαιότερα συστήματα UNIX ήταν όντως τρείς εντολές (grep, fgrep, egrep) αλλά στο πακέτο GNU grep που διανέμεται με το Debian, πρόκειται για μία εντολή με επιπλέον τρια σενάρια κελύφους που λειτουργούν ως wrappers(?): fgrep, egrep και rgrep. Η σύνταξή της είναι η εξής:

grep [OPTIONS] pattern file
fgrep [OPTIONS] pattern file
egrep [OPTIONS] pattern file
rgrep [OPTIONS] pattern file

όπου file το αρχείο ή τα αρχεία στα οποία θέλουμε να αναζητήσουμε κείμενο, ή αν δεν δίνεται αρχείο θεωρείται ή πρότυπη είσοδος (standard input). Ως pattern δίνουμε το κείμενο που θέλουμε να αναζητήσουμε ή την κανονική παράσταση που περιέχει μεταχαρακτήρες. Για τις εντολές grep ισχύουν οι εξής επιλογές:

Επιλογές
Λειτουργία
-E Ισοδύναμο με την κλήση της egrep.
-F Ισοδύναμο με την κλήση της fgrep.
-r, -R
--recursive
Ισοδύναμο με την κλήση της rgrep. Πραγματοποιεί την αναζήτηση αναδρομικά σε όλους τους καταλόγους και στα αρχεία που περιέχονται σε αυτούς.
-f FILE
--file FILE
Πραγματοποιεί την αναζήτηση χρησιμοποιώντας τις κανονικές παραστάσεις ή το κείμενο που περιέχεται στο αρχείο FILE.
-i
--ignore-case
Αγνοεί τις διαφορές μεταξύ πεζών-κεφαλαίων γραμμάτων.
-l
--files-with-matches
Εμφανίζει μόνο τους τίτλους των αρχείων για τα οποία πέτυχε η αναζήτηση.
-L
--files-without-matches
Εμφανίζει μόνο τους τίτλους των αρχείων για τα οποία απέτυχε η αναζήτηση.
-n
--line-number
Εμφανίζει τις γραμμές αριθμημένες.
-v
--invert-match
Αντιστρέφει την αναζήτηση. Αναζητά γραμμές κειμένου που δεν ταιριάζουν με το δοθέν κείμενο ή κανονική παράσταση.

Για περισσότερες πληροφορίες για τις κανονικές παραστάσεις ανατρέξατε στο κεφ. και στις σελίδες οδηγιών ή στα κείμενα πληροφοριών της grep (man, info).

Παραθέτουμε ορισμένα παραδείγματα χρήσης της grep:

$ ps aux|grep ssh
root       733  0.0  0.3  2684  744 ?        S    Jun27   0:00 /usr/sbin/sshd
feanor    9895  0.0  0.3  2796  712 pts/5    R    21:29   0:00 grep ssh

Εμφανίζει τις διεργασίες που περιέχουν τη λέξη ssh στο όνομά τους (όπως αυτό φαίνεται με την εντολή ps). Περισσότερα για τις διεργασίες και για την εντολή ps θα δούμε στο επόμενο κεφ.

$ grep -lr sqrt /usr/include/
/usr/include/bits/mathinline.h
/usr/include/bits/mathcalls.h
/usr/include/bits/cmathcalls.h
/usr/include/math.h
/usr/include/tgmath.h
/usr/include/linux/sysctl.h

Επιστρέφει τη λίστα όλων των αρχείων που βρίσκονται στον κατάλογο /usr/include και περιέχουν αναφορά στο υποπρόγραμμα της γλώσσας C sqrt (square root, τετραγωνική ρίζα).

$ grep -v ^[A-z] userslist

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

$ grep -i “john smith” userslist

Στο ίδιο αρχείο, επιστρέφει τις γραμμές στις οποίες αναφέρεται το όνομα “john smith” αλλά και “JOHN SMITH”, “John Smith” κλπ.

0
Your rating: None