Ordinamento e filtraggio dei file: comandi sort
, uniq
, cut
1. Comando sort
Il comando sort
è pensato per ordinare le righe in un file di testo. Funziona con qualsiasi formato di testo: dal semplice testo piano a CSV. Di default, ordina le righe in ordine alfabetico. Tuttavia, ci sono un sacco di opzioni che ti permetteranno di fare delle cose davvero fighe.
Sintassi base
sort [opzioni] file
Esempio semplice
Supponiamo di avere un file names.txt
con il seguente contenuto:
Charlie
Alice
Bob
David
Possiamo ordinarlo in ordine alfabetico così:
sort names.txt
Risultato:
Alice
Bob
Charlie
David
Opzioni principali di sort
Ordinamento inverso
Se vuoi ordinare le righe in ordine decrescente, usa l'opzione -r
:
sort -r names.txt
Risultato:
David
Charlie
Bob
Alice
Ordinamento numerico
Per i numeri, l'ordinamento alfabetico potrebbe non funzionare correttamente. Ad esempio, ecco il contenuto del file numbers.txt
:
10
2
5
1
L'ordinamento alfabetico restituisce:
1
10
2
5
Ma con l'opzione -n
(ordinamento numerico):
sort -n numbers.txt
Il risultato sarà corretto:
1
2
5
10
Ignorare gli spazi
A volte le righe contengono spazi all'inizio o alla fine. Per far sì che sort
non si confonda, usa l'opzione -b
:
sort -b file_sporco.txt
Esempio
Supponiamo di avere un log delle visite a un sito web visits.log
:
user2 15
user1 5
user3 30
user4 20
Vogliamo ordinare gli utenti per numero di visite (seconda colonna). Ecco come farlo:
sort -k2 -n visits.log
Dove -k2
significa "usa la seconda colonna per ordinare". Risultato:
user1 5
user2 15
user4 20
user3 30
2. Comando uniq
Il comando uniq
rimuove le righe duplicate in un file. Tuttavia, è importante ricordare: funziona solo con duplicati consecutivi. Cioè, se le stesse righe si trovano in parti diverse del file, devono essere ordinate prima.
Sintassi principale
uniq [opzioni] file
Esempio semplice
Supponiamo di avere un file colors.txt
:
rosso
verde
verde
blu
blu
blu
rosso
Se usiamo semplicemente uniq
:
uniq colors.txt
Il risultato sarà:
rosso
verde
blu
rosso
Rimuovere duplicati inevitabili
Prima ordinate il file:
sort colors.txt | uniq
Risultato:
blu
verde
rosso
Opzioni principali di uniq
Conteggio ripetizioni
Se vuoi sapere quante volte ogni riga appare, usa l'opzione -c
:
sort colors.txt | uniq -c
Risultato:
3 blu
2 verde
2 rosso
Esempio
Nel file access.log
abbiamo un elenco di indirizzi IP:
192.168.0.1
192.168.0.2
192.168.0.1
192.168.0.3
192.168.0.1
Vogliamo sapere quale IP appare più frequentemente:
sort access.log | uniq -c | sort -rn
Risultato:
3 192.168.0.1
1 192.168.0.2
1 192.168.0.3
3. Comando cut
Il comando cut
permette di estrarre parti specifiche delle righe, come colonne separate in un file CSV o intervalli di caratteri.
Sintassi base
cut [opzioni] file
Esempio semplice
File data.csv
:
Alice,25,Developer
Bob,30,Designer
Charlie,22,Manager
Estraiamo solo i nomi (la prima colonna):
cut -d',' -f1 data.csv
Risultato:
Alice
Bob
Charlie
Dove:
-d','
— delimitatore (virgola).-f1
— campo (colonna) da estrarre.
Opzioni principali di cut
Selezione di un intervallo di caratteri
Se il nostro file data.csv
ha colonne di larghezza fissa:
Alice 25 Developer
Bob 30 Designer
Charlie 22 Manager
Possiamo estrarre solo l'età (caratteri dalla posizione 12 alla 14):
cut -c12-14 data.csv
Risultato:
25
30
22
Selezione di più campi
Se abbiamo un file log.csv
:
2023-01-01,INFO,Server started
2023-01-02,ERROR,Connection failed
2023-01-03,INFO,Server stopped
Selezioniamo solo la data e il livello di log (campi 1 e 2):
cut -d',' -f1,2 log.csv
Risultato:
2023-01-01,INFO
2023-01-02,ERROR
2023-01-03,INFO
4. Esempio pratico: Combinazione di sort
, uniq
e cut
Prendiamo un file di log con questi dati:
user1,192.168.0.1
user2,192.168.0.2
user1,192.168.0.1
user3,192.168.0.3
user2,192.168.0.2
- Estrarre gli indirizzi IP:
cut -d',' -f2 log.txt
- Rimuovere i duplicati e contarli:
cut -d',' -f2 log.txt | sort | uniq -c
- Ordinare in base al numero di occorrenze:
cut -d',' -f2 log.txt | sort | uniq -c | sort -rn
Risultato:
2 192.168.0.2
2 192.168.0.1
1 192.168.0.3
GO TO FULL VERSION