GNU/Linux >> Linux Esercitazione >  >> Linux

Come usare il comando Linux grep

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!


Linux
  1. Come usare il comando cronologia in Linux

  2. Come usare il comando Su in Linux

  3. Come utilizzare il comando id in Linux

  4. Usa il comando Linux grep

  5. Come utilizzare il comando "schermo" in Linux

Come utilizzare il comando fd sul sistema Linux

Come utilizzare il comando wget in Linux?

Come usare il comando xargs in Linux?

Uso del comando grep in Linux

Come utilizzare il comando RPM in Linux

Come utilizzare il comando which in Linux