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.
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 dowho, o campo 2 cai entre dois espaços e sai vazio. Comprima os espaços comtr -s ' 'antes de cortar. - O cut não reordena colunas.
-f3,1dá 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
-dnum CSV: o delimitador por omissão é o TAB e as linhas saem inteiras. - Cortar saídas alinhadas com espaços:
who,psoudfgeram campos vazios. Comprima comtr -s ' 'ou use oawk. - Confiar no
-cem texto com acentos: no GNU coreutils conta bytes e pode partir carateres. Teste com dados reais antes de automatizar. - Esperar que
-f3,1troque a ordem: ocutdevolve 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.
