Extraindo e transformando: cut e tr
Esta aula aborda os comandos cut e tr no shell Linux/Bash, que permitem extrair e transformar dados de texto de forma eficiente. Você aprenderá a usar cut para selecionar campos e caracteres, tr para traduzir e deletar caracteres, e como combinar esses comandos para manipulação avançada de strings.
Em scripts shell, frequentemente precisamos processar dados textuais, seja extraindo partes específicas de linhas ou transformando caracteres. Os comandos cut e tr são ferramentas fundamentais para essas tarefas. Enquanto cut fatia linhas em campos ou caracteres, tr realiza traduções ou deleções de caracteres de forma eficiente. Dominá-los é essencial para manipulação de arquivos CSV, logs, e saídas de comandos.
Nesta aula, exploraremos cada comando em detalhes, com exemplos práticos, e veremos como combiná-los para resolver problemas comuns de processamento de texto.
cut por campo e caractere
O comando cut extrai seções de cada linha de um arquivo ou da entrada padrão. Ele pode operar de duas formas principais: por caractere (usando a opção -c) ou por campo delimitado (usando -d e -f).
Para extrair por caractere, especificamos as posições dos caracteres desejados. Por exemplo, cut -c1-5 extrai os primeiros 5 caracteres de cada linha. Já para extrair campos, definimos um delimitador com -d (padrão é tab) e selecionamos os campos com -f. Por exemplo, cut -d: -f1,3 extrai o primeiro e terceiro campos de linhas separadas por dois-pontos.
# Extrair primeiros 5 caracteres de cada linha do arquivo /etc/passwd
cut -c1-5 /etc/passwd
# Extrair primeiro e terceiro campos separados por ':'
cut -d: -f1,3 /etc/passwd
# Exemplo com pipe: listar apenas nomes de usuário (primeiro campo)
cat /etc/passwd | cut -d: -f1tr (tradução, deleção)
O comando tr (translate) é usado para traduzir ou deletar caracteres. Ele opera sobre a entrada padrão e escreve na saída padrão. A sintaxe básica é tr [opções] conjunto1 [conjunto2]. Se apenas um conjunto é fornecido, o comando deleta os caracteres desse conjunto (com -d). Se dois conjuntos são fornecidos, cada caractere do primeiro é substituído pelo correspondente no segundo.
Exemplos comuns incluem converter letras minúsculas para maiúsculas (tr 'a-z' 'A-Z'), deletar espaços (tr -d ' '), ou comprimir repetições (tr -s ' ').
# Converter para maiúsculas
echo "hello world" | tr 'a-z' 'A-Z'
# Deletar todos os dígitos
echo "abc123def" | tr -d '0-9'
# Comprimir espaços múltiplos em um único
echo "a b c" | tr -s ' 'Combinações
A verdadeira potência surge quando combinamos cut e tr com pipes. Por exemplo, podemos extrair um campo com cut e depois transformar seu conteúdo com tr. Isso é comum em pipelines de processamento de logs ou arquivos de configuração.
Outra combinação útil é usar tr para substituir delimitadores antes de usar cut. Por exemplo, se um arquivo usa vírgulas como delimitadores, mas queremos extrair o segundo campo, podemos primeiro substituir vírgulas por tabs com tr e então usar cut.
# Extrair nomes de usuário e converter para maiúsculas
cat /etc/passwd | cut -d: -f1 | tr 'a-z' 'A-Z'
# Substituir vírgulas por tabs e extrair segundo campo
echo "nome,idade,cidade" | tr ',' '\t' | cut -f2
# Extrair o terceiro campo de um CSV e deletar espaços
cut -d',' -f3 dados.csv | tr -d ' 'Exemplos
Vamos a alguns exemplos práticos que ilustram o uso combinado de cut e tr em situações reais.
# Exemplo 1: Listar todos os shells únicos do /etc/passwd (último campo)
cut -d: -f7 /etc/passwd | sort | uniq
# Exemplo 2: Extrair o endereço IP da saída do ifconfig (formato antigo)
ifconfig eth0 | grep 'inet ' | tr -s ' ' | cut -d' ' -f3
# Exemplo 3: Contar ocorrências de cada caractere em uma string
echo "banana" | tr -d '\n' | fold -w1 | sort | uniq -c
# Exemplo 4: Remover linhas em branco de um arquivo (usando grep, mas com tr)
cat arquivo.txt | tr -s '\n' | grep -v '^$'
# Exemplo 5: Converter um arquivo CSV para TSV (substituir vírgulas por tabs)
tr ',' '\t' < dados.csv > dados.tsvBoas práticas e observações finais
Sempre verifique se o delimitador usado em cut é consistente. Se houver variações, considere usar awk ou sed para maior flexibilidade. Lembre-se de que tr não aceita argumentos de arquivo diretamente; use redirecionamento ou pipe. Além disso, tr opera em caracteres, não em strings; para substituições de strings, prefira sed.
Referências
- GNU Coreutils: cut
- GNU Coreutils: tr
- cut(1) - Linux manual page
- tr(1) - Linux manual page
- Bash Reference Manual
- Advanced Bash-Scripting Guide
Exercícios
Usando
cut, extraia o segundo campo (separado por ':') do arquivo /etc/passwd. O segundo campo geralmente é 'x' ou uma senha criptografada.✓ Resposta:cut -d: -f2 /etc/passwdConverta a string "linux é legal" para MAIÚSCULAS usando
tr.✓ Resposta:echo "linux é legal" | tr 'a-z' 'A-Z'Extraia o nome de usuário (primeiro campo) do /etc/passwd e converta para maiúsculas em um único comando.
✓ Resposta:cut -d: -f1 /etc/passwd | tr 'a-z' 'A-Z'Considere o arquivo dados.csv com linhas como "João,30,RJ". Use
trecutpara extrair apenas a idade (segundo campo).✓ Resposta:cat dados.csv | tr ',' '\t' | cut -f2Remova todos os dígitos da string "abc123def456" usando
tr.✓ Resposta:echo "abc123def456" | tr -d '0-9'