Cut, sort, uniq, wc: ferramentas de texto essenciais

1. Introdução às ferramentas de texto do Unix

1.1. O paradigma "faça uma coisa bem feita"

O Unix foi construído sobre um princípio fundamental: cada ferramenta deve executar uma única tarefa com excelência. Cut, sort, uniq e wc são exemplos clássicos desse design minimalista e poderoso. Em vez de programas monolíticos que tentam fazer tudo, temos comandos especializados que, quando combinados, resolvem problemas complexos de processamento de texto.

1.2. Como cut, sort, uniq e wc se encaixam no pipeline de shell

O verdadeiro poder dessas ferramentas emerge quando as conectamos através de pipes (|). A saída de um comando vira entrada do próximo, criando fluxos de transformação de dados. Um pipeline típico pode extrair campos com cut, ordenar com sort, eliminar duplicatas com uniq e, finalmente, contar resultados com wc.

1.3. Visão geral dos casos de uso comuns

Essas ferramentas são onipresentes em tarefas do dia a dia: análise de logs de servidor, processamento de arquivos CSV, limpeza de listas, relatórios estatísticos rápidos e diagnóstico de sistemas. Dominá-las significa resolver em segundos o que levaria minutos em outras linguagens.

2. Cut: extraindo colunas e campos

2.1. Delimitadores com -d e seleção de campos com -f

O cut extrai partes específicas de cada linha. Com -d definimos o delimitador e com -f selecionamos os campos desejados.

$ echo "João:30:Engenheiro" | cut -d':' -f1,3
João:Engenheiro

2.2. Cortando por posição de caracteres com -c

Para dados de largura fixa, usamos -c para selecionar por posição de caractere:

$ echo "ABCDEFGH" | cut -c2-5
BCDE

2.3. Exemplos práticos: extraindo usuários de /etc/passwd e colunas de CSV

Extraindo apenas os nomes de usuário do sistema:

$ cut -d':' -f1 /etc/passwd | head -5
root
daemon
bin
sys
sync

Processando um CSV simples (separado por vírgula):

$ echo "nome,idade,cidade" > pessoas.csv
$ echo "Ana,28,SP" >> pessoas.csv
$ echo "Carlos,35,RJ" >> pessoas.csv
$ cut -d',' -f1,3 pessoas.csv
nome,cidade
Ana,SP
Carlos,RJ

3. Sort: ordenando dados

3.1. Ordenação numérica (-n) vs. alfabética e reversa (-r)

Por padrão, sort ordena alfabeticamente. Para números, use -n:

$ cat numeros.txt
10
2
33
1

$ sort numeros.txt
1
10
2
33

$ sort -n numeros.txt
1
2
10
33

A flag -r inverte a ordem:

$ sort -rn numeros.txt
33
10
2
1

3.2. Ordenação por campos específicos com -k

Com -k podemos especificar qual campo usar como chave de ordenação:

$ cat funcionarios.txt
Ana:5000
Carlos:3500
Beatriz:8000

$ sort -t':' -k2 -rn funcionarios.txt
Beatriz:8000
Ana:5000
Carlos:3500

3.3. Tratamento de separadores e ordenação estável (-s)

A ordenação estável (-s) preserva a ordem original de linhas com chaves iguais. Útil quando combinamos múltiplas ordenações:

$ sort -s -k1,1 arquivo.txt

4. Uniq: removendo ou contando duplicatas

4.1. Funcionamento básico: uniq exige dados ordenados

O uniq compara apenas linhas adjacentes. Por isso, os dados precisam estar ordenados primeiro:

$ cat frutas.txt
maçã
banana
maçã
laranja
banana

$ sort frutas.txt | uniq
banana
laranja
maçã

4.2. Contagem de ocorrências com -c e exibição de repetidos com -d

A flag -c adiciona a contagem de cada linha única:

$ sort frutas.txt | uniq -c
   2 banana
   1 laranja
   2 maçã

Para ver apenas linhas que aparecem mais de uma vez:

$ sort frutas.txt | uniq -d
banana
maçã

4.3. Ignorando campos com -f e caracteres com -s

Podemos ignorar campos ou caracteres iniciais na comparação:

$ cat dados.txt
2024 A 100
2024 B 200
2024 A 150

$ sort dados.txt | uniq -f1 -c
   2 2024 A 100
   1 2024 B 200

5. Wc: contando linhas, palavras e caracteres

5.1. Flags essenciais: -l, -w, -c e -m

wc conta linhas (-l), palavras (-w), bytes (-c) e caracteres (-m):

$ echo "Olá mundo" | wc -l -w -c
1 2 10

5.2. Uso combinado: contagem de linhas em arquivos de log

Contando quantas linhas têm nos logs do sistema:

$ wc -l /var/log/syslog
15230 /var/log/syslog

Contando total de linhas em múltiplos arquivos:

$ wc -l *.log
  1200 acesso.log
   800 erro.log
  2000 total

5.3. Diferença entre bytes (-c) e caracteres (-m) em UTF-8

Em UTF-8, caracteres acentuados ocupam mais de um byte:

$ echo "café" | wc -c
5
$ echo "café" | wc -m
4

6. Combinando as ferramentas em pipelines

6.1. Pipeline clássico: cut | sort | uniq -c | sort -rn

Este pipeline é o padrão ouro para análise de frequência:

$ cut -d' ' -f1 acesso.log | sort | uniq -c | sort -rn | head -10

6.2. Análise de logs: extraindo IPs, ordenando e contando requisições

Analisando os IPs mais frequentes em um log de servidor web:

$ cut -d' ' -f1 /var/log/apache2/access.log | sort | uniq -c | sort -rn | head -5
  342 192.168.1.100
  189 10.0.0.55
  120 203.0.113.42
   98 198.51.100.7
   75 172.16.0.1

6.3. Limpeza de listas: removendo duplicatas e gerando resumo estatístico

Processando uma lista de e-mails com duplicatas:

$ cat emails.txt
joao@email.com
maria@email.com
joao@email.com
ana@email.com
maria@email.com

$ sort emails.txt | uniq -c | sort -rn
   2 maria@email.com
   2 joao@email.com
   1 ana@email.com

7. Dicas avançadas e armadilhas comuns

7.1. Delimitadores de tabulação vs. espaços no cut

O cut trata tabulação como delimitador padrão. Para espaços múltiplos, considere usar tr ou awk:

$ echo "João   30" | cut -d' ' -f2  # Não funciona como esperado

7.2. Ordenação numérica com números negativos e floats

Para números com sinal ou ponto flutuante, -n funciona corretamente:

$ cat valores.txt
-5.5
3.2
-1.1
0.0

$ sort -n valores.txt
-5.5
-1.1
0.0
3.2

7.3. uniq sem sort: quando usar sort -u em vez do pipeline

Se você só precisa eliminar duplicatas (sem contar), sort -u é mais eficiente que sort | uniq:

$ sort -u arquivo.txt  # Equivalente a sort arquivo.txt | uniq

8. Conclusão e próximos passos

8.1. Resumo das capacidades de cada ferramenta

Cut, sort, uniq e wc formam a espinha dorsal do processamento de texto no shell. Cut extrai campos precisos, sort organiza dados, uniq remove ou conta repetições e wc quantifica resultados. Sozinhos são úteis, mas combinados em pipelines se tornam extraordinariamente poderosos.

8.2. Integração com sed, awk, tr e xargs

Para expandir seu arsenal, explore ferramentas complementares:
- sed para substituições e transformações
- awk para processamento avançado de campos
- tr para tradução e remoção de caracteres
- xargs para construir e executar comandos a partir da entrada

8.3. Exercícios sugeridos para fixação do conteúdo

  1. Extraia os 5 IPs mais frequentes de um arquivo de log
  2. Conte quantas palavras únicas existem em um texto
  3. Ordene uma lista de números decimais e remova duplicatas
  4. Calcule o total de linhas, palavras e caracteres de todos os arquivos .txt em um diretório
  5. Crie um pipeline que mostre os 3 usuários com mais processos rodando no sistema

Referências