Nesta aula, vamos explorar dois comandos essenciais no shell Linux/Bash: wc e tee. O wc (word count) é uma ferramenta para contar linhas, palavras e bytes em arquivos ou entrada padrão. Já o tee permite redirecionar a saída de um comando para um ou mais arquivos, mantendo-a visível no terminal. Ambos são amplamente utilizados em scripts e pipelines para análise de dados e registro de logs.

Dominar esses comandos aumenta sua produtividade ao processar textos e gerenciar saídas de comandos. Veremos desde o uso básico até exemplos combinados, que ilustram a versatilidade dessas ferramentas no dia a dia de um desenvolvedor ou administrador de sistemas.

Contagem (linhas, palavras, bytes)

O comando wc é um utilitário clássico do Unix que conta caracteres, palavras e linhas de um arquivo ou da entrada padrão. Sua sintaxe básica é wc [opções] [arquivo]. Sem opções, ele exibe três números: linhas, palavras e bytes (nesta ordem).

As opções mais comuns são:

  • -l: conta apenas linhas
  • -w: conta apenas palavras
  • -c: conta apenas bytes (equivalente a -m para caracteres, mas em UTF-8 bytes ≠ caracteres)
  • -m: conta caracteres (útil para textos multibyte)
  • -L: mostra o comprimento da linha mais longa

Exemplo básico:

$ wc /etc/passwd
  45  102 2540 /etc/passwd

Isso indica 45 linhas, 102 palavras e 2540 bytes. Para contar apenas linhas:

$ wc -l /etc/passwd
45 /etc/passwd

O wc aceita múltiplos arquivos e exibe totais no final:

$ wc file1.txt file2.txt
  10   50  300 file1.txt
  20  100  600 file2.txt
  30  150  900 total

Também pode ser usado com pipe para contar saída de outros comandos:

$ ls -l | wc -l
15

Isso conta quantos arquivos/diretórios estão no diretório atual (incluindo a linha de total).

tee (dividir saída)

O comando tee lê da entrada padrão e escreve simultaneamente na saída padrão e em um ou mais arquivos. É útil para salvar a saída de um comando enquanto ainda a vê no terminal. Sintaxe: comando | tee [opções] arquivo1 [arquivo2 ...].

Opções importantes:

  • -a (append): adiciona ao final do arquivo em vez de sobrescrever
  • -i (ignore interrupts): ignora sinais de interrupção

Exemplo básico:

$ echo "Olá, mundo!" | tee saida.txt
Olá, mundo!
$ cat saida.txt
Olá, mundo!

Para adicionar a um arquivo existente:

$ echo "Nova linha" | tee -a saida.txt
Nova linha

O tee é frequentemente usado em pipelines para criar logs intermediários. Por exemplo, para monitorar a saída de um comando longo enquanto a salva:

$ ./script_demorado.sh | tee log.txt

Também é possível escrever em múltiplos arquivos:

$ ps aux | tee processos.txt usuarios.txt | head -5

Isso salva a lista completa em ambos os arquivos, mas exibe apenas as primeiras 5 linhas no terminal.

Casos de uso

Auditoria e logs: Use tee para gravar logs de comandos executados em scripts, mantendo a saída visível para depuração. Exemplo:

$ ./deploy.sh | tee -a deploy.log

Contagem de arquivos: Combine find com wc -l para contar arquivos de um tipo:

$ find . -name "*.txt" | wc -l

Análise de logs: Use grep com wc para contar ocorrências de padrões:

$ grep "ERROR" /var/log/syslog | wc -l

Processamento paralelo: Com tee, você pode dividir a saída para diferentes processos, embora isso exija redirecionamento avançado.

Monitoramento de pipeline: Insira tee em pontos estratégicos de um pipeline para inspecionar dados intermediários.

Exemplos

Exemplo 1: Contar palavras de um arquivo e salvar resultado

$ wc -w relatorio.txt | tee contagem.txt
150 relatorio.txt
$ cat contagem.txt
150 relatorio.txt

Exemplo 2: Listar diretórios e contar linhas, salvando a lista

$ ls -la | tee listagem.txt | wc -l
25

Isso salva a listagem completa e exibe o número de linhas (25).

Exemplo 3: Gerar um log com data/hora

$ echo "Início da tarefa: $(date)" | tee -a tarefa.log
Início da tarefa: Mon Feb 19 10:30:00 UTC 2025

Exemplo 4: Contar linhas de múltiplos arquivos com total

$ wc -l arquivo1.txt arquivo2.txt
  10 arquivo1.txt
  20 arquivo2.txt
  30 total

Exemplo 5: Usar tee com sudo para gravar em arquivo protegido

$ echo "config" | sudo tee /etc/meuapp.conf

Isso escreve no arquivo com privilégios elevados.

Boas Práticas

  • Sempre verifique permissões ao usar tee com sudo.
  • Prefira wc -l em vez de wc puro quando só precisar de linhas, para evitar processamento extra.
  • Use tee -a para logs incrementais, evitando perda de dados.
  • Combine tee com grep para filtrar e salvar ao mesmo tempo: comando | tee log.txt | grep padrão.

Referências

Exercícios

  1. Conte o número de linhas do arquivo /etc/passwd usando wc e salve o resultado em linhas.txt com tee.
  2. ✓ Resposta:
    $ wc -l /etc/passwd | tee linhas.txt
  3. Use wc para contar o número de palavras no arquivo /etc/hostname.
  4. ✓ Resposta:
    $ wc -w /etc/hostname
  5. Crie um pipeline que liste o diretório atual com ls -l, salve a saída em listagem.txt e exiba apenas as primeiras 3 linhas no terminal.
  6. ✓ Resposta:
    $ ls -l | tee listagem.txt | head -3
  7. Conte quantos arquivos .txt existem no diretório atual e subdiretórios, usando find e wc.
  8. ✓ Resposta:
    $ find . -name "*.txt" | wc -l
  9. Use tee para escrever a saída do comando date em dois arquivos: data1.txt e data2.txt ao mesmo tempo.
  10. ✓ Resposta:
    $ date | tee data1.txt data2.txt