Introduzione

Esistono molte utility disponibili nei sistemi Linux e Unix che ti consentono di elaborare e filtrare i file di testo. Cut è un'utilità della riga di comando che consente di tagliare parti di linee da file specificati o dati di piping e stampare il risultato sull'output standard. Può essere usato per tagliare parti di una linea per delimitatore, posizione byte e carattere.

In questo tutorial, ti mostreremo come utilizzare il comando di taglio di Linux attraverso esempi pratici e spiegazioni dettagliate delle opzioni di taglio più comuni.

Utilizzare il comando Cut

La sintassi per il comando cut è la seguente:

cut OPTION... [FILE]...

Quando si utilizza il comando taglia è necessario utilizzare una e solo una delle seguenti opzioni:

  • -f( --fields=LIST): Selezionare specificando un campo, un insieme di campi o un intervallo di campi. Questa è l'opzione più comunemente usata.
  • -b( --bytes=LIST): Selezionare specificando un byte, un set di byte o un intervallo di byte.
  • -c( --characters=LIST): Selezionare specificando un carattere, un insieme di caratteri o un intervallo di caratteri.

Altre opzioni sono:

  • -d( --delimiter) - Specifica un delimitatore che verrà utilizzato al posto del delimitatore "TAB" predefinito.
  • --complement- integrare la selezione. Quando si utilizza questa opzione, cut visualizzerà tutti i byte, i caratteri o i campi tranne quelli selezionati.
  • -s( --only-delimited) - Per impostazione predefinita, cut stamperà qualsiasi riga che non contiene caratteri delimitatori. Quando si utilizza questa opzione, cut non stampa linee che non contengono delimitatori.
  • --output-delimiter- L'impostazione predefinita è utilizzare il delimitatore di input come delimitatore di output. Questa opzione consente di specificare una stringa del delimitatore di output diversa.

Il comando cut può accettare zero o più nomi FILE di input. Se non viene specificato FILE o quando FILE è -, cut leggerà l'input standard.

L'argomento LIST con le opzioni -f, -be -c può essere un intero, multipli interi separati da virgole, una serie di numeri interi o più intervalli interi separati da una virgola. Ogni intervallo può essere uno dei seguenti:

  • N l'ennesimo campo, byte o carattere, a partire da 1.
  • N- dall'ennesimo campo, byte o carattere, alla fine della riga.
  • N-M dall'ennesimo all'ennesimo campo, byte o carattere.
  • -M dal primo all'ennesimo campo, byte o carattere.

Tagliare per campo

Il comando Taglia (cut) viene utilizzato principalmente per visualizzare i campi selezionati da ciascuna riga di file o l'input standard. Se non specificato, il delimitatore predefinito è TAB.

Negli esempi seguenti, useremo il file test.txt. Tutti i campi sono separati da schede.

321:235 7689    M:2354  Admin   02:11:1980
345:956 1254    M:5765  Sales   12:03:1979

Per visualizzare il 1o e il 3o campo dovresti usare:

cut test.txt -f 1,3
321:235	M:2354
345:956	M:5765

O se si desidera visualizzare dal 1 ° al 4 ° campo:

cut test.txt -f -4
321:235 7689    M:2354  Admin 
345:956 1254    M:5765  Sales

Tagliare in base a un delimitatore

Per tagliare in base a un delimitatore, utilizzare l'opzione -d seguita dal delimitatore che si desidera utilizzare.

Ad esempio, per visualizzare il 1 ° e il 3 ° campo usando ":" come delimitatore, digitare:

cut test.txt -d ':' -f 1,3
321:7689    Admin 01
345:1254    Sales 11

Puoi usare qualsiasi carattere singolo come delimitatore. Nel seguente esempio stiamo usando il carattere spazio come delimitatore e stampando il 2 ° campo:

echo "Lorem ipsum dolor sit amet" | cut -d ' ' -f 2
ipsum

Integrare la selezione

Per completare l'elenco dei campi di selezione utilizzare l'opzione --complement. Questo stamperà solo quei campi che non sono selezionati con l'opzione -f.

Il seguente comando stamperà tutti i campi tranne il 1° e 3°:

cut test.txt -f 1,3 --complement
7689    Admin   02:11:1980
1254    Sales   12:03:1979

Specificare un delimitatore di output

Per specificare il delimitatore di output utilizzare l'opzione --output-delimiter. Ad esempio, per impostare il delimitatore di output su _ :

cut test.txt -f 1,3 --output-delimiter='_'
321:235_M:2354
345:956_M:5765

Tagliare per byte e caratteri

Prima di andare oltre, facciamo una distinzione tra byte e caratteri.

Un byte è 8 bit e può rappresentare 256 valori diversi. Quando fu stabilito lo standard ASCII, esso prese in considerazione tutte le lettere, i numeri e i simboli necessari per lavorare con l'inglese. La tabella dei caratteri ASCII ha 128 caratteri e ogni carattere è rappresentato da un byte. Quando i computer hanno iniziato a diventare popolari a livello globale, le aziende tecnologiche hanno iniziato a introdurre nuove codifiche di caratteri per lingue diverse e per lingue con più di 256 caratteri, non era possibile una semplice mappatura da 1 a 1. Ciò porta a diversi problemi come la condivisione di documenti o la navigazione di siti Web ed era necessario un nuovo standard Unicode in grado di gestire la maggior parte dei sistemi di scrittura del mondo. UTF-8 è stato creato per risolvere questi problemi. In UTF-8, non tutti i caratteri sono rappresentati con 1 byte. I caratteri possono essere rappresentati da 1 byte a 4 byte.

Negli esempi seguenti, stiamo usando il carattere ü che richiede 2 byte.

Utilizzare l'opzione -b( --bytes) per ritagliare una sezione di una linea specificando una posizione in byte.

Seleziona il 5° byte:

echo 'drüberspringen' | cut -b 5
b

Seleziona il 5°, 9° e 13° byte:

echo 'drüberspringen' | cut -b 5,9,13
bpg

Seleziona l'intervallo dal 1° al 5° byte:

echo 'drüberspringen' | cut -b 1-5
drüb

Al momento della stesura di questo articolo, la versione di taglio in bundle in coreutils GNU non ha un'opzione per tagliare per carattere. Quando si utilizza l'opzione -c cut si comporta come quando si utilizza l'opzione -b.

Esempi di taglio

Il comando di taglio viene solitamente utilizzato in combinazione con altri comandi tramite piping. Ecco alcuni esempi.

Ottenere un elenco di tutti gli utenti

Viene trasmesso l'output del comando getent passwd al comando cut che stampa il 1° archiviato usando : come delimitatore.

getent passwd | cut -d ':' -f1

Visualizzare i 10 comandi più utilizzati

Nell'esempio seguente il taglio viene utilizzato per rimuovere i primi 8 byte da ciascuna riga dell'output del comando history.

history | cut -c8- | sort | uniq -c | sort -rn | head

Conclusione

Ormai dovresti avere una buona conoscenza di come usare il comando di taglio di Linux. Sebbene molto utile, il comando cut ha alcune limitazioni. Non supporta la specifica di più di un carattere come delimitatore e non supporta più decimetri.