mercoledì 24 novembre 2010

Ricerche nei file di testo

Con il comando grep (general regular expression print) possiamo cercare parole all'interno di uno o più file di testo. Se siamo alla ricerca di una parola da modificare all'interno di un file di configurazione, il comando grep fa allora al caso nostro! Lo stesso comando, come vedremo fra un po, permette inoltre di filtrare l'output generato da altri comandi.
La sintassi usata dal comando è la seguente: grep opzioni pattern file, dove: opzioni indica al comando come cercare e stampare il testo trovato, pattern è la parola da cercare e può essere sia una semplice stringa che un'espressione regolare, file indica al comando il nome del file in cui cercare il testo, si può indicare uno o più file. Se il parametro file non viene specificato il comando effettuerà la ricerca sullo standard output.
Le opzioni usate da grep sono tante, mi occuperò di quelle che solitamente uso. Come sempre, un elenco più lungo e una descrizione assai più dettagliata su grep può essere letta accedendo alla pagina del manuale con il comando man grep.
Osservate l'output di questo comando grep Adamo "La divina commedia.txt":


Vengono stampate tutte le righe che contengono la parola Adamo nel file La divina commedia.txt! Se siamo interessati a conoscere il numero delle righe che contengono la parola cercata, occorre passare al comando l'opzione -n (number):


Per dire al comando di ignorare la differenza fra le lettere scritte in maiuscolo e minuscolo (che i sistemi operativi GNU/Linux applicano di default) si usa invece l'opzione -i (ignore):


Talvolta può essere utile, per individuare in seguito la parola all'interno del testo, stampare la riga che precede o segue la parola trovata. A tale proposito il comando prevede due utili opzioni: -B (before) per stampare la riga che precede la parola ed -A (after) per la riga successiva. Se usiamo queste due opzioni dobbiamo necessariamente indicare anche il numero di righe da stampare prima e dopo la riga contenente la parola trovata! Ecco ad esempio l'output del comando grep -ni -B1 -A1 ADAMO "La divina commedia.txt":


Con l'opzione -c (count) vengono invece conteggiate le parole cercate:


Se qualche vostro amico vi chiama da "Chi vuol essere milionario", per un aiuto da casa, ricordatevi di grep! Se non sappiamo bene in che file cercare possiamo dire almeno a grep di avviare una ricerca ricorsiva nei file che si trovano in una cartella del filesystem, l'opzione da usare è -r (recursive).
Il comando permette infine di descrivere il pattern con un'espressione regolare (opzione -E) o con una semplice stringa (opzione -F). Se stiamo cercando tutte le parole che iniziano per pattern meglio allora descrivere lo stesso con il tag \<. Per le parole che terminano con pattern usate il tag \>.
Come dicevo prima se non viene indicato il parametro file in cui cercare il testo il comando grep assume come input lo standard input. Quest'altro modo di usare grep è spesso associato all'uso di una pipe: con un comando generiamo nel terminale un output e con grep lo filtriamo, stampando le righe che ci interessano! Osservate questa immagine e capirete:


Il comando lsmod stampa l'elenco di tutti i moduli caricati nel kernel. Un elenco che a volte, a seconda della configurazione, può essere molto lungo.

Nessun commento:

Posta un commento