Comando cut in Linux: estrarre campi, caratteri e byte dal testo

cut estrae da ogni riga di testo i byte, i caratteri o i campi indicati e li invia all’uscita standard, normalmente il terminale. È utile per selezionare colonne semplici con un separatore noto. Non interpreta però la struttura di un file CSV, per esempio le virgole racchiuse fra virgolette o i campi distribuiti su più righe.

Nella modalità per campi, -f, il separatore predefinito è la tabulazione. Per usare un altro carattere, come i due punti, aggiungi -d. Le posizioni partono da 1; usa -b per i byte e valuta -c insieme a codifica, locale e implementazione installata.

Sintassi di base

cut OPTION... [FILE]...

Questa è una notazione: inserisci opzioni e percorsi reali senza le parentesi quadre. Devi scegliere una modalità di selezione, per esempio -f 1, -c 1-8 o -b 1-8. Senza file, oppure con - come nome, il comando legge dall’ingresso standard. Consulta man cut sul sistema in uso: le estensioni GNU e il supporto multibyte possono differire fra versioni e implementazioni.

Esempi con file dimostrativi completi

Estrarre campi separati da due punti

Su Linux, il comando cut -d ':' -f 1 /etc/passwd legge il primo campo del file locale degli account senza modificarlo. L’output dipende dagli account presenti e non rappresenta necessariamente tutti gli utenti di servizi di identità esterni. Per provare la stessa struttura senza usare o pubblicare dati del tuo sistema, crea invece questi file dimostrativi in una nuova directory.

Esegui il blocco in una shell compatibile con Bash. Se cut-demo esiste già, la creazione fallisce e il resto non viene eseguito: scegli un nome nuovo, senza cancellare file precedenti.

mkdir cut-demo && cd cut-demo && (
  set -e
  set -o noclobber
  export LC_ALL=C
  printf 'alice:x:1000:1000:Alice:/home/alice:/bin/bash\nbob:x:1001:1001:Bob:/home/bob:/bin/sh\n' > passwd-demo.txt
  printf 'abcdefghijk\nHello Linux\n' > sample.txt
  cut -d ':' -f 1 passwd-demo.txt
)

L’output è alice seguito da bob, su due righe. Sono nomi inventati per la prova. Rimani nella directory cut-demo per gli esempi successivi. I file di ingresso restano invariati; puoi verificarne il contenuto con cat passwd-demo.txt e cat sample.txt.

Selezionare più campi

Nel formato di esempio, il primo campo è il nome e il settimo è il percorso della shell. Il corrispondente comando sul file reale sarebbe cut -d ':' -f 1,7 /etc/passwd. Per il file dimostrativo usa:

cut -d ':' -f 1,7 passwd-demo.txt

Ottieni alice:/bin/bash e bob:/bin/sh. I campi selezionati vengono emessi nell’ordine dell’ingresso: anche scrivendo -f 7,1 il risultato resta nome seguito da shell. Un indice ripetuto non duplica il campo. Se vuoi cambiare l’ordine delle colonne, uno strumento come awk, descritto nella guida in inglese offre una formattazione più flessibile.

Estrarre l’inizio di ogni riga

Per prendere le posizioni da 1 a 8 del file ASCII appena creato:

cut -c 1-8 sample.txt

L’output è abcdefgh e Hello Li, una riga ciascuno. Qui ogni carattere ASCII occupa un byte, quindi -b 1-8 produce lo stesso risultato. Se una riga è più corta dell’intervallo, vengono emesse soltanto le posizioni presenti, senza aggiungere spazi di riempimento.

Vedere insieme ingresso e risultato

Questa prova indipendente dai file usa una pipe, cioè un collegamento fra l’uscita di printf e l’ingresso di cut. Ogni \n nel formato di printf produce una nuova riga. -d: seleziona i due punti come separatore e -f1 il primo campo:

printf 'alpha:100\nbeta:200\n' | cut -d: -f1

Output atteso:

alpha
beta

Un elenco di selezione può contenere indici e intervalli: -f 1,3 sceglie il primo e il terzo campo, -f 2-4 dal secondo al quarto, -f 3- dal terzo alla fine. Gli intervalli sono inclusivi e gli indici partono da 1.

Il separatore è letterale. Con printf 'a\040\040b\n' | cut -d ' ' -f2 il secondo campo è vuoto: le due sequenze \040 producono due spazi consecutivi e fra essi non ci sono caratteri. Questo comando non tratta una sequenza di spazi come un unico separatore. Per colonne allineate con spazi variabili, valuta awk o una modalità di separazione esplicitamente supportata dalla tua versione.

Opzioni principali e formato delle selezioni

Opzione o formato Significato
-d separatore Imposta il carattere che separa i campi nella modalità -f. Il valore predefinito è la tabulazione.
-f elenco Seleziona numeri o intervalli di campi. L’uscita conserva l’ordine originale delle colonne.
-c elenco Seleziona posizioni di caratteri secondo il supporto della versione e la locale. Non conta necessariamente i simboli visivi come li percepisce il lettore.
-b elenco Seleziona posizioni di byte. Su testo multibyte può tagliare una sequenza a metà.
-s Con -f, omette le righe prive del separatore richiesto.

Precauzioni: righe senza separatore, codifica e CSV

In modalità per campi, una riga priva del separatore viene normalmente emessa intera, anche se chiedi un campo successivo al primo. Per esempio, printf 'alpha:100\nplain\n' | cut -d: -f2 produce 100 e plain. Aggiungendo -s rimane soltanto 100. Una riga che contiene il separatore ma non il campo richiesto produce invece una riga vuota: non confondere i due casi.

Nel testo UTF-8, lettere accentate e altri caratteri possono occupare più byte. Il manuale GNU attuale distingue -c da -b e considera separatamente anche i caratteri combinanti. Le versioni installate possono avere un supporto diverso: verifica versione, locale e risultato su una piccola prova prima di estrarre testo multibyte. Le posizioni dei caratteri non sono la larghezza in colonne del terminale, né garantiscono di mantenere insieme ogni simbolo composto.

cut -d ',' divide a ogni virgola e non riconosce le virgolette CSV. Se un campo contiene una virgola fra virgolette o una nuova riga, usa un parser specifico per CSV. Scegli cut quando il separatore descrive davvero la struttura dei dati, non soltanto perché il file ha un’estensione particolare.

Per salvare una selezione, nella directory di prova puoi eseguire cut -d: -f1 passwd-demo.txt > selected-names.txt, scegliendo una destinazione nuova. Il comando non modifica l’ingresso, ma la ridirezione sovrascrive un’uscita esistente. Non usare lo stesso percorso per ingresso e uscita: la shell può svuotare il file prima della lettura.

Domande frequenti

Posso estrarre colonne separate da più spazi con cut?

Con -d ' ', ogni spazio è un separatore e spazi consecutivi creano campi vuoti. Awk tratta normalmente sequenze di spazi e tabulazioni come separatori dei campi. Versioni GNU recenti di cut offrono anche -w per le sequenze di caratteri vuoti, ma questa estensione non è disponibile in tutte le versioni: controlla il manuale locale prima di usarla.

Documentazione di riferimento

La pagina di manuale di GNU cut su man7 descrive selezioni ed estensioni della versione documentata. Il riferimento POSIX per cut permette di verificare il comportamento standard e le condizioni legate ai caratteri.