16 Esempi di comandi grep per aiutarti nel mondo reale
Pubblicato: 2021-02-23grep, originariamente sviluppato per sistemi basati su Unix, è una delle utility a riga di comando più utilizzate nelle macchine Linux.
Il suo nome deriva da un altro comando simile nello strumento ed, ovvero g / re / p che sta per ricerca globale di un'espressione regolare e stampa le righe corrispondenti. grep fondamentalmente cerca un determinato modello o un'espressione regolare dall'input o dal file standard e stampa le righe che corrispondono ai criteri specificati. Viene spesso utilizzato per filtrare i dettagli non necessari durante la stampa solo delle informazioni richieste da file di registro di grandi dimensioni.
La potenza dell'espressione regolare combinata con le opzioni supportate in grep lo rende possibile.
Qui tratteremo alcuni dei comandi grep comunemente usati in diversi scenari dall'amministratore di sistema o dallo sviluppatore.
Quindi iniziamo…
Sintassi del comando grep
Il comando grep prevede un modello e argomenti facoltativi insieme a un elenco di file se utilizzato senza piping.
$ grep [options] pattern [files]
Un semplice esempio è:
$ grep my file.txt my_file $
Ricerca di più file
grep ti consente di cercare il modello dato non solo in uno ma in più file. Ecco come cercare uno schema in più file utilizzando il carattere jolly *
.
$ sudo grep -i err /var/log/messages*
Produzione:
$ sudo grep err /var/log/messages* /var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: Using IOAPIC for interrupt routing /var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11) /var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11) /var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11) /var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11) /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: Using IOAPIC for interrupt routing /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11) /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11) /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11) /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11) /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: BERT: Boot Error Record Table support is disabled. Enable it by using bert_enable as kernel parameter. /var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11) /var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11) /var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11) /var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11) /var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: BERT: Boot Error Record Table support is disabled. Enable it by using bert_enable as kernel parameter. /var/log/messages-20201227:Dec 27 19:11:21 centos7vm kernel: [drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message. /var/log/messages-20201227:Dec 27 19:11:21 centos7vm kernel: [drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message. $
Puoi osservare dall'output sopra che il nome del file viene stampato prima di stampare la riga corrispondente per indicare dove grep
trovato il modello dato.
Ricerca senza distinzione tra maiuscole e minuscole
grep propone di cercare un modello senza guardare il caso del modello. Usa -i
flag per dire a grep di ignorare maiuscole e minuscole.
$ grep -i [pattern] [file]
Produzione:
$ grep -i it text_file.txt This is a sample text file. It contains functionality. You can always use grep with any kind of data but it works best with text data. It supports numbers like 1, 2, 3 etc. as well as This is a sample text file. It's repeated two times. $
Ricerca di parole intere
Non è sempre che vogliamo una corrispondenza parziale, ma invece ci aspettiamo che grep corrisponda solo a una parola completa. Puoi farlo con -w
flag.
$ grep -w [pattern] [file]
Produzione:
$ grep -w is text_file.txt This is a sample text file. It contains This is a sample text file. It's repeated two times. $
Controlla il conteggio delle partite
A volte invece della linea effettivamente abbinata, abbiamo bisogno solo del conteggio delle corrispondenze riuscite effettuate da grep. Possiamo ottenere questo conteggio usando l'opzione -c
.
$ grep -c [pattern] [file]
Produzione:
$ grep -c is text_file.txt 2 $
Cerca nelle sottodirectory
Spesso è necessario cercare i file non solo nella directory di lavoro corrente ma anche nelle sottodirectory. grep ti consente di farlo facilmente con -r
flag.
$ grep -r [pattern] *
Produzione:
$ grep -r Hello * dir1/file1.txt:Hello One dir1/file2.txt:Hello Two dir1/file3.txt:Hello Three $
Come puoi osservare, grep attraversa ogni sottodirectory all'interno di una directory corrente ed elenca i file e le righe in cui viene trovata una corrispondenza.
Ricerca inversa
Se vuoi trovare qualcosa che non corrisponde a un determinato modello, grep consente di farlo con il flag -v
.
$ grep -v [pattern] [file]
Produzione:
$ grep This text_file.txt This is a sample text file. It contains This is a sample text file. It's repeated two times. $ grep -v This text_file.txt several lines to be used as part of testing grep functionality. You can always use grep with any kind of data but it works best with text data. It supports numbers like 1, 2, 3 etc. as well as alphabets and special characters like - + * # etc. $
È possibile confrontare l'output del comando grep
sullo stesso modello e file con e senza flag -v
. Con -v
, viene stampata qualsiasi riga che non corrisponde al modello.
Stampa numeri di riga
grep ti consente di stampare i numeri di riga insieme alle righe stampate, il che rende facile sapere dove si trova la riga nel file. Utilizzare l'opzione -n
come mostrato per ottenere i numeri di riga nell'output.
$ grep -n [pattern] [file]
Produzione:
$ grep -n This text_file.txt 1:This is a sample text file. It contains 7:This is a sample text file. It's repeated two times. $
Limita uscita grep
Per file di grandi dimensioni come log, ecc. L'output di grep può essere lungo e potresti aver bisogno solo di un numero fisso di righe nell'output invece di abbinare tutto. Possiamo usare – m[num]
per limitare le righe stampate di num. Ecco come usarlo:
$ grep -m[num] [pattern] [file]
Si noti come l'uso di -m
flag influisca sull'output di grep per lo stesso insieme di condizioni nell'esempio seguente:
$ grep It text_file.txt This is a sample text file. It contains It supports numbers like 1, 2, 3 etc. as well as This is a sample text file. It's repeated two times. $ grep -m2 It text_file.txt This is a sample text file. It contains It supports numbers like 1, 2, 3 etc. as well as $
Visualizza linee aggiuntive
Spesso abbiamo bisogno non solo delle righe che hanno uno schema corrispondente, ma anche di alcune righe sopra o sotto di esso per un migliore contesto.

È possibile stampare una riga sopra o sotto (o entrambe) una riga con un motivo utilizzando grep utilizzando i flag -A
, -B
o -C
con valore num
. Qui num
indica il numero di righe aggiuntive da stampare che è appena sopra o sotto la riga corrispondente. Questo è applicabile a tutte le corrispondenze che grep trova nel file o nell'elenco di file specificato.
$ grep -A[num] [pattern] [file]
O
$ grep -B[num] [pattern] [file]
O
$ grep -C[num] [pattern] [file]
Sotto l'output viene mostrato un normale output di grep così come l'output con flag -A
, -B
e -C
uno per uno. Nota come grep interpreta i flag e i loro valori e le modifiche nel rispettivo output. Con il flag -A1
, grep stampa 1 riga che segue subito dopo la riga corrispondente.
Allo stesso modo, con il flag -B1
, stampa 1 riga appena prima della riga corrispondente. Con il flag -C1
, stampa 1 riga che è prima e dopo la riga corrispondente.
$ grep numbers text_file.txt It supports numbers like 1, 2, 3 etc. as well as $ grep -A1 numbers text_file.txt It supports numbers like 1, 2, 3 etc. as well as alphabets and special characters like - + * # etc. $ grep -B1 numbers text_file.txt kind of data but it works best with text data. It supports numbers like 1, 2, 3 etc. as well as $ grep -C1 numbers text_file.txt kind of data but it works best with text data. It supports numbers like 1, 2, 3 etc. as well as alphabets and special characters like - + * # etc. $
Elenca i nomi dei file
Per stampare solo il nome dei file in cui si trova uno schema invece delle linee effettivamente abbinate, usa -l
flag.
$ grep -l [pattern] [file]
Ecco un esempio di esecuzione:
$ grep -l su *.txt file.txt text_file.txt $
Stampa linee esatte
A volte abbiamo bisogno di stampare linee che corrispondano esattamente a un dato modello, non a una parte di esso. grep consente a -x
flag di fare proprio questo.
$ grep -x [pattern] [file]
Nell'esempio seguente, file.txt contiene una riga con una sola parola "support" e come tale viene abbinata a grep con flag -x
ignorando le righe che possono contenere le parole "support" insieme ad altro testo.
$ grep -x support *.txt file.txt:support $
Corrispondenza stringa iniziale
Usando le espressioni regolari, possiamo trovare una stringa all'inizio di una riga. Ecco come farlo.
$ grep [options] "^[string]" [file]
Esempio:
$ grep It text_file.txt This is a sample text file. It contains It supports numbers like 1, 2, 3 etc. as well as This is a sample text file. It's repeated two times. $ grep ^It text_file.txt It supports numbers like 1, 2, 3 etc. as well as $
Osserva come l'uso del carattere ^
cambia l'output. ^
indica l'inizio della stringa e grep corrisponde a ^It
come qualsiasi riga che inizia con la parola It
. Racchiudere tra virgolette può aiutare quando il modello contiene spazi ecc.
Corrispondenza stringa finale
Un'altra espressione regolare utile comune è quella di abbinare la fine del modello di riga.
$ grep [options] "[string]$" [file]
Esempio:
$ grep "\." text_file.txt This is a sample text file. It contains functionality. You can always use grep with any kind of data but it works best with text data. It supports numbers like 1, 2, 3 etc. as well as alphabets and special characters like - + * # etc. This is a sample text file. It's repeated two times. $ grep "\.$" text_file.txt kind of data but it works best with text data. alphabets and special characters like - + * # etc. This is a sample text file. It's repeated two times. $
Abbiamo cercato di abbinare un file .
carattere alla fine della riga. Poiché il punto (.) è un carattere di significato speciale, è necessario eseguirne l'escape con il carattere \
. Ancora una volta notate come varia l'output quando combiniamo solo .
carattere e quando usiamo $
per istruire grep in modo che corrisponda solo alle righe che terminano con .
(non quelli che possono contenerlo ovunque nel mezzo).
Usa file modello
Potrebbero esserci situazioni in cui hai un elenco complesso di schemi che usi spesso. Invece di scriverlo ogni volta, puoi specificare un elenco di modelli in un file e usarlo con il flag -f
. Il file deve contenere un modello per riga.
$ grep -f [pattern_file] [file_to_match]
Nel nostro esempio, abbiamo creato nomi di file pattern pattern.txt
con i seguenti contenuti:
$ cat pattern.txt This It $
Per usarlo, usa -f
flag.
$ grep -f pattern.txt text_file.txt This is a sample text file. It contains It supports numbers like 1, 2, 3 etc. as well as This is a sample text file. It's repeated two times. $
Specifica più modelli
grep consente di specificare più modelli utilizzando il flag -e
.
$ grep -e [pattern1] -e [pattern2] -e [pattern3]...[file]
Esempio:
$ grep -e is -e It -e to text_file.txt This is a sample text file. It contains several lines to be used as part of testing grep It supports numbers like 1, 2, 3 etc. as well as This is a sample text file. It's repeated two times. $
Specifica espressioni regolari estese
grep supporta anche le espressioni regolari estese o ERE utilizzando il flag -E
. Questo è simile al comando egrep
in Linux.
L'uso di ERE ha un vantaggio quando vuoi trattare i meta-caratteri così come sono e non vuoi sostituirli come stringhe come grep. Questo ti dà una maggiore flessibilità in termini di fuga da loro come siamo tenuti a fare nel caso di grep. Detto questo, usare -E
con grep equivale al comando egrep
.
$ grep -E '[Extended RegEx]' [file]
Ecco un utilizzo di ERE in cui vogliamo stampare righe che non sono commentate o vuote. Ciò è particolarmente utile per trovare qualcosa in file di configurazione di grandi dimensioni. Ho inoltre utilizzato -v
flag per NON stampare le righe che corrispondono al pattern '^(#|$)'
.
$ sudo grep -vE '^(#|$)' /etc/ssh/sshd_config HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_ecdsa_key HostKey /etc/ssh/ssh_host_ed25519_key SyslogFacility AUTHPRIV AuthorizedKeysFile .ssh/authorized_keys PasswordAuthentication yes ChallengeResponseAuthentication no GSSAPIAuthentication yes GSSAPICleanupCredentials no UsePAM yes X11Forwarding yes AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE AcceptEnv XMODIFIERS Subsystem sftp /usr/libexec/openssh/sftp-server $
Conclusione
Gli esempi di cui sopra sono solo la punta dell'iceberg. grep supporta una gamma di opzioni e può essere uno strumento molto utile nelle mani di una persona che sa come usarlo efficacemente. Non solo possiamo utilizzare gli esempi sopra riportati, ma combinarli in modi diversi per ottenere ciò di cui abbiamo bisogno.
Fare riferimento alla sua pagina man per saperne di più.
$ man grep
Successivamente, scopri gli esempi di comandi SFTP.