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: -f1

tr (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.tsv

Boas 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

Exercícios

  1. 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/passwd
  2. Converta a string "linux é legal" para MAIÚSCULAS usando tr.

    ✓ Resposta:
    echo "linux é legal" | tr 'a-z' 'A-Z'
  3. 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'
  4. Considere o arquivo dados.csv com linhas como "João,30,RJ". Use tr e cut para extrair apenas a idade (segundo campo).

    ✓ Resposta:
    cat dados.csv | tr ',' '\t' | cut -f2
  5. Remova todos os dígitos da string "abc123def456" usando tr.

    ✓ Resposta:
    echo "abc123def456" | tr -d '0-9'