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 ("sfogliare un file") e, a seconda di quanto sia geniale il tuo pubblico, si adatta bene anche agli scenari del mondo reale. (Ad esempio, "Dovrò grep i miei banchi di memoria per richiamare quell'informazione.") In breve, grep è un modo per cercare un modello specifico di caratteri in un file. 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 sull'industria informatica.
Lungi dall'essere solo 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 capacità di ricerca flessibile.
Imparare il grep
il comando è facile, anche se richiede un po' di pratica. Questo articolo ti presenta alcune delle sue funzionalità che ritengo più utili.
[Scarica il nostro cheat sheet gratuito di grep]
Installazione di grep
Se stai usando Linux, hai già grep installato.
Su macOS, hai la versione BSD di grep. Questo è leggermente diverso 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 di base di grep è sempre la stessa. Fornisci il grep
comanda un pattern e un file in cui vuoi che cerchi. 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 grep
il comando fa distinzione tra maiuscole e minuscole, quindi "gnu" è diverso da "GNU" o "Gnu". Puoi fare in modo che ignori le maiuscole con --ignore-case
opzione.
$ 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 creare il grep
comando restituisce tutte le righe senza una corrispondenza utilizzando il --invert-match
opzione:
$ 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 essere in grado di trovare il testo in un file, ma il vero potere di POSIX è la sua capacità di concatenare i comandi insieme tramite "pipe". Trovo che il mio miglior uso di grep sia quando è combinato con altri strumenti, come cut, tr o curl.
Ad esempio, supponi di avere un file che elenca alcuni documenti tecnici che voglio scaricare. Potrei aprire il file e fare clic manualmente su ciascun collegamento, quindi fare clic sulle opzioni di Firefox per salvare ogni file sul mio disco rigido, ma è molto tempo e fare clic. Invece, potrei grep per i collegamenti nel file, stampando solo la stringa corrispondente utilizzando --only-matching
opzione:
$ 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 per il modo in cui Bash elabora i dati, quindi invece di avere gli URL stampati sul mio terminale, posso semplicemente convogliarli in curl
:
$ grep --only-matching http\:\/\/.*pdf \
example.html | curl --remote-name
Più risorse Linux
- Comandi Linux cheat sheet
- Cheat sheet sui comandi avanzati di Linux
- Corso online gratuito:Panoramica tecnica RHEL
- Cheat sheet della rete Linux
- Cheat sheet di SELinux
- Cheat sheet dei comandi comuni di Linux
- Cosa sono i container Linux?
- I nostri ultimi articoli su Linux
Questo scarica ogni file, salvandolo in base al suo 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" particolarmente utile quando si effettuano ricerche in modo ampio su 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'è la possibilità che le persone diventino un po' troppo intelligenti con regex fino a quando non è così illeggibile e così ampio da ripiegarsi su se stesso, ma non devi esagerare con la tua regex. Ecco una breve introduzione alla regex nel modo in cui la uso.
Innanzitutto, crea un file chiamato example.txt
e inserisci questo testo al suo interno:
Albania
Algeria
Canada
0
1
3
11
L'elemento più basilare di regex è l'umile .
carattere. Rappresenta un singolo carattere.
$ grep Can.da example.txt
Canada
Il modello Can.da
restituito con successo Canada
perché il .
carattere rappresentato qualsiasi uno carattere.
Il .
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 (o qualsiasi numero inserito tra parentesi graffe) volte
Forte di questa conoscenza, puoi esercitarti con l'espressione regolare su example.txt
tutto il pomeriggio, vedendo che combinazioni interessanti ti vengono in mente. Alcuni non funzioneranno; altri lo faranno. L'importante è analizzare i risultati, in modo da capire perché.
L'espressione regolare avanzata richiede --extended-regexp oppure -E opzione.
Ad esempio, questo non restituisce alcun paese:
$ grep -E A.a example.txt
Non riesce perché il .
il personaggio può eguagliare sempre un solo personaggio a meno che non lo si aumenti di livello. Usando il *
carattere, puoi dire a grep
per abbinare un singolo carattere zero o tutte le volte necessarie fino a raggiungere la fine della parola. Poiché conosci l'elenco con cui hai a che fare, lo sai zero volte è inutile in questo caso. Non ci sono assolutamente nomi di paesi di tre lettere in questo elenco. Quindi, invece, puoi usare +
per abbinare un singolo carattere almeno una volta e poi di nuovo tutte le volte necessarie fino alla fine della parola:
$ grep -E A.+a example.txt
Albania
Algeria
Puoi utilizzare le parentesi quadre per fornire un elenco di lettere:
$ grep -E [AC].+a example.txt
Albania
Algeria
Canada
Funziona anche per i numeri. I risultati potrebbero sorprenderti:
$ grep [1-9] example.txt
1
3
11
Sei sorpreso di vedere 11 in una ricerca di cifre da 1 a 9?
Cosa succede se aggiungi 13 alla tua lista?
Questi numeri vengono restituiti perché includono 1, che è nell'elenco delle cifre da abbinare.
Come puoi vedere, regex è una specie di enigma, ma attraverso la sperimentazione e la pratica, puoi metterti a tuo agio e usarlo per migliorare il modo in cui grep i tuoi dati.
Scarica il cheatsheet
Il grep
comando 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 ancora. Se stai imparando grep, o semplicemente ti ritrovi a usarlo spesso e a ricorrere alla ricerca attraverso le sue info
pagine, ti farai un favore scaricando il nostro cheat sheet. Il cheat sheet utilizza opzioni brevi (-v
invece di --invert-matching
, per esempio) come un modo per familiarizzare con la comune scorciatoia grep. Contiene anche una sezione regex per aiutarti a ricordare i codici regex più comuni. Scarica il cheat sheet di grep oggi!