Cos'è GREP in Linux e come si utilizza

Una fotografia di una persona che lavora al suo laptop.

Grep è un piccolo programma UNIX per trovare modelli corrispondenti. Rilasciato per la prima volta in V6 UNIX, ora puoi trovarlo su quasi tutti i sistemi simili a UNIX come Linux, macOS e persino BSD. In questo articolo, passerò in rassegna le basi di Grep e ti mostrerò alcuni esempi di come utilizzare il programma per compiti quotidiani.

Le basi dell’uso di Grep

Alla sua essenza, Grep è un programma semplice e diretto. Riceve un input, trova il testo che desideri in quell’input e stampa le corrispondenze come output. Grep può elaborare quasi qualsiasi fonte di testo semplice. Questo gli consente di leggere input provenienti da altri comandi e di cercare direttamente all’interno dei file.

Il modo più semplice per iniziare a usare Grep è leggendo dati da un file di testo. Ad esempio, il seguente comando stampa il contenuto del mio file sample.txt:

grep'' sample.txt

Inoltre, puoi utilizzare questa funzione per cercare e trovare pezzi specifici di testo all’interno dei tuoi file di testo:

grep'word' sample.txt

Un terminale che mostra la semplice funzione di corrispondenza delle parole di Grep.

Puoi anche utilizzare Grep con le pipe UNIX, consentendoti di unire più programmi in un unico comando:

cat sample.txt |grep''

Un terminale che mostra Grep che stampa l'intero file quando viene eseguito senza argomenti.

Buono a sapersi: vuoi espandere la tua conoscenza di UNIX? Scopri come funzionano i lettori di schermo in Linux consultando la nostra scheda informativa per GNU less.

Trovare file in una directory

Uno dei compiti più facili che puoi svolgere con Grep è trovare file in un elenco di directory. Per farlo, puoi inviare l’output del comando ls attraverso una pipe UNIX direttamente a Grep.

Il seguente comando stamperà ed evidenzierà tutti i file nella tua cartella Download con estensione di file .jpg:

ls ~/Downloads |grep \\.jpg

Un terminale che mostra Grep che filtra le liste di file in base all'estensione del file.

Puoi anche inviare un output ls più elaborato a Grep e usarlo per la corrispondenza dei modelli. Ad esempio, il seguente elenco mostra tutti i file nella directory con dimensioni inferiori a 1 MB:

ls-lh ./|grep .K

Dimentica il maiuscolo

Per impostazione predefinita, quasi tutti i programmi in un sistema simile a UNIX sono sensibili al maiuscolo. Questo significa che il sistema tratta la stringa “Hello” in modo diverso da “hello”, “hEllo” e “helLo”.

Un terminale che mostra il comportamento predefinito sensibile al maiuscolo di Grep.

Questo comportamento può essere fastidioso quando si cercano stringhe all’interno dei file. Ad esempio, un saggio può contenere sia “Hello” che “hello” contemporaneamente. Per risolvere questo problema, esegui Grep con il flag -i seguito dalla stringa che desideri trovare.

grep-i Hello hello.txt

Un terminale che mostra il flag -i che disabilita la sensibilità al maiuscolo di Grep.

Ricerche ricorsive

Grep può cercare in più di un file o directory alla volta. Questo è utile se stai lavorando a un progetto con più file e vuoi sapere dove compare una stringa di testo in una directory. Ad esempio, il seguente comando corrisponde alla parola “MakeTechEasier” all’interno della directory “sample”:

grep-r'MakeTechEasier' ./sample

Detto ciò, utilizzare il flag -r chiederà anche a Grep di cercare in ogni file nella directory di destinazione. Questo può essere un problema se hai anche file non di testo all’interno della cartella che stai cercando. Per prevenirlo, esegui Grep con il flag -I:

grep-rI'MakeTechEasier' ./sample

A proposito: scopri come creare file nel terminale utilizzando il comando touch.

Corrispondenza di file contenenti stringhe

Oltre a mostrare dove si verifica una stringa specifica in diversi file, puoi anche utilizzare Grep per creare un elenco di file che contengono il tuo testo target. Questo è utile se vuoi sapere se un file contiene una particolare stringa, ma non vuoi che Grep stampi ogni istanza di essa nel terminale.

Per fare ciò, esegui Grep con i flag -r e -l seguiti dalla stringa che desideri abbinare e dalla directory che vuoi esaminare:

grep-rl MakeTechEasier ./sample

Puoi persino racchiudere il comando Grep in una sottoshell Bash per creare più condizioni per la corrispondenza del tuo testo. Ad esempio, la seguente riga di codice restituirà solo i file che contengono sia “Hello” che “MakeTechEasier” nella cartella “sample”:

grep-rl MakeTechEasier $(grep-rl Hello ./sample)

Trova l’opposto

Oltre a fare ricerche dirette, Grep può anche restituire i risultati che non corrispondono ai tuoi criteri iniziali. Anche se all’inizio potrebbe sembrare controintuitivo, questo può essere utile nei casi in cui è necessario evidenziare errori e anomalie dal tuo input di testo.

Per fare ciò, esegui Grep con -v insieme agli altri flag che desideri abilitare. Ad esempio, il seguente comando cercherà ricorsivamente in ogni file nella mia cartella “/etc/nginx” e restituirà tutte le righe che non contengono la stringa “nginx”:

grep-rv'nginx'/etc/nginx

Un terminale che mostra il flag invertito di Grep che corrisponde a tutto tranne che alla stringa target.

Parole e righe

Potrebbe anche essere utile dire a Grep di cercare parole o righe complete, invece di qualsiasi cosa contenente un certo modello. Questo è utile se stai abbinando una stringa di caratteri che è comune in molte parole. Ad esempio, abbinare la parola “it” restituirà molti falsi positivi poiché “it” è una stringa comune che puoi trovare nelle parole.

Per risolvere questo problema, puoi eseguire Grep con il flag -w seguito dalla parola che desideri abbinare:

cat it.txt |grep-w it

Un terminale che mostra il flag di corrispondenza dell'intera parola per Grep.

Invece di stampare ogni parola che contiene il modello, Grep stamperà solo la parola da sola. Fa la stessa cosa per le intere righe con il flag -x, quindi se stai cercando una frase o una singola riga in un file di configurazione, questo può essere davvero utile.

Aggiungere numeri di riga all’output di Grep

I numeri di riga sono una parte importante del debugging dei programmi e della correzione di bozze dei testi. Ti consentono di fare riferimento accuratamente alla posizione di una funzione o di una frase specifica, rendendo molto più veloce la correzione e la modifica.

In questo senso, Grep viene fornito con la possibilità di stampare i numeri di riga nel suo output predefinito. Per fare ciò, esegui il programma con il flag -n seguito dalla stringa che desideri abbinare:

grep-n main ./my-code.c

Con l’aiuto delle pipe UNIX, puoi anche modificare l’output di Grep e stampare solo i numeri di riga di ciò che stai cercando. Questo rende molto più pulito e più facile analizzare testi di grandi dimensioni:

grep-n Sed essay.txt |cut-f1-d :

FYI: Le pipe UNIX sono più di un semplice strumento per Grep. Scopri come automatizzare le tue attività di shell remote creando e utilizzando pipe SSH.

Utilizzare le regex estese con Grep

Grep utilizza il set di metacaratteri delle espressioni regolari di base (BRE) per abbinare e filtrare le stringhe di testo. Anche se di solito funziona per la maggior parte dei compiti, alcuni utenti potrebbero trovare questa funzione limitata, specialmente quando si lavora con gruppi di modelli.

Per affrontare questo problema, la maggior parte delle implementazioni di Grep fornisce il flag -E, che consente al programma di analizzare i metacaratteri delle espressioni regolari estese (ERE). Ad esempio, il seguente comando funzionerà solo con il flag -E:

printf"hello\nhellooooo\n"|grep-E .*o{2}$

Nota: la versione GNU di Grep utilizza alcune funzionalità ERE per impostazione predefinita. Tuttavia, è buona pratica utilizzare -E ogni volta che usi ERE per preservare la compatibilità con altri sistemi simili a UNIX.

Inoltre, Grep ha anche una modalità speciale che si libera completamente di tutte le funzioni Regex. Per utilizzare questa funzione, esegui il programma con il flag -F seguito dalla tua stringa semplice:

grep-F[MakeTechEasier] ./fixed.txt

Aggiungere righe adiacenti all’output di Grep

Uno dei punti di forza principali di Grep è mostrare dove appare del testo nel tuo file o flusso di input. Tuttavia, ci sono momenti in cui conoscere solo la posizione esatta di una stringa non aiuta quando si risolvono i problemi. Ad esempio, un registro di arresto anomalo di solito fornisce un contesto aggiuntivo prima di stampare il tradizionale messaggio “Segmentation Fault”.

Un modo per risolvere questo problema è eseguire Grep con il flag -C seguito dalla quantità di righe che desideri stampare intorno al tuo testo target. Il seguente comando stampa cinque righe prima e dopo la corrispondenza del tuo testo:

grep-C5'Hello' ./hello-sample.txt

Un terminale che mostra la capacità di Grep di stampare il contesto circostante di una stringa target.

Puoi anche personalizzare se Grep stampa solo il contesto precedente o successivo alla corrispondenza con i flag -B e -A. Ad esempio, il seguente comando stamperà le dieci righe precedenti dopo la tua stringa target:

grep-A10'Hello' ./hello-sample.txt

Un terminale che mostra Grep che stampa le 10 righe successive dopo la sua corrispondenza iniziale della stringa.

Con le basi di Grep e come usarlo per i tuoi compiti quotidiani sotto controllo, ora puoi fare il tuo primo passo nella comprensione della riga di comando e delle utilità principali di UNIX. Esplora di più di questo mondo molto vario e profondo imparando come funziona sed in Linux.

Immagine di credito: Alejandro Escamilla tramite Unsplash. Tutte le modifiche e gli screenshot di Ramces Red.