Sistemi simili a Linux e UNIX, tutte le informazioni sulla configurazione del sistema vengono archiviate e manipolate in formato testo normale. Quindi la ricerca del testo diventerebbe un'operazione molto comune per la modifica e l'analisi dei registri.
Il comando grep consente di cercare un testo o una stringa in un file o dalla console di output di un comando, per un termine o un modello corrispondente alle espressioni regolari. Quando grep trova una corrispondenza in una riga, copia i risultati sullo schermo, ad esempio stdout.
In questo tutorial impariamo come usare il comando grep con esempi pratici.
Comando Grep
Controlliamo la sintassi del comando grep prima di iniziare a spiegarne l'utilizzo.
grep [OPTIONS] PATTERN [FILE...]
Discuteremo in dettaglio le opzioni e i modelli di grep più comuni che possiamo utilizzare per la ricerca.
Come cercare una stringa in un file
Nell'esempio seguente grep cerca nel file /etc/passwd la stringa 'root' e reindirizza l'output a stdout.
$ grep "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
Cerca testo da più file
Puoi cercare testo specifico da più file usando il seguente comando:
$ grep "root" /etc/passwd /etc/group
/etc/passwd:root:x:0:0:root:/root:/bin/bash
/etc/passwd:operator:x:11:0:operator:/root:/sbin/nologin
/etc/group:root:x:0:root
/etc/group:bin:x:1:root,bin,daemon
/etc/group:daemon:x:2:root,bin,daemon
/etc/group:sys:x:3:root,bin,adm
/etc/group:adm:x:4:root,adm,daemon
/etc/group:disk:x:6:root
/etc/group:wheel:x:10:root
Ricerca Grep senza distinzione tra maiuscole e minuscole
Opzioni -i
cerca la stringa/il modello specificato senza distinzione tra maiuscole e minuscole.
Negli esempi seguenti, grep trova tutte le parole come "hal", "HAL" senza distinzione tra maiuscole e minuscole:
$ grep -i HAL /etc/passwd
halt:x:7:0:halt:/sbin:/sbin/halt
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
Ricerca ricorsiva
La ricerca ricorsiva si ottiene usando -r
opzione che cercherà ricorsivamente tutti i collegamenti simbolici che saltano i file. Se vuoi includere link simbolici usa -R
.
Nell'esempio seguente, il comando grep cercherà la stringa 'ngnix' in tutti i file all'interno di /var
directory.
$ grep -r nginx /var
Cerca una stringa nell'output del comando (stdout)
Puoi usare pipe l'output per un comando e grep per il pattern dal suo output.
Nell'esempio seguente sto cercando un file con il nome 'backup' usando il comando ls
$ ls | grep backup
Qui sto facendo più pipe e sto cercando il processo "docker" e "apache" dal comando ps.
$ ps -ef | grep docker | grep apache
Espressioni regolari nei file
Espressioni regolari è un modello da abbinare per ciascuna riga di input. Basic ed Extended sono le due espressioni regolari usate dal comando grep.
Espressione regolare di base
Per impostazione predefinita, grep interpreta il modello come un'espressione regolare di base.
Il simbolo ^ (caret) - Il modello che lo segue deve essere presente all'inizio di ogni riga. Nell'esempio seguente, la stringa ^welcome corrisponderà solo se si trova all'inizio di una riga.
$ grep “^welcome” filename
Espressione regolare estesa
Usa -E
( o --extended-regexp) se vuoi che grep la comprenda come un'espressione regolare estesa.
Il comando seguente estrarrà tutti i collegamenti da un file
$ grep –Eoi '<a[^>]+>.*</a>' filename
o
:per impostazione predefinita, grep stampa l'intera riga che contiene il modello di ricerca. Questa opzione indica al comando grep di stampare solo le parole corrispondenti anziché l'intera riga.
i
:questa opzione chiede al comando grep di ignorare il caso mentre corrisponde al modello.
Cerca una parola intera usando grep
Il -w
(word-regexp) il flag per grep farà corrispondere l'espressione data solo a parole intere.
$ grep -iw "samba" /etc/samba/smb.conf
# This is the main Samba configuration file. You should read the
# here. Samba has a huge number of configurable options (perhaps too
# For a step to step guide on installing, configuring and using samba,
# read the Samba-HOWTO-Collection. This may be obtained from:
Visualizza le righe dopo la corrispondenza della stringa
Il -A
opzione che visualizza il N
righe dopo la corrispondenza della stringa.
$ grep -A 2 "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
Visualizza le righe prima della corrispondenza della stringa
Possiamo usare -B
opzione per visualizzare N righe prima della stringa per un determinato file
$ grep -B 2 "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
--
news:x:9:13:news:/etc/news:
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
Cerca in più stringhe
Possiamo cercare più pattern o stringhe usando l'operatore OR |
e \|
. -E
(extended-regexp) controlla se è necessario eseguire l'escape di determinati caratteri speciali. -e
è rigorosamente la bandiera per indicare il modello con cui vuoi confrontare.
Esempio 1:utilizzo dell'opzione -E
$ ls | grep -E “li|ovo”
linux24
ovo8_linux24.sh
Oppure
$ grep -E "foo|bar" *.txt
Esempio 2:senza -E
$ ls | grep ‘li\|ovo’
linux24
ovo8_linux24.sh
Oppure
$ grep "foo\|soul\|bar" *.txt
Escludi file specifico dalla ricerca
Puoi usare l'opzione -v per ignorare la ricerca. Il comando seguente cercherà la stringa 'error' in tutti i file tranne 'syslog.log'
$ grep -r error * | grep -v ‘/\syslog.log/’
Conclusione
In questo tutorial abbiamo imparato come usare il comando grep per trovare il testo nei file. Spero che ti sia piaciuto leggere questo e per favore lascia i tuoi suggerimenti nella sezione commenti qui sotto.