Questo tutorial si concentra sulla ricerca di testo nei file utilizzando il comando grep e le espressioni regolari.
Quando si lavora su un sistema Linux, trovare testo nei file è un compito molto comune svolto ogni giorno dagli amministratori di sistema.
Potresti voler cercare righe specifiche in un file di registro per risolvere i problemi dei server.
In alcuni casi, sei interessato a trovare azioni eseguite da utenti specifici o desideri limitare le righe di un file di grandi dimensioni a un paio di righe.
Fortunatamente per te, ci sono diversi modi per trovare il testo nei file su Linux ma il comando più popolare è il comando grep.
Sviluppato da Ken Thompson agli albori di Unix, grep (g cerca localmente una r egular e xpression e p strappare ) è utilizzato da oltre 45 anni dagli amministratori di sistema di tutto il mondo.
In questo tutorial, ci concentreremo sul comando grep e come può aiutarci a trovare efficacemente il testo nei file in tutto il nostro sistema.
Pronto?
Sintassi Grep su Linux
Come specificato sopra, per trovare testo nei file su Linux , devi usare il comando grep con la seguente sintassi
$ grep <option> <expression> <path>
Si noti che le opzioni e il percorso sono facoltativi.
Prima di elencare e dettagliare tutte le opzioni fornite da grep, disponiamo di un modo rapido per memorizzare la sintassi del comando grep.
Per ricordare la sintassi del comando grep, ricorda che grep può essere scritto come grEP il che significa che l'espressione viene prima del percorso.
Questo è un ottimo modo per ricordare la sintassi di grep e la sintassi di ricerca allo stesso tempo, ma la sintassi di ricerca è l'esatto opposto:il percorso prima e l'espressione dopo.
Esempi rapidi di grep
Esistono opzioni complesse che possono essere utilizzate con grep, ma iniziamo con una serie di esempi molto rapidi.
Elencare gli utenti utilizzando grep
Su Linux, come probabilmente già saprai, gli account utente sono elencati in un file specifico chiamato file passwd.
Per trovare l'account di root in un file specifico, inserisci semplicemente il tuo testo e il file in cui vuoi cercare.
$ grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
Un altro modo molto popolare di usare il comando grep è cercare un processo specifico sul tuo sistema Linux.
Processi di filtraggio tramite grep
Come spiegato in uno dei nostri tutorial precedenti, devi usare "ps comando ” per elencare tutti i processi attualmente in esecuzione sul tuo sistema.
Puoi reindirizzare il "ps ” comando con il “grep comando ” per filtrare i processi che ti interessano.
$ ps aux | grep <process>
Se sei interessato ai processi bash, ad esempio, puoi digitare il seguente comando
$ ps aux | grep bash
root 1230 0.0 0.0 23068 1640 tty1 S+ Jan11 0:00 -bash
user 2353 0.0 0.1 23340 5156 pts/0 Ss 03:32 0:00 -bash
user 2473 0.0 0.0 14856 1056 pts/0 S+ 03:45 0:00 grep --color=auto bash
user 6685 0.0 0.0 23140 1688 pts/2 Ss+ Nov09 0:00 bash
Nota :se non sei sicuro di come utilizzare le pipe su Linux, ecco una guida completa sul reindirizzamento di input e output.
Ispezione dei log del kernel Linux con grep
Un altro ottimo utilizzo del comando grep è quello di ispezionare l'anello del buffer del kernel Linux .
Questo è molto utilizzato durante l'esecuzione di operazioni di risoluzione dei problemi su sistemi Linux perché il kernel scriverà nel suo anello del buffer all'avvio o all'avvio.
Diciamo ad esempio che hai introdotto un nuovo disco nel tuo sistema e non sei sicuro del nome dato a questo nuovo disco.
Per scoprire queste informazioni, puoi utilizzare il file "dmesg ” e invialo tramite pipe al comando grep.
$ dmesg | grep -E sd.{1}
Opzioni comando Grep
Il comando grep è molto utile di per sé ma è ancora più utile se usato con le opzioni.
Il comando grep letteralmente ha un sacco di opzioni diverse.
Le sezioni seguenti serviranno da guida per utilizzare correttamente tali opzioni e verranno forniti esempi lungo il percorso.
Cerca una stringa specifica usando grep
In alcuni casi, potresti essere interessato a trovare una stringa o un testo molto specifico in un file.
Per limitare la ricerca del testo a una stringa specifica, devi utilizzare virgolette prima e dopo il termine di ricerca.
$ grep "This is a specific text" .
Per illustrare questa opzione, supponiamo che tu stia cercando un nome utente specifico sul tuo sistema.
Poiché molti nomi utente possono iniziare con lo stesso prefisso, devi cercare l'utente usando le virgolette.
$ grep "devconnected" /etc/passwd
Cerca nel testo usando le espressioni regolari
Una delle maggiori caratteristiche del comando grep è la capacità di cercare il testo usando espressioni regolari.
Le espressioni regolari sono sicuramente un ottimo strumento da padroneggiare:consentono agli utenti di cercare il testo in base a schemi come il testo che inizia con una lettera specifica o un testo che può essere definito come indirizzo email.
Grep supporta due tipi di espressioni regolari:di base e esteso espressioni regolari.
Espressioni regolari di base (BRE)
La principale differenza tra le espressioni regolari di base ed estese è il fatto che puoi utilizzare i simboli delle espressioni regolari con BRE (espressioni regolari di base), ma dovranno essere preceduti da una barra rovesciata.
I modelli di espressioni regolari più comuni sono descritti in dettaglio di seguito con esempi:
- ^ simbolo :chiamato anche simbolo dell'accento circonflesso, questo piccolo cappello viene utilizzato per definire l'inizio di una linea. Di conseguenza, qualsiasi testo dopo il simbolo di accento circonflesso sarà abbinato a righe che iniziano con questo testo.
Ad esempio, per trovare tutte le unità che iniziano con "sd" (chiamate anche dischi SCSI), puoi utilizzare il simbolo del cursore con grep.
$ lsblk | grep "^sb"
- $ simbolo :il simbolo del dollaro è l'opposto del simbolo del cursore, viene utilizzato per definire la fine della riga. Di conseguenza, il pattern matching si interromperà subito prima del segno del dollaro. Ciò è particolarmente utile quando desideri scegliere come target un termine specifico.
Per vedere tutti gli utenti che hanno la shell bash sul tuo sistema, puoi digitare il seguente comando
$ cat /etc/passwd | grep "bash$"
- . (simbolo del punto) :il simbolo del punto viene utilizzato per abbinare un singolo carattere in un'espressione regolare. Questo può essere particolarmente utile quando i termini di ricerca contengono le stesse lettere all'inizio e alla fine ma non nel mezzo.
Se, ad esempio, hai due utenti sul tuo sistema, uno chiamato "bob" e uno chiamato "bab", puoi trovare entrambi gli utenti utilizzando il simbolo del punto.
$ cat /etc/passwd | grep "b.b"
- [ ] (simbolo tra parentesi):questo simbolo viene utilizzato per abbinare solo un sottoinsieme di caratteri. Se vuoi abbinare solo i caratteri "a", "o" o "e", devi racchiuderli tra parentesi.
Tornando all'esempio “bob”, se vuoi limitare la tua ricerca a “bob” e “bab”, puoi digitare il seguente comando
$ cat /etc/passwd | grep "b[ao]b"
Utilizzando tutte le opzioni fornite in precedenza, è possibile isolare singole parole in un file:combinando il simbolo del cursore con il simbolo del dollaro.
$ grep "^word$" <file|path>
Fortunatamente per te, non devi digitare quei caratteri ogni volta che vuoi cercare voci di una sola parola.
Puoi utilizzare "-w ” invece.
$ grep -w <expression> <file|path>
Espressioni regolari estese (ERE)
Le espressioni regolari estese come indica il nome sono espressioni regolari che utilizzano espressioni più complesse per trovare una corrispondenza con le stringhe.
Puoi utilizzare espressioni regolari estese per creare un'espressione che, ad esempio, corrisponda a un indirizzo email.
Per trovare il testo nei file utilizzando le espressioni regolari estese, devi utilizzare l'opzione "-E".
$ grep -E <expression> <path>
Un ottimo utilizzo delle espressioni regolari estese è la possibilità di cercare più termini di ricerca, ad esempio.
Ricerca in più stringhe in un file
Per cercare più stringhe in un file, usa "-E ” e inserisci i diversi termini di ricerca separati da linee rette (che sta per operatori OR nelle espressioni regolari )
$ grep -E "text1|text2|text3" <path>
Tornando al nostro precedente esempio di grep, potresti trovare l'account root e l'account bob usando espressioni regolari estese.
$ grep -E "root|bob" /etc/passwd
Cerca gli indirizzi IP utilizzando grep
In alcuni casi, potresti voler isolare gli indirizzi IP in un unico file :l'uso di espressioni regolari estese è un ottimo modo per trovare facilmente gli indirizzi IP.
Molti siti Web diversi forniscono espressioni regolari pronte per l'uso:useremo questo per gli indirizzi IP.
"\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"
Come leggeresti questa espressione regolare?
Un indirizzo IP è composto da 4 numeri a 3 cifre separati da punti, questo è esattamente ciò che descrive questa espressione regolare.
([0-9]{1,3}\.){3} = 3 3-digits numbers separated by dots
[0-9]{1,3} = the last 3-digits number ending the IP address
Ecco come cercare gli indirizzi IP usando il comando grep
grep -E "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" <file|path>
Cerca gli indirizzi URL utilizzando grep
Allo stesso modo, è del tutto possibile cercare gli indirizzi URL in un file se si lavora quotidianamente con l'amministrazione del sito web.
Anche in questo caso, molti siti Web forniscono espressioni regolari per gli URL, ma utilizzeremo questa.
grep -E '(http|https)://[^/"]+' <file|path>
Cerca indirizzi email utilizzando grep
Infine, è possibile cercare indirizzi email utilizzando espressioni regolari estese.
Per trovare gli indirizzi email, utilizzerai la seguente espressione regolare
grep -E "\b[A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" <file|path>
Ora che hai visto come utilizzare le espressioni regolari estese con grep, vediamo come puoi trovare ricorsivamente del testo in un file usando le opzioni.
Trova il testo in modo ricorsivo con grep
Per trovare il testo in modo ricorsivo (ovvero esplorare ogni directory e i suoi figli) su Linux, devi usare "grep" con l'opzione "-r" (per ricorsivo)
$ grep -R <expression> <path>
Ad esempio, per cercare tutti i file contenenti la parola "log" nella directory /var/log, digitare
$ grep -R "log$" /var/log
Usando questo comando, è molto probabile che vedrai molte voci con autorizzazione negata.
Per ignorare le voci di autorizzazione negata, reindirizza l'output del tuo comando a /dev/null
$ grep -R "log$" /var/log 2> /dev/null
Per trovare il testo in modo ricorsivo, puoi anche utilizzare l'opzione "-d" con l'azione "ricorsiva".
$ grep -d recurse "log$" /var/log
La ricerca ricorsiva del testo può essere molto utile quando stai cercando di trovare file di configurazione specifici sul tuo sistema.
Stampa numeri di riga con grep
Come puoi vedere nei nostri esempi precedenti, siamo stati in grado di isolare le linee che corrispondono al modello specificato.
Inoltre, se i file contengono migliaia di righe, sarebbe doloroso identificare il file ma non il numero di riga.
Fortunatamente per te, l'opzione grep ha un'opzione per stampare i numeri di riga insieme alle diverse corrispondenze.
Per visualizzare i numeri di riga usando grep, usa semplicemente "-n opzione ".
$ grep -n <expression> <path>
Tornando al nostro esempio di elenco utenti, se vogliamo sapere su quale riga si trovano queste voci, digitiamo
$ grep -n -E "root|bob" /etc/passwd
Trova il testo con grep utilizzando l'opzione senza distinzione tra maiuscole e minuscole
In alcuni casi, potresti non essere sicuro che il testo sia scritto con maiuscolo o minuscolo lettere.
Fortunatamente per te, il comando grep ha un'opzione per cercare il testo nei file utilizzando un'opzione senza distinzione tra maiuscole e minuscole.
Per cercare del testo utilizzando l'opzione senza distinzione tra maiuscole e minuscole, usa semplicemente "-i opzione ".
$ grep -i <expression> <path>
Escludi pattern da grep
Grep viene utilizzato come un modo per identificare i file che contengono un file specifico, ma cosa succede se si desidera fare l'esatto contrario?
E se volessi trovare file che non contengono una stringa specifica sul tuo sistema Linux?
Questo è l'intero scopo dell'opzione di ricerca inversa di grep.
Per escludere i file contenenti una stringa specifica, utilizza "grep" con l'opzione "-v".
$ grep -v <expression> <file|path>
Come piccolo esempio, supponiamo che tu abbia tre file ma due di essi contengono la parola “log”.
Per escludere quei file, dovresti eseguire una corrispondenza invertita con l'opzione "-v".
Mostra i nomi dei file usando grep
In alcuni casi, non sei interessato a trovare il testo all'interno dei file, ma solo nei loro nomi di file.
Per stampare solo i nomi dei file e non il nome del file con l'output effettivo, utilizza l'opzione "-l".
$ grep -l <expression> <path>
Utilizzando il nostro esempio precedente, non otterremmo il contenuto del file, ma solo il nome del file.
Conclusione
In questo tutorial, hai imparato come trovare facilmente il testo nei file su Linux.
Hai imparato che puoi utilizzare molte opzioni diverse:espressioni regolari di base o più avanzate espressioni regolari (estese) se stai cercando di trovare una corrispondenza con indirizzi IP o numeri di telefono, ad esempio.
Hai anche scoperto che puoi eseguire ricerche inverse per trovare file non corrispondente a un modello specifico sul tuo sistema.
Se sei interessato all'amministrazione del sistema Linux, abbiamo una sezione completa ad essa dedicata sul sito Web, quindi assicurati di dare un'occhiata!