Em scripts shell, frequentemente precisamos processar dados textuais, extraindo partes relevantes ou transformando seu formato. Os comandos cut e tr são ferramentas leves e eficientes para essas tarefas, sem a necessidade de linguagens mais pesadas como Python ou AWK. Nesta aula, exploraremos a fundo suas opções e veremos como combiná-los em pipelines para resolver problemas comuns de manipulação de texto.

Dominar cut e tr é fundamental para qualquer profissional que trabalha com linha de comando Linux, pois permite operações rápidas em logs, CSVs e outros arquivos estruturados sem sair do terminal.

cut por campo e caractere

O comando cut extrai seções de cada linha de um arquivo ou entrada padrão. Ele pode operar de duas maneiras principais: por caractere (-c) ou por campo (-f), onde os campos são delimitados por um separador especificado com -d.

Para usar cut por caractere, especifique as posições desejadas (ex: 1-3 para os primeiros três caracteres). Por campo, defina o delimitador (ex: -d, para CSV) e os números dos campos (ex: -f1,3). É importante lembrar que cut não reordena campos; ele os extrai na ordem original.

# Extrair os primeiros 5 caracteres de cada linha do /etc/passwd
cut -c1-5 /etc/passwd

# Extrair o primeiro e terceiro campos (separados por :) do /etc/passwd
cut -d: -f1,3 /etc/passwd

# Extrair do segundo campo em diante
cut -d: -f2- /etc/passwd

tr (tradução, deleção)

O comando tr (translate) é usado para substituir, deletar ou comprimir caracteres. Ele opera sobre a entrada padrão e escreve na saída padrão, sem modificar arquivos diretamente. As operações mais comuns são: tradução (substituir um conjunto de caracteres por outro), deleção (-d) e compressão de repetições (-s).

Para tradução, forneça dois conjuntos de caracteres: o primeiro será mapeado para o segundo, posição a posição. Cuidado com intervalos: tr 'a-z' 'A-Z' converte minúsculas em maiúsculas. A deleção remove todos os caracteres do conjunto especificado. A compressão substitui sequências repetidas de um caractere por uma única ocorrência.

# Converter minúsculas em maiúsculas
echo "hello world" | tr 'a-z' 'A-Z'

# Remover todos os dígitos
echo "abc123def456" | tr -d '0-9'

# Comprimir espaços múltiplos
echo "a    b   c" | tr -s ' '

Combinações

A verdadeira potência surge ao combinar cut e tr em pipelines com outros comandos como grep, sort e uniq. Por exemplo, podemos extrair um campo, transformá-lo para maiúsculas e depois contar ocorrências.

É comum usar cut para isolar uma coluna e tr para limpar o dado (remover espaços extras, converter para minúsculas, etc.). Lembre-se de que cut não aceita delimitadores multi-caractere; para isso, prefira awk.

# Extrair o shell padrão dos usuários, converter para maiúsculas e mostrar únicos
cut -d: -f7 /etc/passwd | tr 'a-z' 'A-Z' | sort -u

# Extrair o nome de usuário, remover linhas vazias e contar ocorrências (exemplo artificial)
cut -d: -f1 /etc/passwd | tr -d ' ' | sort | uniq -c

Exemplos

Vamos a alguns exemplos práticos que ilustram o uso cotidiano desses comandos.

# Exemplo 1: Listar apenas os nomes de usuário (primeiro campo) do /etc/passwd
cut -d: -f1 /etc/passwd

# Exemplo 2: Obter o UID e nome de usuário, trocando a ordem (cut não reordena, então usamos awk)
awk -F: '{print $3 ":" $1}' /etc/passwd

# Exemplo 3: Remover caracteres não alfabéticos de uma string
echo "Hello, World! 123" | tr -d -c 'a-zA-Z '

# Exemplo 4: Comprimir espaços e substituir por vírgulas
echo "nome  idade cidade" | tr -s ' ' | tr ' ' ','

# Exemplo 5: Extrair o endereço IP de um log (supondo formato: [IP] ...)
grep "^\[" log.txt | cut -d']' -f1 | tr -d '['

Boas práticas

Sempre teste seus comandos em um pequeno conjunto de dados antes de aplicá-los em produção. Use head para limitar a saída durante testes. Lembre-se de que cut e tr trabalham com bytes, não caracteres Unicode, então cuidado com acentos. Prefira awk para manipulações mais complexas de campos.

Referências

Exercícios

  1. Usando cut, extraia o nome de usuário e o diretório home (campos 1 e 6) do arquivo /etc/passwd, separados por dois-pontos.
  2. ✓ Resposta:
    cut -d: -f1,6 /etc/passwd
  3. Converta o conteúdo do arquivo texto.txt para maiúsculas usando tr.
  4. ✓ Resposta:
    tr 'a-z' 'A-Z' < texto.txt
  5. Remova todos os dígitos da string "Linux 2024 Shell Script" usando tr.
  6. ✓ Resposta:
    echo "Linux 2024 Shell Script" | tr -d '0-9'
  7. Extraia o segundo campo (separado por vírgula) de cada linha do arquivo dados.csv, removendo espaços em branco ao redor.
  8. ✓ Resposta:
    cut -d',' -f2 dados.csv | tr -d ' '
  9. Comprima múltiplos espaços consecutivos em um único espaço e depois substitua espaços por underline em uma string.
  10. ✓ Resposta:
    echo "a   b   c" | tr -s ' ' | tr ' ' '_'