Cos'è GREP in Linux e come si utilizza

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.txtInoltre, puoi utilizzare questa funzione per cercare e trovare pezzi specifici di testo all’interno dei tuoi file di testo:
grep'word' sample.txt
Puoi anche utilizzare Grep con le pipe UNIX, consentendoti di unire più programmi in un unico comando:
cat sample.txt |grep''
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
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 .KDimentica 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”.

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
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' ./sampleDetto 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' ./sampleA 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 ./samplePuoi 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
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
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.cCon 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.txtAggiungere 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
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
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.