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.
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:
| famiglia | dove la trovi | caratteristica |
|---|---|---|
| GNU grep | Linux (Debian, Ubuntu, Arch, RHEL…) | la più ricca: -P, -r nativo, --include |
| BSD grep | macOS, FreeBSD, OpenBSD | più essenziale: niente -P, sintassi leggermente diversa |
| busybox grep | distro minimali, Alpine, router | molto 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.
La prima ricerca, dall'inizio
Il caso più semplice: cerchiamo una parola dentro un file. Creiamo un piccolo file di prova e proviamo subito.
$ 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:
$ 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.
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:
$ 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
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.