Linux / Comando cut: extrair campos, bytes e trechos de texto
cut extrai partes de cada linha de texto: campos separados por um delimitador ou posições indicadas pelos modos de bytes e caracteres. Para selecionar campos, use -f; o separador padrão é a tabulação, e -d permite escolher outro. A ferramenta é adequada a formatos simples e regulares, mas não interpreta as regras de aspas de um arquivo de valores separados por vírgulas (CSV).
Escolha o modo conforme o que deseja selecionar. Campos são partes separadas por um caractere; bytes são unidades da codificação; um caractere como é pode ocupar vários bytes em UTF-8. Por isso, não trate uma posição de byte como uma letra sem conferir a implementação e a codificação do arquivo.
Sintaxe e listas de posições
cut -d 'separador' -f lista [arquivo...]
Essa linha descreve o modo de campos; os termos entre colchetes são opcionais e os demais nomes são marcadores que você substitui. Sem arquivo, cut lê a entrada padrão. Escolha apenas um modo por comando: -f, -b ou -c. Consulte cut --version, cut --help ou man cut no seu sistema; os exemplos seguem o GNU Coreutils.
A numeração começa em 1. Uma lista como 1,3 seleciona posições específicas; 2-4 inclui da segunda à quarta; 2- vai da segunda até o fim. Os campos selecionados saem na ordem em que aparecem na entrada, mesmo que a lista tenha sido escrita em outra ordem.
Preparar arquivos e extrair um campo
Abra um terminal Bash dedicado ao exercício em uma pasta onde possa criar um diretório. O bloco cria uma pasta exclusiva e sete arquivos pequenos. O encadeamento com && impede que as etapas seguintes do bloco continuem após uma falha de preparação. Use a mesma sessão para os exemplos seguintes.
cut_demo=$(mktemp -d ./cut-demo.XXXXXX) &&
cd "$cut_demo" &&
export LC_ALL=C &&
printf 'alpha:x:1000:1000:Conta A:/home/alpha:/bin/bash\nbeta:x:1001:1001:Conta B:/home/beta:/bin/sh\n' > passwd-demo.txt &&
printf 'abcdefghijk\n1234567890\n' > sample.txt &&
printf 'alpha:100\nbeta:200\nplain\ngamma:\n' > fields.txt &&
printf 'alpha\t100\tok\nbeta\t200\tpending\n' > tabs.tsv &&
printf 'alpha 100\nbeta 200\n' > spaces.txt &&
printf '"alpha,beta",100\n' > quoted.csv &&
printf '\303\251X\n' > utf8.txt &&
cut -d ':' -f 1 passwd-demo.txt
O arquivo passwd-demo.txt usa sete campos separados por dois-pontos, como no formato de /etc/passwd, mas contém apenas contas fictícias criadas pelo exercício. A última linha retorna alpha e beta, uma por linha. Nenhum arquivo de contas do sistema precisa ser lido ou alterado.
LC_ALL=C define o ambiente de comparação e formato desta sessão e de seus processos filhos. Os dados com acento serão tratados separadamente na explicação sobre UTF-8. Ao fechar o terminal dedicado, o ajuste deixa de afetar seus comandos futuros; os arquivos de prática permanecem na pasta criada.
Selecionar vários campos sem mudar sua ordem
Para extrair o nome fictício e o interpretador de comandos, o shell, selecione os campos 1 e 7:
cut -d ':' -f 1,7 passwd-demo.txt
O resultado tem duas linhas: alpha:/bin/bash e beta:/bin/sh. A ferramenta preserva o delimitador entre os campos escolhidos. Mesmo com cut -d: -f7,1 passwd-demo.txt, o resultado segue a ordem original, com o campo 1 antes do 7. A lista seleciona campos; ela não define uma nova disposição para eles.
Para o arquivo com tabulações, cut -f2 tabs.tsv retorna 100 e 200, sem precisar de -d. Escrever vírgulas na lista de posições não muda o separador de entrada; -f1,2 seleciona dois campos, enquanto -d ',' define a vírgula como delimitador.
Extrair um trecho por posição e conferir UTF-8
O arquivo sample.txt contém duas linhas ASCII, sem acentos. Para mostrar as oito primeiras posições:
cut -c 1-8 sample.txt
A saída é abcdefgh e 12345678, uma linha por trecho. Nesse conjunto ASCII, cada caractere ocupa um byte, então cut -b1-8 sample.txt produz o mesmo resultado. O comando lê a entrada e escreve na saída padrão, sem regravar sample.txt.
Em UTF-8, essa equivalência não basta para concluir que -c preserva letras inteiras. Na verificação com GNU cut 8.32 do Git para Windows, LC_ALL=C.UTF-8 cut -c1 utf8.txt retornou apenas o primeiro byte de é, assim como -b1. O arquivo contém os bytes C3 A9 58 0A, correspondentes a é, X e quebra de linha; a seleção devolveu C3 0A, um trecho que não forma texto UTF-8 válido.
Você pode inspecionar os bytes com od -An -tx1 utf8.txt e LC_ALL=C.UTF-8 cut -c1 utf8.txt | od -An -tx1. Esse resultado identifica a implementação testada; para selecionar caracteres multibyte, confira o suporte da ferramenta instalada e use um método que entenda a codificação. Não use a aparência de um caractere quebrado no terminal como prova de que o dado foi extraído corretamente.
Receber campos pela entrada padrão
Para extrair o primeiro campo de duas linhas recebidas por um pipe (|):
printf 'alpha:100\nbeta:200\n' | cut -d: -f1
Saída esperada:
alpha
beta
-d: e -d ':' indicam o mesmo delimitador. O shell interpreta as aspas antes de iniciar cut. Nesse exemplo simples, os dois-pontos separam sempre os dois campos, sem regras adicionais de escape ou aspas.
Tratar linhas sem delimitador e campos vazios
O arquivo fields.txt contém alpha:100, beta:200, uma linha plain sem dois-pontos e gamma: com um segundo campo vazio. cut -d: -f2 fields.txt retorna 100, 200, plain e uma linha vazia. Por padrão, uma linha sem o delimitador é copiada inteira, mesmo quando o campo pedido é o segundo.
Com cut -s -d: -f2 fields.txt, plain desaparece, mas a linha vazia de gamma permanece. -s filtra linhas sem delimitador; não elimina campos vazios nem valida se todas as linhas têm a mesma quantidade de colunas. Se o campo escolhido estiver ausente em uma linha delimitada, o trecho pode ficar vazio.
Reconhecer os limites de espaços e CSV
Em spaces.txt, alpha é seguido por um espaço e beta por três. O comando cut -d ' ' -f2 spaces.txt retorna 100 e uma linha vazia: cada espaço é um separador, e os consecutivos criam campos vazios. Se o formato usa quantidades variáveis de espaços entre colunas, awk '{print $2}' spaces.txt retorna 100 e 200. O guia de awk em inglês explica essa ferramenta para processamento por campos.
No formato CSV (Comma-Separated Values), as aspas podem fazer parte da estrutura dos campos. No arquivo quoted.csv, o primeiro campo de "alpha,beta",100 é alpha,beta como um único valor. Porém, cut -d ',' -f1 quoted.csv corta na primeira vírgula e devolve apenas "alpha. Conforme as regras descritas na seção 2 do RFC 4180 sobre o formato CSV, campos podem incluir vírgulas e quebras de linha protegidas por aspas. Para esse formato, escolha um leitor de CSV que interprete essas regras.
Opções principais
| Opção | Uso |
|---|---|
-d separador |
Define o delimitador no modo de campos; o padrão é tabulação. |
-f lista |
Seleciona campos numerados a partir de 1, inclusive intervalos. |
-c lista |
Seleciona pelo modo de caracteres; confira o suporte multibyte da implementação. |
-b lista |
Seleciona posições de bytes, que podem cortar uma codificação multibyte. |
-s |
No modo de campos, não mostra linhas sem o delimitador. |
Salvar o resultado em outro arquivo
Para guardar o nome e o shell dos dados fictícios em uma saída nova, use (set -C; cut -d: -f1,7 passwd-demo.txt > selected.txt). Depois de sucesso, confira com cat selected.txt. O ajuste set -C fica no comando entre parênteses e impede sobrescrever esse arquivo de saída regular se ele já existir. Se existir, escolha outro nome.
Não redirecione a saída para o mesmo arquivo usado como entrada: o shell pode esvaziá-lo antes de cut ler os dados. Preserve o original e confira a extração antes de substituir qualquer arquivo importante.
Pergunta frequente
Posso usar cut para colunas alinhadas com vários espaços?
Use cut quando o separador e a estrutura dos campos forem regulares. Com -d ' ', cada espaço conta separadamente; se o espaçamento varia, a segunda palavra pode cair em outro campo. Para texto organizado por palavras separadas por espaços ou tabulações, awk costuma ser mais adequado. CSV com aspas exige um leitor de CSV.
Documentação oficial
Consulte a documentação do GNU cut e a página de manual de cut publicada pelo Debian. Compare os modos e opções com a versão instalada antes de transferir uma receita para outro sistema.




