Comando cut: extrair colunas e campos no Linux

Cartão de terminal HJFR com o comando cut -d: -f1 e a legenda «campos, carateres e bytes»

Há tarefas que surgem todos os dias no terminal: tirar a lista de utilizadores do /etc/passwd, ficar só com os IP de um log, extrair dois campos de um CSV. Para isso existe uma ferramenta pequena, rápida e presente em qualquer Linux: o comando cut, que corta colunas de texto, linha a linha.

Neste artigo percorremos os três modos de corte — campos, carateres e bytes — e todas as opções, uma a uma: -d e -f, listas e intervalos, --output-delimiter, -c e -b (com a armadilha do UTF-8), -s e --complement. No fim, vemos o cut em pipelines, os seus limites e quando passar ao awk.

Veja o guia em vídeo

Prefere ver antes de experimentar? No canal HJFR-IT no YouTube mostramos o cut opção a opção, com o resultado de cada comando no ecrã — narrado em português e com legendas.

cut — Guia Completo: extrair colunas e campos — canal HJFR-IT no YouTube. Se o áudio não arrancar em português, abra as definições do vídeo (ícone da roda dentada) → Faixa de áudio → Português.

O que faz o cut

O cut lê texto e, de cada linha, imprime só uma parte. Precisa sempre de saber duas coisas: como dividir a linha e que partes manter. Há três formas de dividir, e só se usa uma de cada vez:

cut -f LISTA [-d DELIM] [-s] [FICHEIRO...]   # por campos
cut -c LISTA [FICHEIRO...]                   # por carateres
cut -b LISTA [FICHEIRO...]                   # por bytes

A LISTA tem sempre a mesma sintaxe. O resultado vai para a saída padrão, sem alterar o original; sem ficheiro, o cut lê de um pipe.

Campos: delimitador (-d) e campo (-f)

O modo mais usado é o de campos: o -d define o delimitador e o -f escolhe o campo. Tomemos o notas.csv, com nome, curso, nota e cidade separados por vírgulas e um comentário na primeira linha:

$ cut -d',' -f1 notas.csv
# exportado em 2026-09-28
nome
Ana
Bruno
Carla
Duarte

Sai só a coluna dos nomes — e o comentário inteiro, porque não tem vírgula: é o que acontece por omissão às linhas sem delimitador. E um pormenor que apanha quase toda a gente: sem -d, o cut separa pelo TAB, não pela vírgula nem pelo espaço. Num CSV, um cut -f1 devolve as linhas inteiras; o -d é obrigatório.

Listas e intervalos

O -f aceita mais do que um número, e as mesmas formas valem para o -c e o -b:

  • -f1,3 — lista com vírgulas: os campos 1 e 3 (nome e nota).
  • -f2-4 — intervalo com traço: do campo 2 ao 4, inclusive.
  • -f3- — do campo 3 até ao último, sem contar quantos há.
  • -f-2 — do primeiro campo até ao segundo.

As formas combinam-se (-f1,3-) e os campos saem unidos pelo delimitador da entrada: -f1,3 devolve Ana,17, Bruno,15…

Outro delimitador: o /etc/passwd

O /etc/passwd separa sete campos com dois pontos: nome, palavra-passe (só um x; a verdadeira está no /etc/shadow), UID, GID, descrição, diretório pessoal e shell. -d':' -f1 dá a lista de utilizadores; -f1,7 põe cada um ao lado da sua shell — a forma clássica de ler ficheiros de configuração em colunas.

$ cut -d':' -f1,7 /etc/passwd
root:/bin/bash
daemon:/usr/sbin/nologin
www-data:/usr/sbin/nologin
sshd:/usr/sbin/nologin
aluno:/bin/bash
suporte:/bin/bash

Trocar o separador de saída (–output-delimiter)

Por omissão, os campos saem unidos pelo delimitador da entrada. O --output-delimiter troca-o por outro texto, que pode ter vários carateres — útil para legibilidade ou para converter formatos, por exemplo para CSV:

$ cut -d':' -f1,7 --output-delimiter=' -> ' /etc/passwd | head -2
root -> /bin/bash
daemon -> /usr/sbin/nologin

$ cut -d':' -f1,3,7 --output-delimiter=',' /etc/passwd > contas.csv

Carateres e bytes: -c e -b

Nem todo o texto tem delimitador. Quando as colunas têm largura fixa, corta-se por posição com o -c: a sintaxe é a do -f, mas conta posições e dispensa o -d. Em códigos como 2026-ABC-0142, as posições 1 a 4 são o ano e as 6 a 8 o bloco de letras:

$ cut -c1-4 codigos.txt
2026
2025
2026

$ cut -c6-8 codigos.txt
ABC
XKD
LNX

Com vários intervalos, as posições saem coladas (cut -c1-4,6-8 dá 2026ABC); o --output-delimiter também funciona aqui e separa os intervalos.

A armadilha do UTF-8

O -b corta por bytes. Em texto ASCII, um carácter é um byte e o resultado é igual ao do -c. Mas em UTF-8 uma letra acentuada ocupa dois bytes ou mais: em ção, o ç são os bytes 1 e 2 e o ã os bytes 3 e 4. Pedir os bytes 1 a 3 corta o ã a meio, e o terminal mostra lixo.

Em teoria, o -c resolve isto: a norma POSIX define-o como corte por carácter. Na prática, no cut do GNU coreutils, tal como vem no Debian, o -c ainda conta bytes, como o -b — a documentação admite que, por agora, são iguais. Peça dois carateres de ção e recebe um:

$ echo 'ção' | cut -b1-3
ç�
$ echo 'ção' | cut -c1-2
ç
$ echo 'ção' | grep -o '^..'
çã

Regra prática: -c e -b são fiáveis em ASCII e em dados de largura fixa em bytes; o -b fica para dados binários. Em texto com acentos, desconfie de ambos e use o grep -o com pontos — num locale UTF-8, cada ponto é um carácter inteiro. A opção -n («não partir carateres») existe por compatibilidade, mas o GNU ignora-a.

Filtrar linhas e inverter a seleção

Só linhas com delimitador (-s)

O -s (de suppress, suprimir) descarta as linhas sem delimitador, como o nosso comentário — essencial quando há títulos à mistura com os dados. O cabeçalho do CSV tem vírgulas e fica; para o saltar, junte um tail -n +2.

$ cut -d',' -f1 -s notas.csv
nome
Ana
Bruno
Carla
Duarte

Inverter a seleção (–complement)

O --complement inverte a seleção: pede-se o campo 2 (o curso) e obtém-se tudo menos ele. Numa tabela com vinte colunas, remover uma é muito mais curto do que listar as outras dezanove.

$ cut -d',' -f2 --complement -s notas.csv
nome,nota,cidade
Ana,17,Lisboa
Bruno,15,Porto
Carla,19,Braga
Duarte,12,Faro

O cut num pipeline

O cut brilha no fim de um cano: um comando produz linhas, o cut escolhe a coluna. O who mostra quem tem sessão aberta e o cut fica com os nomes; o ls -l seguido de cut -c1-10 isola as permissões.

$ who | cut -d' ' -f1
aluno
suporte

$ ls -l | cut -c1-10
total 20
-rw-r--r--
-rw-r--r--
drwxr-xr-x
-rw-r--r--
-rwxrwxrwx

A linha total 20 passou (tem menos de dez carateres) e o -rwxrwxrwx da última merece atenção: é um script que qualquer utilizador pode alterar.

Limites do cut — e quando passar para o awk

  • O delimitador é um único carácter, e cada ocorrência conta. Um -d', ' é recusado (the delimiter must be a single character) e, na saída alinhada do who, o campo 2 cai entre dois espaços e sai vazio. Comprima os espaços com tr -s ' ' antes de cortar.
  • O cut não reordena colunas. -f3,1 dá o mesmo que -f1,3: os campos saem sempre pela ordem da linha.
$ who | cut -d' ' -f2           # duas linhas vazias


$ who | tr -s ' ' | cut -d' ' -f2
pts/0
pts/1

$ who | awk '{print $2, $1}'
pts/0 aluno
pts/1 suporte

Para separadores variáveis, delimitadores longos ou reordenação, a ferramenta certa é o awk: divide por qualquer sequência de espaços (ou pelo separador de -F) e imprime os campos pela ordem que quiser.

cut em cibersegurança

Triagem rápida de contas. Numa máquina suspeita, procure contas com UID 0 além do root: são administradores e uma porta das traseiras clássica. Basta cut -d':' -f1,3 /etc/passwd | grep ':0$'. Com -f1,7 vê que contas têm shell interativa; uma conta de serviço com /bin/bash tem de ser explicada.

Ler logs durante um incidente. Num log de acesso web, o campo 1 é o IP de origem e o 9 o código HTTP. cut -d' ' -f1 access.log | sort | uniq -c | sort -rn põe no topo quem anda a martelar o login; com -f1,9 vê se uma série de 401 acabou num 302 — o redirecionamento típico de um login aceite.

Desconfiar dos dados. O cut não percebe aspas: em "Lisboa, Portugal", a vírgula interna desloca as colunas. Em logs, campos controlados pelo atacante, como o User-Agent, podem trazer espaços de propósito. Use o cut para triagem, confirme com ferramentas que entendam o formato e preserve os originais como evidência.

Experimente no simulador interativo

O simulador usa os dados deste artigo — notas.csv, /etc/passwd, códigos de largura fixa, a palavra ção, who, ls -l e um log de acesso. À esquerda, cada linha aparece campo a campo (ou byte a byte), com o que o comando mantém a azul e os casos especiais — linhas sem delimitador, campos vazios, carateres cortados — a laranja; à direita, a saída no terminal. Demonstrar tudo corre a sequência completa, Anterior e Seguinte avançam ao seu ritmo e Repor estado volta ao início.

Erros comuns e boas práticas

  • Esquecer o -d num CSV: o delimitador por omissão é o TAB e as linhas saem inteiras.
  • Cortar saídas alinhadas com espaços: who, ps ou df geram campos vazios. Comprima com tr -s ' ' ou use o awk.
  • Confiar no -c em texto com acentos: no GNU coreutils conta bytes e pode partir carateres. Teste com dados reais antes de automatizar.
  • Esperar que -f3,1 troque a ordem: o cut devolve sempre a ordem original; para reordenar, awk.
  • Tratar CSV exportado de folhas de cálculo: vírgulas entre aspas estragam a contagem. Use uma ferramenta que entenda CSV.
  • Ignorar as linhas sem delimitador: comentários e títulos passam inteiros e contaminam a saída. Junte -s.

Conclusão

O cut faz uma coisa e fá-la bem: -d e -f para campos, -c e -b para posições, -s, --complement e --output-delimiter para afinar o resultado. É perfeito no fim de um cano, dentro dos seus limites. Para o combinar com sort e uniq, leia o guia de pipelines de texto no Linux; para separadores irregulares ou colunas a reordenar, o passo seguinte é o comando awk.

Workshop — Linha de Comandos Linux

Quer passar da leitura à prática, com exercícios reais e acompanhamento? No workshop Linha de Comandos Linux da HJFR trabalha estes e outros comandos da série — da administração do dia a dia à resposta a incidentes.

Este artigo faz parte da série «Comandos Linux, um a um» do blog HJFR — fique atento aos próximos comandos.