GNU/Linux >> Linux Esercitazione >  >> Linux

Che cos'è il comando Grep in Linux? Perché viene utilizzato e come funziona?

Se usi Linux per lavoro regolare o per lo sviluppo e la distribuzione di software, devi aver trovato il comando grep.

In questo articolo esplicativo, ti dirò cos'è il comando grep e come funziona.

Cos'è grep?

Grep è un'utilità della riga di comando nei sistemi Unix e Linux. Viene utilizzato per trovare modelli di ricerca nel contenuto di un determinato file.

Con il suo nome insolito, potresti aver intuito che grep è un acronimo. Questo è almeno in parte vero, ma dipende da chi chiedi.

Secondo fonti attendibili, il nome è in realtà derivato da un comando in un editor di testo UNIX chiamato ed. In cui, l'input g/re/p ha eseguito una (g) ricerca globale per un'espressione regolare (re) e successivamente ha stampato (p) qualsiasi riga corrispondente.

Il comando grep fa quello che facevano i comandi g/re/p nell'editor. Esegue una ricerca globale per un'espressione regolare e la stampa. È molto più veloce nella ricerca di file di grandi dimensioni.

Questa è la narrazione ufficiale, ma potresti anche vederla descritta come G lobale R egular E xpressione (P processore | P arse | P riker). Sinceramente, fa tutto questo.

L'interessante storia dietro la creazione di grep

Ken Thompson ha dato incredibili contributi all'informatica. Ha contribuito a creare Unix, ha reso popolare il suo approccio modulare e ha scritto molti dei suoi programmi, incluso grep.

Thompson ha creato grep per assistere uno dei suoi colleghi ai Bell Labs. L'obiettivo di questo scienziato era quello di esaminare i modelli linguistici per identificare gli autori (incluso Alexander Hamilton) dei Federalist Papers. Questo vasto corpus di lavori era una raccolta di 85 articoli e saggi anonimi redatti in difesa della Costituzione degli Stati Uniti. Ma poiché questi articoli erano anonimi, lo scienziato stava cercando di identificare gli autori in base a un modello linguistico.

L'editor di testo Unix originale, ndr, (creato anche da Thompson) non era in grado di cercare un corpo di testo così ampio date le limitazioni hardware dell'epoca. Quindi, Thompson ha trasformato la funzione di ricerca in un'utilità autonoma, indipendente dall'editor ed.

Se ci pensi, significa che Alexander Hamilton ha aiutato tecnicamente a creare grep. Sentiti libero di condividere questo fatto divertente con i tuoi amici alla festa dell'orologio Hamilton. 🤓

Cos'è ancora un'espressione regolare?

Un'espressione regolare (o regex) può essere considerata come una query di ricerca. Le espressioni regolari vengono utilizzate per identificare, abbinare o gestire in altro modo il testo.

Tuttavia, Regex è in grado di fare molto di più delle ricerche di parole chiave. Può essere utilizzato per trovare qualsiasi tipo di modello immaginabile. I modelli possono essere trovati più facilmente usando i meta-caratteri. Questi caratteri speciali che rendono questo strumento di ricerca molto più potente.

Va notato che grep è solo uno strumento che utilizza regex. Esistono funzionalità simili nella gamma di strumenti, ma i metacaratteri e la sintassi possono variare. Ciò significa che è importante conoscere le regole per il tuo particolare processore regex.

Un esempio pratico di grep:corrispondenza dei numeri di telefono

Questo strumento può intimidire sia i principianti che gli utenti esperti di Linux. Sfortunatamente, anche uno schema relativamente semplice come un numero di telefono può risultare in una stringa regolare dall'aspetto "spaventoso".

Voglio rassicurarti che non c'è bisogno di andare nel panico quando vedi espressioni come questa. Una volta acquisita familiarità con le basi di regex, può aprire un nuovo mondo di possibilità per il tuo computer.

Nota culturale :questo esempio utilizza le convenzioni statunitensi (NANP) per i numeri di telefono. Si tratta di ID a 10 cifre che sono suddivisi in un prefisso (3 cifre) e una combinazione univoca di 7 cifre in cui le prime 3 cifre corrispondono a un ufficio centrale delle telecomunicazioni (noto come prefisso) e le ultime 4 sono chiamate la linea numero. Quindi lo schema è AAA-PPP-LLLL.

Ho creato un file chiamato phone.txt e annotato 4 varianti comuni dello stesso numero di telefono. Userò grep per riconoscere il modello numerico indipendentemente dal formato.

Ho anche aggiunto una riga che non sarà conforme all'espressione da utilizzare come controllo. La riga finale 555!123!1234 non è un modello di numero di telefono standard e non verrà restituito dall'espressione grep.

Contenuto di phone.txt i file sono:

[email protected]:~$ cat phone.txt 
5551231234
555 123 1234
555-123-1234
(555)-123-1234
555!123!1234

Per "grep" i numeri di telefono, scriverò la mia espressione regolare utilizzando meta-caratteri per isolare i dati rilevanti e ignorare ciò che non mi serve.

Il comando completo sarà simile al seguente:

[email protected]:~$ grep '\(([0-9]\{3\})\|[0-9]\{3\}\)[ -]\?[0-9]\{3\}[ -]\?[0-9]\{4\}' phone.txt

Sembra un po' intenso, giusto? Dividiamolo in blocchi per avere un'idea migliore di ciò che sta accadendo.

Capire l'espressione regolare, un segmento alla volta

Per prima cosa separiamo la sezione della RegEx che cerca il "prefisso" nel numero di telefono.

Uno schema simile viene parzialmente ripetuto per ottenere anche il resto delle cifre. È importante notare che il prefisso a volte è racchiuso tra parentesi, quindi è necessario tenerne conto con l'espressione qui.

La logica dell'intera sezione del prefisso è incapsulata in una serie di parentesi tonde con escape. Puoi vedere che il mio codice inizia con \( e termina con \) .

Quando usi le parentesi quadre [0-9] , stai facendo sapere a grep che stai cercando un numero compreso tra 0 e 9. Allo stesso modo, potresti usare [a-z] per abbinare le lettere dell'alfabeto.

Il numero tra parentesi graffe {3\} , significa che l'elemento tra parentesi quadre corrisponde esattamente tre volte.

Ancora confuso? Non stressarti. Osserverai questo esempio in diversi modi in modo da sentirti sicuro di andare avanti.

Proviamo a guardare la logica della sezione del prefisso in pseudo-codice. Ho isolato ogni segmento dell'espressione.

Pseudo-codice del prefisso RegEx

  • \(
  • (Numero a 3 cifre)
  • |
  • Numero a 3 cifre
  • \)

Si spera che vederlo in questo modo renda la regex più semplice. In un linguaggio semplice stai cercando numeri a 3 cifre. Ogni cifra potrebbe essere 0-9 e potrebbero esserci o potrebbe non essere tra parentesi attorno al prefisso.

Poi, c'è questo pezzo strano alla fine della nostra prima sezione.

  • [ -]\?

Cosa significa? Il \? il simbolo significa "corrisponde a zero o a uno dei caratteri precedenti". Qui, si riferisce a ciò che è tra parentesi quadre [ -] .

In altre parole, potrebbe esserci o meno un trattino che segue le cifre.

Prefisso

Ora, ricostruiamo lo stesso blocco con il codice effettivo. Quindi, aggiungerò le altre parti dell'espressione.

  • \(
  • ([0-9]\{3\})
  • |
  • [0-9]\{3\}
  • \)
  • [ -]\?

Prefisso

Per completare lo schema del numero di telefono, puoi semplicemente riutilizzare parte del tuo codice esistente.

[0-9]\{3\}[ -]\?

Non devi preoccuparti della parentesi che circonda il prefisso, ma potresti comunque avere o meno un - tra il prefisso e le cifre di riga del numero di telefono.

Numeri di riga

L'ultima sezione del numero di telefono non richiede la ricerca di altri caratteri, ma è necessario aggiornare l'espressione per riflettere la cifra in più.

[0-9]\{4\}

Questo è tutto. Ora assicuriamoci che l'espressione sia contenuta tra virgolette per ridurre al minimo i comportamenti imprevisti.

Ecco di nuovo l'espressione completa

[email protected]:~$ grep '\(([0-9]\{3\})\|[0-9]\{3\}\)[ -]\?[0-9]\{3\}[ -]\?[0-9]\{4\}' phone.txt

Puoi vedere che i risultati sono evidenziati a colori. Questo potrebbe non essere il comportamento predefinito sulla tua distribuzione Linux.

Suggerimento bonus

Se desideri che i tuoi risultati siano evidenziati, puoi aggiungere --color=auto al tuo comando. Puoi anche aggiungerlo al tuo profilo shell come alias in modo che ogni volta che digiti grep viene eseguito come grep --color=auto .

Spero che tu abbia una migliore comprensione del comando grep ora. Ho mostrato solo un esempio per spiegare le cose. Se sei interessato, puoi consultare questo articolo per esempi più pratici del comando grep.

Fornisci il tuo suggerimento sull'articolo lasciando un commento.


Linux
  1. Come usare il comando Linux grep

  2. Che cos'è un comando Chown in Linux e come usarlo

  3. Cos'è NGINX? Come funziona?

  4. Che cos'è un server Web e come funziona un server Web?

  5. Come scoprire cosa fa un comando Linux

Comando file Linux:cosa fa e come usarlo

Linux Tail Command:cos'è e come usarlo

Come installare e utilizzare il comando fd in Linux

Come usare grep in Linux

Che cos'è il comando sorgente in Linux e come funziona?

Cosa sono le pipe in Linux? Come funziona il reindirizzamento dei tubi?