$ grep — corso
Lezione 01 di 10

Cos'è grep e dove vive

Prima di scrivere il primo pattern conviene capire cosa stiamo usando: grep è un comando con quasi mezzo secolo di storia, esiste in più varianti, e su sistemi diversi non si comporta in modo identico.

Teoria

Un comando con una storia

Il nome grep è la trascrizione di un comando interno dell'editor ed degli anni '70: g/re/p, cioè globally search a regular expression and print. Lo estrasse Ken Thompson nel 1973 ai Bell Labs e da allora è in ogni Unix.

Oggi quando digiti grep stai in realtà usando una di tre famiglie diverse, e questo conta perché alcune opzioni esistono in una e non nell'altra:

famigliadove la trovicaratteristica
GNU grepLinux (Debian, Ubuntu, Arch, RHEL…)la più ricca: -P, -r nativo, --include
BSD grepmacOS, FreeBSD, OpenBSDpiù essenziale: niente -P, sintassi leggermente diversa
busybox grepdistro minimali, Alpine, routermolto ridotto: solo lo stretto necessario

Esistono anche varianti storiche dello stesso programma: egrep (oggi equivale a grep -E) e fgrep (uguale a grep -F, per cercare stringhe letterali). Sono ancora installate quasi ovunque, ma le versioni recenti di GNU le dichiarano obsolete: meglio prendere subito l'abitudine di scrivere grep -E e grep -F.

Pratica

La prima ricerca, dall'inizio

Il caso più semplice: cerchiamo una parola dentro un file. Creiamo un piccolo file di prova e proviamo subito.

~ — bash 01
$ cat > lista.txt <<'EOF'
mela
banana
ciliegia
mirtillo
melagrana
EOF

$ grep mela lista.txt
mela
melagrana

Grep ha trovato due righe, perché mela è contenuto anche dentro melagrana. È un comportamento che disorienta chi inizia: grep cerca sottostringhe, non parole intere — quello sarà il flag -w della prossima lezione.

Adesso vediamo dove si trova fisicamente sul sistema, e che versione abbiamo:

controllo versione 02
$ which grep
/usr/bin/grep

$ grep --version
grep (GNU grep) 3.11
Copyright (C) 2024 Free Software Foundation, Inc.

# su macOS la stessa cosa risponde diversamente:
$ grep --version
grep (BSD grep, GNU compatible) 2.6.0-FreeBSD

Se vedi GNU sei su Linux (o su un macOS con grep sostituito), se vedi BSD sei sul grep di default di macOS. Tieni questa informazione presente: tornerà a galla nella lezione 8, quando parleremo di PCRE.

Trucco

Su macOS, installa GNU grep accanto a quello di sistema

Apple non può aggiornare grep alle ultime versioni GNU per ragioni di licenza (GPLv3). Risultato: il grep di sistema su macOS è bloccato a una versione vecchia e priva di alcune opzioni che useremo, su tutte -P per le regex Perl-compatibili.

La soluzione standard è installare GNU grep via Homebrew. Verrà installato come ggrep per non sostituire quello di sistema:

macOS — installazione GNU grep 03
$ brew install grep
... installazione ...

$ ggrep --version
ggrep (GNU grep) 3.11

# vuoi che 'grep' chiami direttamente ggrep nella tua shell?
# aggiungi al tuo ~/.zshrc (o ~/.bashrc):
$ echo 'alias grep="ggrep"' >> ~/.zshrc
Attenzione: creare quell'alias rende i tuoi script non portabili: funzionano solo sulla tua macchina. Se scrivi shell script che condividi con altri, lascia grep come il grep di sistema e usa ggrep esplicitamente quando ti serve davvero PCRE.

Su Linux questo problema non esiste: GNU grep è già il grep di sistema. Ma sapere della distinzione ti farà risparmiare un'ora di confusione la prima volta che uno script copiato da Stack Overflow non funziona "senza motivo" su Mac.