3.2 Lezione 2
Certificazione: |
Linux Essentials |
---|---|
Versione: |
1.6 |
Argomento: |
3 Il Potere della Command Line |
Obiettivo: |
3.2 Ricerca ed Estrazione di Dati dai File |
Lezione: |
2 di 2 |
Introduzione
In questa lezione esamineremo gli strumenti utilizzati per manipolare i testi. Questi strumenti vengono utilizzati frequentemente dagli amministratori di sistema o dai programmi per monitorare o identificare automaticamente informazioni ricorrenti specifiche.
Cercare all’interno dei File con grep
Il primo strumento di cui parleremo in questa lezione è il comando grep
, acronimo di “global regular expression print”; la sua funzionalità principale è la ricerca di uno specifico pattern all’interno dei file. Il comando restituisce le righe contenenti il pattern specificato, evidenziato in rosso.
$ grep bash /etc/passwd root:x:0:0:root:/root:/bin/bash user:x:1001:1001:User,,,,:/home/user:/bin/bash
grep
, come la maggior parte dei comandi, può anche modificare il suo comportamento base a seconda delle opzioni utilizzate. Ecco le più comuni:
-i
-
la ricerca non fa distinzione tra lettere maiuscole e minuscole
-r
-
la ricerca è ricorsiva (cerca in tutti i file all’interno della directory specificata e delle sue sottodirectory)
-c
-
la ricerca conta il numero di corrispondenze trovate
-v
-
inverte la ricerca, restituendo le righe che non hanno corrispondenza con i termini di ricerca
-E
-
attiva le espressioni regolari estese (necessarie per alcuni dei meta-caratteri più avanzati come
|
,+
e?
)
grep
ha molte altre opzioni utili. Consulta la pagina man per saperne di più.
Espressioni Regolari
Il secondo strumento è molto potente. Viene utilizzato per descrivere frammenti di testo all’interno dei file, detti anche espressioni regolari. Le espressioni regolari sono estremamente utili per estrarre dati da file di testo attraverso la costruzione di pattern. Sono comunemente usati all’interno di script o nella programmazione con linguaggi di alto livello, come Perl o Python.
Quando si lavora con le espressioni regolari è molto importante tenere presente che conta ogni carattere e che il pattern viene scritto con lo scopo di trovare una corrispondenza con una specifica sequenza di caratteri, nota anche come stringa. La maggior parte dei pattern utilizza i normali simboli ASCII: lettere, cifre, punteggiatura o altri simboli, ma può anche utilizzare caratteri Unicode per indicare la corrispondenza con qualsiasi altro tipo di testo.
Il seguente elenco indica i meta-caratteri delle espressioni regolari utilizzati per formare i pattern.
.
-
Corrisponde a qualsiasi singolo carattere (tranne il carattere di nuova riga)
[abcABC]
-
Corrisponde a qualsiasi carattere all’interno delle parentesi
[^abcABC]
-
Corrisponde a qualsiasi carattere tranne quelli racchiusi tra parentesi
[a-z]
-
Corrisponde a qualsiasi carattere nell’intervallo indicato
[^a-z]
-
Corrisponde a qualsiasi carattere tranne quelli nell’intervallo indicato
sun|moon
-
Trova una qualsiasi delle stringhe indicate
^
-
Inizio di una riga
$
-
Fine di una riga
Tutte le funzionalità delle espressioni regolari possono essere implementate anche in grep
. Puoi notare che nell’esempio precedente la parola non è racchiusa tra virgolette doppie. Per evitare che la shell interpreti i meta-caratteri, si consiglia di inserire i pattern più complessi tra virgolette doppie (" "). All’atto pratico, utilizzeremo le virgolette doppie durante l’implementazione delle espressioni regolari. Le altre virgolette mantengono la loro normale funzionalità, come discusso nelle lezioni precedenti.
I prossimi esempi evidenziano il funzionamento delle espressioni regolari. Avremo bisogno di dati all’interno del file: pertanto, la prossima serie di comandi aggiungerà semplicemente stringhe diverse al file text.txt
.
$ echo "aaabbb1" > text.txt $ echo "abab2" >> text.txt $ echo "noone2" >> text.txt $ echo "class1" >> text.txt $ echo "alien2" >> text.txt $ cat text.txt aaabbb1 abab2 noone2 class1 alien2
Il primo esempio mostra una combinazione di ricerche all’interno del file senza e con le espressioni regolari. Per comprendere appieno le espressioni regolari, è molto importante mostrare la differenza tra le due ricerche. Il primo comando cerca la stringa esatta in un qualsiasi punto della riga, mentre il secondo comando cerca gli insiemi di caratteri che contengono uno qualsiasi dei caratteri tra parentesi. Pertanto i risultati dei comandi saranno diversi.
$ grep "ab" text.txt aaabbb1 abab2 $ grep "[ab]" text.txt aaabbb1 abab2 class1 alien2
La seconda serie di esempi mostra l’utilizzo dei meta-caratteri di inizio e fine riga. È molto importante sottolineare la necessità di posizionare i 2 caratteri al posto giusto all’interno dell’espressione. Quando si specifica l’inizio della riga, il meta-carattere deve essere posizionato prima dell’espressione, mentre quando si specifica la fine della riga, il meta-carattere deve essere posizionato dopo l’espressione.
$ grep "^a" text.txt aaabbb1 abab2 alien2 $ grep "2$" text.txt abab2 noone2 alien2
Oltre ai meta-caratteri spiegati sopra, le espressioni regolari hanno anche meta-caratteri che consentono la moltiplicazione del pattern precedente:
*
-
Zero o più occorrenze del pattern precedente
+
-
Una o più occorrenze del pattern precedente
?
-
Zero o una occorrenza del pattern precedente
In base ai meta-caratteri moltiplicatori, il comando seguente ricerca una stringa che contenga ab
, un singolo carattere e uno o più dei caratteri trovati in precedenza. Il risultato mostra che grep
ha trovato la stringa aaabbb1
(la parte per la quale si ha corrispondenza è abbb
) e la stringa abab2
. Poiché il carattere +
è un carattere delle espressioni regolari estese, dobbiamo passare l’opzione -E
al comando grep
.
$ grep -E "ab.+" text.txt aaabbb1 abab2
Gran parte dei meta-caratteri sono autoesplicativi, ma all’inizio possono risultare un po' complicati. Gli esempi precedenti rappresentano una piccola parte delle funzionalità delle espressioni regolari: prova tutti i meta-caratteri della tabella sopra riportata per capire meglio come funzionano.
Esercizi Guidati
Utilizzando grep
e il file /usr/share/hunspell/en_US.dic
, trova le righe che corrispondono ai seguenti criteri:
-
Tutte le righe che contengono la parola
cat
in un qulunque punto della riga. -
Tutte le righe che non contengono nessuno dei seguenti caratteri:
sawgtfixk
. -
Tutte le righe che iniziano con 3 lettere qualsiasi e la parola
dig
. -
Tutte le righe che finiscono con almeno una
e
. -
Tutte le righe che contengono una delle seguenti parole:
org
,kay
otuna
. -
Il numero delle righe che iniziano con una o nessuna
c
seguita dalla stringaati
.
Esercizi Esplorativi
-
Individua l’espressione regolare che ha corrispondenza con le parole nella riga “Include” e non ha corrispondenza con quelle nella riga “Esclude”:
-
Include:
pot
,spot
,apot
Esclude:
potic
,spots
,potatoe
-
Include:
arp99
,apple
,zipper
Esclude:
zoo
,arive
,attack
-
Include:
arcane
,capper
,zoology
Esclude:
air
,coper
,zoloc
-
Include:
0th/pt
,3th/tc
,9th/pt
Esclude:
0/nm
,3/nm
,9/nm
-
Include:
Hawaii
,Dario
,Ramiro
Esclude:
hawaii
,Ian
,Alice
-
-
Quale altro utile comando è comunemente usato per cercare all’interno dei file? Quali funzionalità aggiuntive ha?
-
Scegli uno degli esempi della lezione precedente e, con l’aiuto di
grep
, prova a cercare un pattern specifico all’interno dell’output del comando.
Sommario
In questa lezione hai imparato:
-
I meta-caratteri delle espressioni regolari;
-
Come creare pattern con le espressioni regolari;
-
Come cercare all’interno dei file.
Comandi utilizzati negli esercizi:
grep
-
Cerca caratteri o stringhe all’interno di un file
Risposte agli Esercizi Guidati
Utilizzando grep
e il file /usr/share/hunspell/en_US.dic
, trova le righe che corrispondono ai seguenti criteri:
-
Tutte le righe che contengono la parola
cat
in un qulunque punto della riga.$ grep "cat" /usr/share/hunspell/en_US.dic Alcatraz/M Decatur/M Hecate/M ...
-
Tutte le righe che non contengono nessuno dei seguenti caratteri:
sawgtfixk
.$ grep -v "[sawgtfixk]" /usr/share/hunspell/en_US.dic 49269 0/nm 1/n1 2/nm 2nd/p 3/nm 3rd/p 4/nm 5/nm 6/nm 7/nm 8/nm ...
-
Tutte le righe che iniziano con 3 lettere qualsiasi e la parola
dig
.$ grep "^...dig" /usr/share/hunspell/en_US.dic cardigan/SM condign predigest/GDS ...
-
Tutte le righe che finiscono con almeno una
e
.$ grep -E "e+$" /usr/share/hunspell/en_US.dic Anglicize Anglophobe Anthropocene ...
-
Tutte le righe che contengono una delle seguenti parole:
org
,kay
otuna
.$ grep -E "org|kay|tuna" /usr/share/hunspell/en_US.dic Borg/SM George/MS Tokay/M fortunate/UY ...
-
Il numero delle righe che iniziano con una o nessuna
c
seguita dalla stringaati
.$ grep -cE "^c?ati" /usr/share/hunspell/en_US.dic 3
Risposte agli Esercizi Esplorativi
-
Individua l’espressione regolare che ha corrispondenza con le parole nella riga “Include” e non ha corrispondenza con quelle nella riga “Esclude”:
-
Include:
pot
,spot
,apot
Esclude:
potic
,spots
,potatoe
Soluzione:
pot$
-
Include:
arp99
,apple
,zipper
Esclude:
zoo
,arive
,attack
Soluzione:
p+
-
Include:
arcane
,capper
,zoology
Esclude:
air
,coper
,zoloc
Soluzione:
arc|cap|zoo
-
Include:
0th/pt
,3th/tc
,9th/pt
Esclude:
0/nm
,3/nm
,9/nm
Soluzione:
[0-9]th.+
-
Include:
Hawaii
,Dario
,Ramiro
Esclude:
hawaii
,Ian
,Alice
Soluzione:
^[A-Z]a.*i+
-
-
Quale altro utile comando è comunemente usato per cercare all’interno dei file? Quali funzionalità aggiuntive ha?
Il comando
sed
. Questo comando può trovare e sostituire caratteri o set di caratteri all’interno di un file. -
Scegli uno degli esempi della lezione precedente e, con l’aiuto di
grep
, prova a cercare un pattern specifico all’interno dell’output del comando.Attenzione: ho scelto una delle risposte degli Esercizi Esplorativi e ho cercato la riga che ha i permessi di lettura, scrittura ed esecuzione per il gruppo. La tua risposta potrebbe essere diversa, a seconda del comando che hai scelto e del pattern che hai creato.
$ cat contents.txt | tr -s " " | grep "^....rwx"
Questo esercizio serve per mostrarti che
grep
può anche ricevere un input da diversi comandi e può essere utile per filtrare le informazioni generate.