Extraindo e transformando: cut e tr
Esta aula aborda os comandos cut e tr no shell script, essenciais para extrair e transformar dados de arquivos texto ou streams. Você aprenderá a usar cut para selecionar campos ou caracteres específicos e tr para substituir, deletar ou comprimir caracteres, além de combiná-los em pipelines poderosos.
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
- GNU Coreutils: cut invocation
- GNU Coreutils: tr invocation
- man page cut (1)
- man page tr (1)
- GNU Bash Manual
Exercícios
- 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. - Converta o conteúdo do arquivo
texto.txtpara maiúsculas usandotr. - Remova todos os dígitos da string "Linux 2024 Shell Script" usando
tr. - Extraia o segundo campo (separado por vírgula) de cada linha do arquivo
dados.csv, removendo espaços em branco ao redor. - Comprima múltiplos espaços consecutivos em um único espaço e depois substitua espaços por underline em uma string.
cut -d: -f1,6 /etc/passwd
tr 'a-z' 'A-Z' < texto.txt
echo "Linux 2024 Shell Script" | tr -d '0-9'
cut -d',' -f2 dados.csv | tr -d ' '
echo "a b c" | tr -s ' ' | tr ' ' '_'