Ricerca nel sito web

Come utilizzare grep per cercare stringhe nei file sulla shell Linux


Il comando GREP: una panoramica

Il comando grep, che sta per stampa di espressioni regolari globali, è uno dei comandi più versatili in un ambiente terminale Linux. Grep è un programma estremamente potente che consente all'utente di selezionare e ordinare l'input secondo regole complesse, il che lo rende una parte molto popolare di numerose catene di comandi.

Il comando grep viene utilizzato principalmente per cercare in un testo o in un file le righe che contengono una corrispondenza con le parole/stringhe specificate. Per impostazione predefinita, grep visualizza le righe corrispondenti e può essere utilizzato per cercare righe di testo che corrispondono a una o più espressioni regolari e restituisce solo le righe corrispondenti.

Prerequisiti

Il comando grep fa parte delle utilità di base di qualsiasi distribuzione Linux, quindi viene preinstallato su qualsiasi distribuzione Linux per impostazione predefinita, come AlmaLinux, CentOS, Debian, Linux Mint, Ubuntu, RHEL e RockyLinux.

La sintassi di base del comando grep

La sintassi di base del comando grep è la seguente:

grep 'word' filename
grep 'word' file1 file2 file3
grep 'string1 string2'  filename
cat otherfile | grep 'something'
command | grep 'something'
command option1 | grep 'data'
grep --color 'data' fileName

Come utilizzare il comando grep per cercare in un file

Nel primo esempio cercherò l'utente "tom" nel file passwd di Linux. Per cercare nel file /etc/passwd l'utente "tom", è necessario inserire il seguente comando:

grep tom /etc/passwd

Di seguito è riportato l'output di esempio:

tom:x:1000:1000:tom,,,:/home/tom:/bin/bash

Hai la possibilità di indicare a grep di ignorare le maiuscole e minuscole, ovvero di abbinare abc, Abc, ABC e tutte le possibili combinazioni con l'opzione -i come mostrato di seguito:

grep -i "tom" /etc/passwd

Uso ricorsivo di grep

Se hai molti file di testo in una gerarchia di directory, ad esempio i file di configurazione di Apache in /etc/apache2/ e desideri trovare il file in cui è definito un testo specifico, utilizza l'opzione -r del comando grep per fai una ricerca ricorsiva Ciò eseguirà un'operazione di ricerca ricorsiva attraverso i file per la stringa "197.167.2.9" (come mostrato di seguito) nella directory /etc/apache2/ e tutte le sue sottodirectory:

grep -r "mydomain.com" /etc/apache2/

In alternativa è possibile utilizzare il seguente comando:

grep -R "mydomain.com" /etc/apache2/

Di seguito sono riportati gli output di esempio per una ricerca simile su un server Nginx:

grep -r "mydomain.com" /etc/nginx/
/etc/nginx/sites-available/mydomain.com.vhost:        if ($http_host != "www.mydomain.com") {

Qui vedresti il risultato per miodominio.com su una riga distinta preceduta dal nome del file (ad esempio /etc/nginx/sites-available/miodominio.com.vhost) in cui è stato trovato. L'inclusione dei nomi dei file nei dati di output può essere facilmente eliminata utilizzando l'opzione -h (come spiegato di seguito): grep -h -R "miodominio.com" /etc/nginx/. Di seguito è riportato l'output di esempio:

grep -r "mydomain.com" /etc/nginx/
if ($http_host != "www.mydomain.com") {

Usare grep per cercare solo parole

Quando cerchi abc, grep corrisponderà a tutti i tipi di cose, vale a dire kbcabc, abc123, aarfbc35 e molte altre combinazioni senza obbedire ai limiti delle parole. Puoi forzare il comando grep a selezionare solo quelle righe che contengono corrispondenze per formare parole intere (quelle che corrispondono solo alla parola abc), come mostrato di seguito:

grep -w "abc" file.txt

Esempio :

Usare grep per cercare due parole diverse

Per cercare due parole diverse è necessario utilizzare il comando egrep come mostrato di seguito:

egrep -w 'word1|word2' /path/to/file

Contare le righe per le parole corrispondenti

Il comando grep ha la capacità di riportare il numero di volte in cui un particolare modello è stato abbinato per ciascun file utilizzando l'opzione -c (count) (come mostrato di seguito):

grep -c 'word' /path/to/file

Inoltre, gli utenti possono utilizzare l'opzione '-n' che precede ciascuna riga di output con il numero della riga nel file di testo da cui è stata ottenuta (come mostrato di seguito):

grep -n 'root' /etc/passwd

Di seguito sono riportati gli output di esempio:

1:root:x:0:0:root:/root:/bin/bash

Grep inverte la corrispondenza

Gli utenti possono utilizzare l'opzione -v per stampare inverte la corrispondenza, il che significa che corrisponderà solo alle righe che non contengono la parola specificata. Ad esempio, stampa tutte le righe che non contengono la parola par utilizzando il seguente comando:

grep -v par /path/to/file

Come elencare solo i nomi dei file corrispondenti

È necessario utilizzare l'opzione -l per elencare i nomi dei file il cui contenuto menziona una parola particolare, ad esempio la parola 'primario', utilizzando il seguente comando:

grep -l 'primary' *.c

Infine, hai la possibilità di obbligare grep a visualizzare l'output in colori specifici utilizzando il seguente comando:

grep --color root /etc/passwd

Di seguito sono riportati gli output di esempio:

Come fare in modo che il comando grep gestisca più modelli di ricerca

Potrebbero esserci situazioni in cui potresti voler cercare più modelli in un dato file (o insieme di file). In tali scenari, dovresti utilizzare l'opzione della riga di comando '-e' fornita da grep.

Ad esempio, supponiamo di voler cercare le parole "how", "to" e "forge" in tutti i file di testo presenti nella directory di lavoro corrente, ecco come puoi farlo:

grep -e how -e to -e forge *.txt

Ecco il comando in azione:

L'opzione della riga di comando '-e' aiuta anche negli scenari in cui il modello inizia con un trattino (-). Ad esempio, se desideri cercare "-how", il comando seguente non sarà utile:

grep -how *.txt

È quando usi l'opzione -e della riga di comando, il comando capisce esattamente cosa stai cercando di cercare in questo caso:

grep -e -how *.txt

Ecco entrambi i comandi in azione:

Come limitare l'output grep a un particolare numero di righe

Nel caso in cui desideri limitare l'output di grep a un particolare numero di righe, puoi farlo utilizzando l'opzione della riga di comando '-m'. Ad esempio, supponiamo di voler cercare la parola "come" in testfile1.txt che contiene le seguenti righe:

Ma il requisito è che grep interrompa la ricerca dopo che sono state trovate 3 righe contenenti il modello cercato. Quindi, per fare ciò, puoi eseguire il seguente comando:

grep "how" -m3 testfile1.txt

Ecco il comando in azione:

Andando avanti, ecco cosa dice la pagina man del comando:

If the input is standard input from a regular file, and NUM matching lines are output, grep ensuresthat the standard input is positioned to just after the last matching line before exiting, regardless of the presence of trailing context lines. This enables a calling process to resume a search.

Quindi, ad esempio, se disponi di uno script bash con un loop e desideri recuperare una corrispondenza per ogni iterazione del loop, l'utilizzo di 'grep -m1' sarà sufficiente.

Come fare in modo che grep ottenga modelli dal file

Se lo desideri, puoi anche fare in modo che il comando grep ottenga modelli da un file. L'opzione della riga di comando -f dello strumento ti consente di farlo.

Ad esempio, supponiamo di voler cercare in tutti i file .txt nella directory corrente le parole "come" e "a", ma di voler fornire queste stringhe di input tramite un file denominato, ad esempio, "input", ecco come puoi Fai questo:

grep -f input *.txt

Ecco il comando in azione:

Come fare in modo che grep visualizzi solo quelle righe che corrispondono completamente al modello di ricerca

Finora abbiamo visto che, per impostazione predefinita, grep corrisponde e visualizza righe complete che contengono modelli di ricerca. Ma se il requisito è fare in modo che grep visualizzi solo quelle righe che corrispondono completamente al modello cercato, allora è possibile farlo utilizzando l'opzione della riga di comando '-x'.

Ad esempio, supponiamo che il file testfile1.txt contenga le seguenti righe:

E lo schema che vuoi cercare è "come stai?". Pertanto, per assicurarti che grep visualizzi solo le righe che corrispondono completamente a questo modello, utilizzalo nel modo seguente:

grep -x "how are you?" *.txt

Ecco il comando in azione:

Come forzare grep a non visualizzare nulla nell'output

Potrebbero esserci situazioni in cui non è necessario il comando grep per produrre nulla nell'output. Vuoi invece solo sapere se è stata trovata o meno una corrispondenza in base allo stato di uscita del comando. Ciò può essere ottenuto utilizzando l'opzione della riga di comando -q.

Mentre l'opzione -q disattiva l'output, lo stato di uscita dello strumento può essere confermato da 'echo $?' comando. Nel caso di grep, il comando esce con lo stato '0' quando ha esito positivo (ovvero, è stata trovata una corrispondenza), mentre esce con lo stato '1' quando non è stata trovata alcuna corrispondenza.

La seguente schermata mostra sia gli scenari riusciti che quelli non riusciti:

Come fare in modo che grep visualizzi il nome dei file che non contengono pattern di ricerca

Per impostazione predefinita, il comando grep visualizza il nome dei file contenenti il modello di ricerca (così come le righe corrispondenti). Questo è abbastanza logico, poiché è ciò che ci si aspetta da questo strumento. Tuttavia, potrebbero esserci casi in cui il requisito potrebbe essere quello di ottenere i nomi dei file che non contengono il modello cercato.

Ciò è possibile anche con grep: l'opzione -L te lo consente. Quindi, ad esempio, per trovare tutti quei file di testo nella directory corrente che non contengono la parola "come", puoi eseguire il seguente comando:

grep -L "how" *.txt

Ecco il comando in azione:

Come eliminare i messaggi di errore prodotti da grep

Se lo desideri, puoi anche forzare grep a disattivare tutti i messaggi di errore visualizzati nell'output. Questo può essere fatto utilizzando l'opzione della riga di comando -s. Ad esempio, considera il seguente scenario in cui grep produce un errore/avviso relativo alla directory incontrata:

Quindi, in questo tipo di scenario, l'opzione della riga di comando -s aiuta. Vedi sotto.

Quindi puoi vedere che l'errore/avviso è stato disattivato.

Come fare in modo che grep cerchi ricorsivamente le directory

Come risulta chiaramente dall'esempio utilizzato al punto precedente, il comando grep non esegue una ricerca ricorsiva per impostazione predefinita. Per assicurarti che la tua ricerca grep sia ricorsiva, usa l'opzione -d della riga di comando e passagli il valore "recurse".

grep -d recurse "how" *

Nota1: il messaggio di errore/avviso relativo alla directory di cui abbiamo discusso nel punto precedente può anche essere disattivato utilizzando l'opzione -d: tutto ciò che devi fare è passargli il valore 'skip' .

Nota 2: utilizza l'opzione '--exclude-dir=[DIR]' per escludere le directory che corrispondono al modello DIR dalle ricerche ricorsive.

Come fare in modo che grep termini i nomi dei file con il carattere NULL

Come abbiamo già discusso, l'opzione -l della riga di comando di grep viene utilizzata quando si desidera che lo strumento visualizzi solo i nomi dei file nell'output. Per esempio:

Ora, quello che dovresti sapere è che ogni nome nell'output sopra è separato/terminato da un carattere di nuova riga. Ecco come puoi verificarlo:

Reindirizzare l'output su un file, quindi stampare il contenuto del file:

Quindi l'output del comando cat conferma la presenza di un carattere di nuova riga tra i nomi dei file.

Ma come forse già saprai, anche il carattere di nuova riga può far parte del nome di un file. Pertanto, quando si ha a che fare con casi in cui i nomi di file contengono una nuova riga e sono separati/terminati anche da una nuova riga, diventa difficile lavorare sull'output grep (specialmente quando si accede all'output tramite uno script).

Sarebbe bene se il carattere di separazione/terminazione non fosse un ritorno a capo. Bene, sarai felice di sapere che grep fornisce un'opzione della riga di comando -Z che assicura che i nomi dei file siano seguiti da un carattere NULL e non da un fine riga.

Quindi, nel nostro caso, il comando diventa:

grep -lZ "how" *.txt

Ecco come abbiamo confermato la presenza del carattere NULL:

Di seguito è riportata un'opzione della riga di comando correlata che dovresti conoscere:

 -z, --null-data
Treat the input as a set of lines, each terminated by a zero byte (the ASCII NUL character) insteadof a newline. Like the -Z or --null option, this option can be used with commands like sort -z to process arbitrary file names.

Come utilizzare GREP per trovare errori nei file di registro

Grep è il coltellino svizzero dell'amministratore Linux quando si tratta di eseguire il debug degli errori nei servizi. La maggior parte dei servizi Linux dispone di file di registro in cui segnalano gli errori. Questi file di registro possono essere enormi e grep è un comando versatile e veloce per cercare ad es. un indirizzo IP di un sistema di connessione, una stringa di errore o l'indirizzo e-mail di un utente di posta interessato nel mail.log.

Esempi:

Cerca connessioni relative a un indirizzo email specifico, qui "[email " nel file mail.log di un server.

grep [email  /var/log/mail.log

Risultato:

Nov 17 09:33:22 mail dovecot: pop3-login: Login: user=<[email >, method=PLAIN, rip=192.168.0.112, lip=78.46.229.46, mpid=17596, TLS, session=<3uoa5ffQovld3Uep>
Nov 17 09:33:23 mail dovecot: pop3([email )<17596><3uoa5ffQovld3Uep>: Disconnected: Logged out top=0/0, retr=1/6647, del=1/1, size=6630
Nov 17 09:34:14 mail dovecot: pop3-login: Login: user=<[email >, method=PLAIN, rip=192.168.0.112, lip=78.46.229.46, mpid=17673, TLS, session=<fIIx6PfQkuBd3Uep>
Nov 17 09:34:14 mail dovecot: pop3([email )<17673><fIIx6PfQkuBd3Uep>: Disconnected: Logged out top=0/0, retr=0/0, del=0/0, size=0
Nov 17 09:35:40 mail dovecot: pop3-login: Login: user=<[email >, method=PLAIN, rip=192.168.0.112, lip=78.46.229.46, mpid=17868, TLS, session=<bd5L7ffQPsld3Uep>
Nov 17 09:35:40 mail dovecot: pop3([email )<17868><bd5L7ffQPsld3Uep>: Disconnected: Logged out top=0/0, retr=0/0, del=0/0, size=0
Nov 17 09:35:58 mail dovecot: pop3-login: Login: user=<[email >, method=PLAIN, rip=192.168.0.112, lip=78.46.229.46, mpid=17964, TLS, session=<sbpn7vfQevpd3Uep>
Nov 17 09:35:58 mail dovecot: pop3([email )<17964><sbpn7vfQevpd3Uep>: Disconnected: Logged out top=0/0, retr=0/0, del=0/0, size=0
Nov 17 09:36:16 mail postfix/smtpd[6932]: NOQUEUE: reject: RCPT from unknown[1.2.3.4]: 504 5.5.2 <1.2.3.4>: Helo command rejected: need fully-qualified hostname; from=<[email > to=<[email > proto=ESMTP helo=<1.2.3.4>

Per monitorare continuamente un file di registro per le connessioni per questo indirizzo email, combina i comandi tail e grep come questo:

tail -f /var/log/mail.log | grep [email 

Per uscire dalla funzione orologio, premere i tasti [strg] + c.

Altri esempi di comandi GREP

Nel nostro secondo tutorial sui comandi GREP, puoi trovare ancora più esempi di come utilizzare questo comando Linux.

  • Come eseguire la ricerca di pattern nei file utilizzando Grep

Articoli correlati: