wc e tee
Esta aula aborda os comandos wc e tee no shell Linux/Bash, explicando como contar linhas, palavras e bytes com wc, e como dividir a saída de comandos com tee, com exemplos práticos e casos de uso reais.
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-mpara 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/passwdIsso indica 45 linhas, 102 palavras e 2540 bytes. Para contar apenas linhas:
$ wc -l /etc/passwd
45 /etc/passwdO 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 totalTambém pode ser usado com pipe para contar saída de outros comandos:
$ ls -l | wc -l
15Isso 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 linhaO 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.txtTambém é possível escrever em múltiplos arquivos:
$ ps aux | tee processos.txt usuarios.txt | head -5Isso 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.logContagem de arquivos: Combine find com wc -l para contar arquivos de um tipo:
$ find . -name "*.txt" | wc -lAnálise de logs: Use grep com wc para contar ocorrências de padrões:
$ grep "ERROR" /var/log/syslog | wc -lProcessamento 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.txtExemplo 2: Listar diretórios e contar linhas, salvando a lista
$ ls -la | tee listagem.txt | wc -l
25Isso 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 2025Exemplo 4: Contar linhas de múltiplos arquivos com total
$ wc -l arquivo1.txt arquivo2.txt
10 arquivo1.txt
20 arquivo2.txt
30 totalExemplo 5: Usar tee com sudo para gravar em arquivo protegido
$ echo "config" | sudo tee /etc/meuapp.confIsso escreve no arquivo com privilégios elevados.
Boas Práticas
- Sempre verifique permissões ao usar
teecomsudo. - Prefira
wc -lem vez dewcpuro quando só precisar de linhas, para evitar processamento extra. - Use
tee -apara logs incrementais, evitando perda de dados. - Combine
teecomgreppara filtrar e salvar ao mesmo tempo:comando | tee log.txt | grep padrão.
Referências
- GNU Coreutils: wc invocation
- GNU Coreutils: tee invocation
- man page: wc
- man page: tee
- Advanced Bash-Scripting Guide
Exercícios
- Conte o número de linhas do arquivo
/etc/passwdusandowce salve o resultado emlinhas.txtcomtee. - Use
wcpara contar o número de palavras no arquivo/etc/hostname. - Crie um pipeline que liste o diretório atual com
ls -l, salve a saída emlistagem.txte exiba apenas as primeiras 3 linhas no terminal. - Conte quantos arquivos
.txtexistem no diretório atual e subdiretórios, usandofindewc. - Use
teepara escrever a saída do comandodateem dois arquivos:data1.txtedata2.txtao mesmo tempo.
$ wc -l /etc/passwd | tee linhas.txt$ wc -w /etc/hostname$ ls -l | tee listagem.txt | head -3$ find . -name "*.txt" | wc -l$ date | tee data1.txt data2.txt