Ricerca nel sito web

Come utilizzare il comando grep di Linux


Apprendi le nozioni di base sulla ricerca di informazioni nei tuoi file, quindi scarica il nostro cheat sheet per una guida di riferimento rapida a grep e regex.

Uno dei classici comandi Unix, sviluppato nel lontano 1974 da Ken Thompson, è il comando Global Regular Expression Print (grep). È così onnipresente nell'informatica che è spesso usato come verbo ("greppare un file") e, a seconda di quanto sia geniale il tuo pubblico, si adatta bene anche agli scenari del mondo reale. (Ad esempio, "Dovrò eseguire il grep sui miei banchi di memoria per richiamare quell'informazione.") In breve, grep è un modo per cercare in un file uno schema specifico di caratteri. Se suona come la moderna funzione Trova disponibile in qualsiasi elaboratore di testi o editor di testo, allora hai già sperimentato gli effetti di grep sul settore informatico.

Lungi dall'essere semplicemente un vecchio comando pittoresco che è stato soppiantato dalla tecnologia moderna, il vero potere di grep risiede in due aspetti:

  • Grep funziona nel terminale e opera su flussi di dati, quindi puoi incorporarli in processi complessi. Non solo puoi trovare una parola in un file di testo; puoi estrarre la parola, inviarla a un altro comando e così via.
  • Grep utilizza l'espressione regolare per fornire una funzionalità di ricerca flessibile.

Imparare il comando grep è facile, anche se richiede un po' di pratica. Questo articolo presenta alcune delle sue funzionalità che trovo più utili.

[Scarica il nostro cheat sheet gratuito su grep]

Installazione di grep

Se stai usando Linux, hai già installato grep.

Su macOS hai la versione BSD di grep. Questo differisce leggermente dalla versione GNU, quindi se vuoi seguire esattamente questo articolo, installa GNU grep da un progetto come Homebrew o MacPorts.

Grep di base

La sintassi grep di base è sempre la stessa. Fornisci al comando grep un modello e un file che desideri cercare. In cambio, stampa ogni riga sul tuo terminale con una corrispondenza.

$ grep gnu gpl-3.0.txt
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
<http://www.gnu.org/licenses/>.
<http://www.gnu.org/philosophy/why-not-lgpl.html>.

Per impostazione predefinita, il comando grep distingue tra maiuscole e minuscole, quindi "gnu" è diverso da "GNU" o "Gnu". Puoi fare in modo che ignori le maiuscole con l'opzione --ignore-case.

$ grep --ignore-case gnu gpl-3.0.txt
                    GNU GENERAL PUBLIC LICENSE
  The GNU General Public License is a free, copyleft license for
the GNU General Public License is intended to guarantee your freedom to
GNU General Public License for most of our software; it applies also to
[...16 more results...]
<http://www.gnu.org/licenses/>.
<http://www.gnu.org/philosophy/why-not-lgpl.html>.

Puoi anche fare in modo che il comando grep restituisca tutte le righe senza una corrispondenza utilizzando l'opzione --invert-match:

$ grep --invert-match \
--ignore-case gnu gpl-3.0.txt
                      Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
[...648 lines...]
Public License instead of this License.  But first, please read

Tubi

È utile poter trovare del testo in un file, ma il vero potere di POSIX è la sua capacità di concatenare i comandi tramite "pipe". Trovo che il miglior utilizzo di grep sia quando è combinato con altri strumenti, come cut, tr o curl.

Ad esempio, supponiamo che io abbia un file che elenca alcuni documenti tecnici che desidero scaricare. Potrei aprire il file e fare clic manualmente su ciascun collegamento, quindi fare clic sulle opzioni di Firefox per salvare ciascun file sul mio disco rigido, ma ci vuole molto tempo e clic. Invece, potrei eseguire il grep per i collegamenti nel file, stampando solo la stringa corrispondente utilizzando l'opzione --only-matching:

$ grep --only-matching http\:\/\/.*pdf example.html
http://example.com/linux_whitepaper.pdf
http://example.com/bsd_whitepaper.pdf
http://example.com/important_security_topic.pdf

L'output è un elenco di URL, ciascuno su una riga. Questo è un adattamento naturale al modo in cui Bash elabora i dati, quindi invece di avere gli URL stampati sul mio terminale, posso semplicemente collegarli a curl:

$ grep --only-matching http\:\/\/.*pdf \
example.html | curl --remote-name

Questo scarica ogni file, salvandolo in base al nome file remoto sul mio disco rigido.

Il mio modello di ricerca in questo esempio può sembrare criptico. Questo perché utilizza l'espressione regolare, una sorta di linguaggio "jolly" che è particolarmente utile quando si effettuano ricerche estese in molto testo.

Espressione regolare

Nessuno si illude che l'espressione regolare ("regex" in breve) sia facile. Tuttavia, trovo che spesso abbia una reputazione peggiore di quella che merita. Certo, c'è il rischio che le persone diventino un po' troppo intelligenti con le espressioni regolari finché non diventano così illeggibili e così larghe da ripiegarsi su se stesse, ma non è necessario esagerare con le espressioni regolari. Ecco una breve introduzione alle espressioni regolari nel modo in cui le utilizzo.

Innanzitutto, crea un file chiamato example.txt e inserisci questo testo:

Albania
Algeria
Canada
0
1
3
11

L'elemento più basilare della regex è l'umile carattere .. Rappresenta un singolo carattere.

$ grep Can.da example.txt
Canada

Il modello Can.da ha restituito con successo Canada perché il carattere . rappresentava un carattere qualsiasi.

Il carattere jolly . può essere modificato per rappresentare più di un carattere con queste notazioni:

  • ? corrisponde all'elemento precedente zero o una volta
  • * corrisponde all'elemento precedente zero o più volte
  • + corrisponde all'elemento precedente una o più volte
  • {4} corrisponde all'elemento precedente quattro volte (o qualsiasi numero inserito tra parentesi graffe).

Armati di questa conoscenza, puoi esercitarti con le espressioni regolari su example.txt tutto il pomeriggio, vedendo quali combinazioni interessanti ti vengono in mente. Alcuni non funzioneranno; altri lo faranno. L’importante è analizzare i risultati, così da capire il perché.

L'espressione regolare avanzata richiede l'opzione --extended-regexp o -E.

Ad esempio, questo non riesce a restituire alcun paese:

$ grep -E A.a example.txt

Fallisce perché il carattere . può corrispondere sempre e solo a un singolo carattere a meno che non lo aumenti di livello. Usando il carattere *, puoi dire a grep di far corrispondere un singolo carattere zero o tante volte quanto necessario finché non raggiunge la fine della parola. Poiché conosci l'elenco con cui hai a che fare, sai che zero volte è inutile in questo caso. Sicuramente non ci sono nomi di paesi di tre lettere in questo elenco. Quindi, invece, puoi utilizzare + per abbinare un singolo carattere almeno una volta e poi ancora tutte le volte necessarie fino alla fine della parola:

$ grep -E A.+a example.txt
Albania
Algeria

È possibile utilizzare parentesi quadre per fornire un elenco di lettere:

$ grep -E [AC].+a example.txt
Albania
Algeria
Canada

Funziona anche con i numeri. I risultati potrebbero sorprenderti:

$ grep [1-9] example.txt
1
3
11

Sei sorpreso di vedere 11 in una ricerca per le cifre da 1 a 9?

Cosa succede se ne aggiungi 13 alla tua lista?

Questi numeri vengono restituiti perché includono 1, che è nell'elenco delle cifre da abbinare.

Come puoi vedere, l'espressione regolare è una sorta di enigma, ma attraverso la sperimentazione e la pratica, puoi familiarizzare con essa e usarla per migliorare il modo in cui gestisci i tuoi dati.

Scarica il foglietto illustrativo

Il comando grep ha molte più opzioni di quelle che ho dimostrato in questo articolo. Sono disponibili opzioni per formattare meglio i risultati, elencare file e numeri di riga contenenti corrispondenze, fornire contesto per i risultati stampando le righe che circondano una corrispondenza e molto altro. Se stai imparando grep, o semplicemente ti ritrovi a usarlo spesso e a ricorrere alla ricerca nelle sue pagine info, farai un favore a te stesso scaricando il nostro cheat sheet. Il cheat sheet utilizza opzioni brevi (-v invece di --invert-matching, per esempio) come un modo per familiarizzare con le comuni scorciatoie grep. Contiene anche una sezione regex per aiutarti a ricordare i codici regex più comuni. Scarica il cheat sheet grep oggi! 

Articoli correlati: