Comando di taglio di Linux
Su Unix -come i sistemi operativi, il comando cut rimuove (“taglia”) le sezioni di ogni riga di uno o più file.
Questo documento tratta la versione GNU / Linux di cut.
Sintassi
cut OPTION... ...
Opzioni
-b, –bytes = LIST | Seleziona solo i byte da ogni riga come specificato in LIST. LIST specifica un byte, un insieme di byte o un intervallo di byte; vedere Specificare LIST di seguito. |
-c, –characters = LIST | Seleziona solo i caratteri da ogni riga come specificato in LIST. LIST specifica un carattere, un set di caratteri o un intervallo di caratteri; consulta Specifica di LIST di seguito. |
-d, –delimiter = DELIM | usa il carattere DELIM invece di una tabulazione per il delimitatore di campo. |
-f, –fields = LIST | seleziona solo questi campi su ogni riga; stampa anche qualsiasi riga che non contenga caratteri delimitatori, a meno che non sia specificata lopzione -s. LIST specifica un campo, un insieme di campi o un intervallo di campi; vedere Specifica dellELENCO di seguito. |
-n | Questa opzione viene ignorata, ma è inclusa per motivi di compatibilità. |
–complement | completa linsieme di byte, caratteri o campi selezionati. |
-s, –only-delimited | non stampare righe che non contengono delimitatori. |
–output-delimiter = STRING | usa STRING come stringa delimitatore di output. Limpostazione predefinita è utilizzare il delimitatore di input. |
–help | Visualizza un messaggio di aiuto ed esce. |
–version | visualizza informazioni sulla versione ed esce. |
Note sullutilizzo
Quando si invoca cut, utilizzare lopzione -b, -c o -f, ma solo una di esse.
Se non è specificato alcun FILE, cut legge dallo standard input.
Specificare LIST
Ciascun LIST è composto da un numero intero, un intervallo di numeri interi o più intervalli di numeri interi separati da virgole. Lingresso selezionato viene scritto nello stesso ordine in cui viene letto e viene scritto nelloutput esattamente una volta. Un intervallo è costituito da:
Ad esempio, supponiamo di avere un file denominato data.txt che contiene il testo seguente:
onetwothreefourfivealphabetagammadeltaepsilon
In questo esempio, ciascuna di queste parole è separata da un carattere di tabulazione, non da spazi. Il carattere di tabulazione è il delimitatore di default del taglio, quindi per impostazione predefinita considererà un campo come qualsiasi cosa delimitato da una tabulazione.
Per “tagliare” solo il terzo campo di ogni riga, usa il comando:
cut -f 3 data.txt
… che produrrà quanto segue:
threegamma
Se invece desideri “tagliare” solo il campo dal secondo al quarto di ogni riga, utilizza il comando:
cut -f 2-4 data.txt
… che produrrà quanto segue:
twothreefourbetagammadelta
Se vuoi” tagliare “solo il primo attraverso dal secondo e dal quarto al quinto campo di ogni riga (omettendo il terzo campo), utilizzare il comando:
cut -f 1-2,4-5 data.txt
… che produrrà quanto segue:
onetwofourfivealphabetadeltaepsilon
Oppure, supponiamo che tu desidera il terzo campo e ogni campo dopo di esso, omettendo i primi due campi. In questo caso, puoi utilizzare il comando:
cut -f 3- data.txt
… che restituirà quanto segue:
threefourfivegammadeltaepsilon
Specificare un intervallo con LIST si applica anche al taglio di caratteri (-c) o byte (-b) da una riga. Ad esempio, per visualizzare solo il terzo-dodicesimo carattere di ogni riga di data.txt, usa il comando:
cut -c 3-12 data.txt
… che verrà visualizzato il seguente:
etwothrephabetag
Ricorda che lo “spazio” tra ogni parola è in realtà un singolo carattere di tabulazione, quindi entrambe le righe di output visualizzano dieci caratteri: otto caratteri alfanumerici e due caratteri di tabulazione. In altre parole, tagliare omette i primi due caratteri di ogni riga, contando le tabulazioni come un carattere ciascuna; emissione di caratteri da tre a dodici, contando le tabulazioni come un carattere ciascuna; e omettendo qualsiasi carattere dopo il dodicesimo.
Contando i byte invece dei caratteri in questo caso si otterrà lo stesso output, perché in un file di testo con codifica ASCII, ogni carattere è rappresentato da un singolo byte (otto bit ) dei dati. Quindi il comando:
cut -b 3-12 data.txt
…, per il nostro file data.txt, produrrà esattamente lo stesso output:
etwothrephabetag
Specificare un delimitatore diverso da tabulazione
Il carattere di tabulazione è il delimitatore predefinito utilizzato da cut per determinare cosa costituisce un campo. Quindi, se i campi del tuo file sono già delimitati da tabulazioni, non è necessario specificare un carattere delimitatore diverso.
Tuttavia, puoi specificare qualsiasi carattere come delimitatore.Ad esempio, il file / etc / passwd contiene informazioni su ogni utente del sistema, un utente per riga e ogni campo di informazioni è delimitato da due punti (“:”). Ad esempio, la riga di / etc / passwd per lutente root potrebbe essere simile a questa:
root:x:0:0:root:/root:/bin/bash
Questi campi contengono le seguenti informazioni, nel seguente ordine, separati da due punti:
- Nome utente
- Password (mostrata come x se crittografata)
- Numero ID utente (UID)
- Numero ID gruppo (GID)
- Campo commento (utilizzato dal comando finger)
- Home directory
- Shell
Il nome utente è il primo campo della riga, quindi per visualizzare ogni nome utente sul sistema, utilizzare il comando:
cut -f 1 -d ":" /etc/passwd
… che verrà visualizzato , ad esempio:
rootdaemonbinsyschope
(Ci sono molti più account utente su un sistema tipico, inclusi molti account specifici per i servizi di sistema, ma per questo esempio faremo finta ci sono solo cinque utenti.)
Il terzo campo di ogni riga nel file / etc / passwd è lUID (numero ID utente), quindi per visualizzare ogni nome utente e numero ID utente, utilizzare il comando:
… che produrrà quanto segue, ad esempio:
root:0daemon:1bin:2sys:3chope:1000
Come puoi vedere, loutput sarà delimitato, per impostazione predefinita, utilizzando lo stesso carattere delimitatore specificato per linput. In questo caso, sono i due punti (“:”). Tuttavia, puoi specificare un diverso delimitatore per linput e loutput. Quindi, se desideri eseguire il comando precedente, ma loutput è delimitato da uno spazio, potresti usare il comando:
cut -f 1,3 -d ":" --output-delimiter=" " /etc/passwd
root 0daemon 1bin 2sys 3chope 1000
Ma cosa succede se vuoi che loutput sia delimitato da una tabulazione ? Specificare un carattere di tabulazione sulla riga di comando è un po più complicato, perché è un carattere non stampabile. Per specificarlo sulla riga di comando, devi “proteggerlo” dalla shell. Questo viene fatto in modo diverso a seconda di quale shell tu ” stai usando, ma nella shell predefinita di Linux (bash), puoi specificare il carattere di tabulazione con $ “\ t”. Quindi il comando:
cut -f 1,3 -d ":" --output-delimiter=$"\t" /etc/passwd
… produrrà quanto segue, ad esempio:
root0daemon1bin2sys3chope1000
Esempi
cut -c 3 file.txt
Visualizza il terzo carattere di ogni riga del file file.txt, omettendo gli altri.
cut -c 1-3 file.txt
Visualizza i primi tre caratteri di ogni riga del file file.txt, omettendo il resto.
cut -c -3 file.txt
Uguale a il comando precedente. Visualizza i primi tre caratteri di ogni riga di file.txt.
cut -c 3- file.txt
Visualizza il terzo fino agli ultimi caratteri di ciascuna riga del file file.txt, omettendo i primi due caratteri.
cut -d ":" -f 1 /etc/passwd
Visualizza il primo campo del file / etc / passwd, dove i campi sono delimitati da due punti (“:”). Il primo campo di / etc / passwd è il nome utente, quindi questo comando produrrà ogni nome utente nel file passwd.
grep "/bin/bash" /etc/passwd | cut -d ":" -f 1,6
Visualizza il primo e il sesto campo, delimitato da due punti, di qualsiasi voce nel file / etc / passwd che specifica / bin / bash come shell di login. Questo comando produrrà il nome utente e la directory home di qualsiasi utente la cui shell di accesso è / bin / bash.