grep-tutorial-05

Vi è mai capitato di dover cercare una stringa o un qualcosa in particolare all’interno del testo di uno o più file e di non sapere da che parte cominciare? Bè, grep è ciò che stavate cercando!

grep è un potentissimo tool per la ricerca disponibile per ogni distribuzione di Linux. Se per qualche motivo non lo trovate già installato sul vostro sistema, potete rimediare facilmente tramite il vostro packet manager (apt-get su Debian/Ubuntu e yum sulle distro RHEL/CentOS/Fedora).

$ sudo apt-get install grep #Debian/Ubuntu
$ sudo yum install grep #RHEL/CentOS/Fedora

Installato e pronto all’uso? Ecco qualche esempio pratico di utilizzo.

1. Cercare e trovare grazie ad un filtro

Supponiamo che abbiate appena installato Ubuntu sul vostro sistema e che vogliate provare a programmare in Python. Avete cercato sul web qualche tutorial, ma avete visto che esistono due versioni di Python e non sapete quale è stata installata sul vostro sistema. Dovrete dunque capire quali pacchetti python avete e potrete farlo con questo comando:

# dpkg –l | grep –i python

Il comando dpkg –l ci propone una lista di tutti i pacchetti installati sul sistema. Il comando grep –i python ci ha permesso di filtrare i risultati e mostrare solo quelli che contengono la parola “python”. Infine l’opzione –i dice a grep di lavorare in modalità ignore-case, perché altrimenti grep lavora in modalità case-sensitive.

2. Cercare e filtrare “al contrario”

grep può essere anche usato per cercare e filtrare dei files. Immaginiamo questo scenario:
State avendo qualche problema con Apache e come sempre vi siete rivolti alla sapienza di qualche forum sul web per trovare una soluzione. Qualche anima pia vi ha risposto chiedendovi di postare il contenuto del vostro file /etc/apache2/sites-available/default-ss. Non sarebbe bello poter postare il contenuto del file senza tutti gli inutili commenti che iniziano con “#”?

# grep –v "#" /etc/apache2/sites-available/default-ssl

L’opzione –v dice a grep di lavorare al contrario: invece di stampare le righe che contengono il simbolo “#”, chiediamogli di stampare tutto tranne quelle righe e avremo così il contenuto del file privo dei commenti.

3. Trovare solo i file con una determinata estensione

Il comando grep può essere molto utile anche e soprattutto se combinato con il cugino find. Supponiamo per esempio che abbiate una cartella piena zeppa di musica in diversi formati e che vogliate trovare solo i file mp3 dell’artista Madonna. Un paio di pipes (“|”) e la combinazione di find e grep vi daranno ciò che state cercando:

# find . –name “*.mp3” | grep –i Madonna | grep –vi "remix"

Il comando find trova tutti i files con estensione mp3, mentre quello grep si occupa prima di filtrare i files che hanno “Madonna” nel nome e poi, con l’aiuto dell’opzione -v, di escludere tutti i files che contengono la parola “remix”.

4. Mostrare qualche riga in più prima e dopo i risultati

Altre opzioni interessanti di grep sono sicuramente -A -B, dove A sta per AFTER (dopo) e B sta per BEFORE (prima). Queste opzioni determinano quante righe mostrare prima e/o dopo la riga trovata dal comando grep. Ad esempio verifichiamo l’output del comando ifconfig cercando la corrispondenza “eth0” e mostrando altre 4 righe dopo quella trovata:

# ifconfig | grep –A 4 eth0

5. Mostrare qualche riga in più (sia prima che dopo)

Se le opzioni -A e -B del punto precedente vi sono piaciute, adorerete l’opzione -C. La funzione è molto simile solo che permette di specificare un numero di righe da mostrare sia prima che dopo. Ad esempio possiamo dire a grep di mostrare la riga trovata stampando anche le 2 righe sopra e le 2 righe sotto ad essa:

# ifconfig | grep –C 2 lo

6. Scoprire quante righe corrispondono alla tua ricerca

Volete sapere quante volte l’espressione “inet6” è presente in ifconfig?

# ifconfig | grep –c inet6

7. Trovare il numero della riga cercata

L’opzione –n di grep è molto utile quanto si sta effettuando un debug durante la programmazione. Possiamo usarla per trovare il numero della riga (o delle righe) dove si trova la stringa cercata:

# grep –n "main" setup.php

8. Cercare una stringa in modo ricorsivo

Se volete usare grep in modo ricorsivo, cioè andando a cercare anche nelle directory sottostanti a quella in cui siete, non potrete fare a meno dell’opzione -r:

# grep –r "function" *

9. Cercare una stringa in un file gzip

Merita una menzione tra i derivati di grep il figlio zgrep che, in modo simile a zcat, è da utilizzare sui file gzippati. Si usa esattamente come grep:

# zgrep –i error /var/log/syslog.2.gz

10. Trovare espressioni regolari

Anche egrep è uno dei figli interessanti del buon grep. egrep riconosce le espressioni regolari che si possano costruire usando caratteri come at + ? | e (). egrep è davvero utile quando si stanno cercando delle regular expressions e si può utilizzare semplicemente grazie all’opzione –E.

# grep –E