Il comando cut viene utilizzato nei sistemi Linux e Unix per tagliare parti e sezioni da ciascuna riga di un file e scrivere il risultato nell'output standard. Può essere utilizzato per tagliare parti di una riga per posizione di byte, carattere e campo (delimitatore).
In questo tutorial impariamo il comando di taglio di Linux con alcuni esempi pratici che puoi utilizzare nelle tue attività quotidiane da riga di comando.
Taglia comando e sintassi
La sintassi di base per il comando taglia è la seguente:
cut OPTION... [FILE]...
Controlliamo le opzioni di taglio e senza alcuna opzione il comando di taglio non funzionerà.
Opzioni di taglio
-f
:Estrarre specificando un campo. Il comando Taglia usa 'TAB' come delimitatore di campo predefinito.
-d
:"Tab" è il delimitatore predefinito e utilizzando questa opzione puoi utilizzare un delimitatore specifico.
-b
:Per estrarre specificando un byte. È anche possibile specificare l'intervallo di byte.
-c
:Per tagliare per carattere. Può essere un elenco di numeri separati da virgole o un intervallo di numeri separati da un trattino (-).
–complement
:Questo integrerà la selezione
–output-delimiter
:Per modificare il delimitatore di output usa l'opzione -output-delimiter='delimiter'.
--only-delimited
:Il taglio non stampa le righe che non contengono delimitatori
Useremo il seguente file di testo denominato 'content.txt' e il file /etc/passwd durante questo tutorial per illustrare i nostri esempi.
$ cat content.txt
Ubuntu Linux
Microsoft Windows
OsX El Capitan
Unix
FreeBSD
Come tagliare per delimitatore
L'opzione di taglio più comunemente usata è una combinazione di -d
e -f
. In pratica estrarrà il contenuto in base a delimitatori specifici e campi elencati.
Ad esempio, quanto segue stampa solo il primo campo di ogni riga dal file '/etc/passwd' usando il delimitatore (:).
$ cut -d':' -f1 /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
...
Il seguente esempio in cui utilizziamo lo spazio (" ") come delimitatore e tagliamo il primo campo dal file denominato 'content.txt'.
$ cut -d " " -f 1 content.txt
Ubuntu
Microsoft
OsX
Unix
FreeBSD
Questo esempio estrae più di un campo da un file specifico. Qui estraiamo il 1° e il 6° campo usando i due punti (:) delimitatore dal file '/etc/passwd' che ha la stringa '/bin/bash':
$ grep "/bin/bash" /etc/passwd | cut -d':' -f1,6
root:/root
slax:/home/slax
Per visualizzare l'intervallo di campi, specifica il campo iniziale e il campo finale separati da trattino (-) come mostrato di seguito:
$ grep "/bin/bash" /etc/passwd | cut -d':' -f1-4,6,7
root:x:0:0:/root:/bin/bash
slax:x:1000:1000:/home/slax:/bin/bash
Come completare la selezione di output
Per completare l'elenco dei campi di selezione, utilizzare --complement
opzione. Questa opzione utilizzava dove selezionare tutti i campi tranne i campi specificati.
Nell'esempio seguente il comando stampa tutti i campi tranne il 2° campo nel file from '/etc/passwd':
$ grep "/bin/bash" /etc/passwd | cut -d':' --complement -f2
root:0:0:root:/root:/bin/bash
Come specificare un delimitatore di output
Per specificare il delimitatore di output, usa il --output-delimiter
opzione. Il delimitatore di input è specificato da -d
opzione e per impostazione predefinita il delimitatore di output è lo stesso del delimitatore di input.
Esaminiamo prima l'output senza utilizzare il delimitatore di output come segue:
$ cut -d: -f1,7 /etc/passwd | sort | uniq -u
_apt:/usr/sbin/nologin
backup:/usr/sbin/nologin
bin:/usr/sbin/nologin
daemon:/usr/sbin/nologin
dnsmasq:/usr/sbin/nologin
games:/usr/sbin/nologin
gnats:/usr/sbin/nologin
irc:/usr/sbin/nologin
landscape:/usr/sbin/nologin
list:/usr/sbin/nologin
lp:/usr/sbin/nologin
lxd:/bin/false
Ora ho aggiunto --output-delimiter
opzione e delimitatore di input due punti (:) viene sostituito con il delimitatore di output "SPACE" come segue:
$ cut -d: -f1,7 --output-delimiter ' ' /etc/passwd | sort | uniq -u
_apt /usr/sbin/nologin
backup /usr/sbin/nologin
bin /usr/sbin/nologin
daemon /usr/sbin/nologin
dnsmasq /usr/sbin/nologin
games /usr/sbin/nologin
gnats /usr/sbin/nologin
irc /usr/sbin/nologin
landscape /usr/sbin/nologin
list /usr/sbin/nologin
lp /usr/sbin/nologin
lxd /bin/false
Controlliamo un altro esempio, qui usiamo il delimitatore di output per stampare su ogni campo in una nuova riga.
Qui usiamo --output-delimiter
come $’\n’
che indica una nuova riga.
Controlla l'output:
$ grep root /etc/passwd | cut -d':' -f1,6,7 --output-delimiter=
Come tagliare per caratteri
Il -c
L'opzione (colonna) viene utilizzata per tagliare in base alla posizione del carattere. Ricorda che anche "TAB" e "Spazi" sono trattati come caratteri.
Per stampare il primo carattere di ogni riga del file denominato content.txt, utilizzare di seguito:
$ cut -c 1 content.txt
U
M
O
U
F
Nell'esempio seguente visualizzeremo i caratteri da 1 a 7 (intervallo) di ciascuna riga del file:
$ cut -c 1-7 content.txt
Ubuntu
Microso
OsX El
Unix
FreeBSD
Verifichiamo come selezionare le colonne in base alla posizione iniziale o finale specifica.
Per estrarre le colonne dal 2° all'ultimo carattere:
$ cut -c2- content.txt
buntu Linux
icrosoft Windows
sX El Capitan
nix
reeBSD
Per estrarre colonne dal 1° al 4° carattere:
cut -c-4 content.txt
Ubun
Micr
OsX
Unix
Free
Come tagliare per byte
Usa il -b
opzione per selezionare una parte di una riga specificando la posizione di un byte con numeri separati da virgola (,). Usando il trattino puoi specificare un intervallo di byte.
L'esempio seguente taglia dal 1°, 2° e 3° byte dal file denominato 'content.txt':
$ cut -b 1,2,3 content.txt
Ubu
Mic
OsX
Uni
Fre
Possiamo anche elencare con intervalli usando il comando seguente:
$ cut -b 1-3,5-7 content.txt
Ubutu
Micoso
OsXEl
Uni
FreBSD
Alcuni esempi pratici di taglio
Cut è più pratico da usare con una combinazione di diversi comandi Linux o Unix.
Ad esempio, vuoi estrarre "USER", "PID" e "COMMAND" usando il comando ps:
ps -L u n | tr -s " " | cut -d " " -f 2,3,14-
USER PID COMMAND
0 676 /sbin/agetty -o -p -- \u --keep-baud 115200,38400,9600 ttyS0 vt220
0 681 /sbin/agetty -o -p -- \u --noclear tty1 linux
0 23174 -bash
0 26737 ps -L u n
0 26738 tr -s
0 26739 cut -d -f 2,3,14-
Prendiamo un altro esempio per estrarre il valore di memoria "totale", "usato" e "libero" e salvarlo in un file di testo usando più comandi:
$ free -m | tr -s ' ' | sed '/^Mem/!d' | cut -d" " -f2-4 >> memory.txt
Output
$ cat memory.txt
985 86 234
Conclusione
Il comando cut può essere inviato tramite pipe con molti altri comandi Linux o Unix. Può essere collegato con uno o più filtri per un'ulteriore elaborazione del testo.
Una delle limitazioni del comando cut è che non supporta la specifica di più di un carattere come delimitatore. Più spazi vuoti vengono contati come più separatori di campo e devono usare il comando tr prima di tagliare per ottenere l'output desiderato.
\n' root /root /bin/bash operator /root /sbin/nologin
Come tagliare per caratteri
Il -c
L'opzione (colonna) viene utilizzata per tagliare in base alla posizione del carattere. Ricorda che anche "TAB" e "Spazi" sono trattati come caratteri.
Per stampare il primo carattere di ogni riga del file denominato content.txt, utilizzare di seguito:
Nell'esempio seguente visualizzeremo i caratteri da 1 a 7 (intervallo) di ciascuna riga del file:
Verifichiamo come selezionare le colonne in base alla posizione iniziale o finale specifica.
Per estrarre le colonne dal 2° all'ultimo carattere:
Per estrarre colonne dal 1° al 4° carattere:
Come tagliare per byte
Usa il -b
opzione per selezionare una parte di una riga specificando la posizione di un byte con numeri separati da virgola (,). Usando il trattino puoi specificare un intervallo di byte.
L'esempio seguente taglia dal 1°, 2° e 3° byte dal file denominato 'content.txt':
Possiamo anche elencare con intervalli usando il comando seguente:
Alcuni esempi pratici di taglio
Cut è più pratico da usare con una combinazione di diversi comandi Linux o Unix.
Ad esempio, vuoi estrarre "USER", "PID" e "COMMAND" usando il comando ps:
Prendiamo un altro esempio per estrarre il valore di memoria "totale", "usato" e "libero" e salvarlo in un file di testo usando più comandi:
Conclusione
Il comando cut può essere inviato tramite pipe con molti altri comandi Linux o Unix. Può essere collegato a uno o più filtri per un'ulteriore elaborazione del testo.
Una delle limitazioni del comando cut è che non supporta la specifica di più di un carattere come delimitatore. Più spazi vuoti vengono contati come più separatori di campo e devono usare il comando tr prima di tagliare per ottenere l'output desiderato.