Exercicios de find, grep e awk - Resolucao de Problemas e Desenvolvimento de Habilidades Praticas
O episodio final. Cobre exercicios de validacao de habilidades, correcoes de problemas comuns e um roteiro de crescimento. O polimento final no seu caminho para se tornar um usuario avancado de Linux.
O Que Voce Vai Aprender
- Problemas tipicos com find, grep e awk que voce encontra em producao
- Exercicios e desafios para validar suas habilidades
- Um roteiro de aprendizado para crescimento continuo
- Um encerramento final no seu caminho para se tornar um usuario avancado de Linux
Problemas Comuns e Correcoes
Conclusao: Conheca antecipadamente as armadilhas tipicas de find, grep e awk e suas correcoes.
Se voce usa esses comandos em producao, vai encontrar esses problemas tipicos. Conheca as correcoes antecipadamente.
Problemas com o Comando find
Uma enxurrada de erros "Permission denied"
Sintomas:
find: '/root': Permission denied find: '/proc/1': Permission denied
Correcoes:
# Opcao 1: Suprimir saida de erro find / -name "*.txt" 2>/dev/null # Opcao 2: Buscar apenas em locais que voce tem acesso find /home /var /tmp -name "*.txt" # Opcao 3: Executar com sudo (use com cuidado) sudo find / -name "*.txt"
Erros quando nomes de arquivo contem espacos
Sintoma: "My Document.txt" e interpretado como "My", "Document.txt".
Correcoes:
# Usar -print0 com xargs -0
find /home -name "*.txt" -print0 | xargs -0 rm
# Usar -exec com +
find /home -name "*.txt" -exec rm {} +Buscas estao muito lentas
Correcoes:
- Pular diretorios indesejados com
-path - Limitar profundidade com
-maxdepth - Filtrar arquivos com
-type f
find /var -maxdepth 3 -type f -path "*/node_modules" -prune -o -name "*.log" -print
Problemas com o Comando grep
Caracteres multibyte (ex: japoneses) nao sao buscados corretamente
Correcoes:
# Verificar e definir locale export LANG=en_US.UTF-8 grep "error" logfile.txt # Evitar classificacao como binario grep -a "error" logfile.txt
Regex nao se comporta como esperado
Problemas comuns: +, ?, {} tratados como literais, agrupamento com () nao suportado.
Correcoes:
# Usar -E para regex estendida grep -E "colou?r" file.txt grep -E "(http|https)://" file.txt # Usar o alias egrep egrep "colou?r" file.txt
Erro de correspondencia em arquivo binario
Sintoma: Binary file image.jpg matches
Correcoes:
# Buscar apenas em arquivos de texto grep -I "pattern" * # Restringir tipos de arquivo grep -r --include="*.txt" --include="*.log" "pattern" .
Problemas com o Comando awk
Campos nao sao divididos como esperado
Sintoma: CSV com virgulas dentro de campos entre aspas, ex: "Tanaka","28","Tokyo, Shibuya","Engineer, Team Lead".
Correcoes:
# Usar uma ferramenta dedicada csvtool col 1,2 data.csv # Processar via Python python3 -c " import csv, sys reader = csv.reader(sys.stdin) for row in reader: print(row[0], row[1]) " < data.csv
Problemas de precisao numerica
Sintoma: Calculos decimais sao imprecisos (esperado 10.50, obtido 10.5000000001).
Correcoes:
# Usar printf com precisao
awk '{sum+=$1} END {printf "%.2f\n", sum}' numbers.txt
# Processar via bc
awk '{print $1}' numbers.txt | paste -sd+ | bcTecnicas de Depuracao
Verifique incrementalmente
Execute comandos complexos parte por parte.
# Comando final find /var/log -name "*.log" | xargs grep -l "ERROR" | xargs wc -l # Passos de depuracao # 1. Executar apenas a parte do find find /var/log -name "*.log" # 2. Executar ate o grep find /var/log -name "*.log" | xargs grep -l "ERROR" # 3. Executar o comando completo find /var/log -name "*.log" | xargs grep -l "ERROR" | xargs wc -l
Salvar resultados intermediarios
Para pipelines de longa duracao, salve a saida intermediaria.
find /var -name "*.log" > all_logs.txt grep -l "ERROR" $(cat all_logs.txt) > error_logs.txt wc -l $(cat error_logs.txt) > final_result.txt
Habilidades Adicionais
Agora que voce domina find, grep e awk, aqui estao as habilidades para aprender em seguida.
Comandos de Proximo Nivel
sed (editor de fluxo): Substituicao, exclusao e insercao rapida de texto.
sed 's/error/ERROR/g' logfile.txt
Prioridade: Mais alta.
xargs (conversao de argumentos): Converter saida de pipe em argumentos de linha de comando.
find . -name "*.txt" | xargs -P 4 wc -l
Prioridade: Mais alta.
sort/uniq (ordenar e deduplicar): Reordenar dados e deduplicar.
cat access.log | awk '{print $1}' | sort | uniq -c | sort -rnPrioridade: Alta.
join/paste (juncao de arquivos): Mesclar dados de multiplos arquivos.
join -t, file1.csv file2.csv
Prioridade: Media.
Exercicios e Desafios
Conclusao: Exercicios praticos e graduais permitem verificar e consolidar suas habilidades.
Consolide habilidades com pratica. Enfrente esses desafios para verificar seu nivel.
Desafios para Iniciantes
Desafio 1: Basicos de busca de arquivos
Em /var/log e subpastas, encontre arquivos com extensao .log que tenham 1MB ou mais.
Desafio 1 - Mostrar dica
Combine -name e -size com find.
Desafio 1 - Mostrar solucao
find /var/log -name "*.log" -size +1M
Desafio 2: Basicos de busca de texto
Busque em system.log por linhas contendo "ERROR" e mostre com numeros de linha.
Desafio 2 - Mostrar solucao
grep -n "ERROR" system.log
Desafio 3: Basicos de agregacao de dados
Calcule a soma da coluna 3 (vendas) em sales.csv.
Desafio 3 - Mostrar solucao
awk -F',' '{sum += $3} END {print "Soma:", sum}' sales.csvDesafios Intermediarios
Desafio 4: Pipeline de analise de logs
Conte os enderecos IP unicos de hoje no log de acesso.
Desafio 4 - Mostrar dica
Filtre pela data de hoje com grep, extraia o IP com awk, deduplicar com sort/uniq.
Desafio 4 - Mostrar solucao
grep "$(date '+%d/%b/%Y')" access.log | awk '{print $1}' | sort -u | wc -lDesafio 5: Busca em arquivos grandes
A partir do diretorio home, encontre os 5 maiores arquivos com 100MB ou mais e exiba por tamanho.
Desafio 5 - Mostrar solucao
find /home -type f -size +100M -exec ls -lh {} \; | sort -rh -k5 | head -5Desafio 6: Relatorio de estatisticas de erros
A partir de multiplos arquivos de log, agregue categorias de erros e mostre em ordem decrescente.
Desafio 6 - Mostrar solucao
find /var/log -name "*.log" | xargs grep -h "ERROR" | awk '{print $4}' | sort | uniq -c | sort -rnDesafios Avancados
Desafio 7: Script de monitoramento de website
A partir dos logs de acesso do Apache, encontre IPs com 10 ou mais erros 404 na ultima hora e produza mensagens de alerta.
Desafio 7 - Mostrar dica
Filtre por hora, extraia 404, agrupe por IP, filtre por limite.
Desafio 7 - Mostrar solucao
hour_ago=$(date -d '1 hour ago' '+%d/%b/%Y:%H')
current_hour=$(date '+%d/%b/%Y:%H')
grep -E "($hour_ago|$current_hour)" /var/log/apache2/access.log | \
grep " 404 " | \
awk '{print $1}' | \
sort | uniq -c | \
awk '$1 >= 10 {printf "ALERTA: IP %s tem %d erros 404 na ultima hora\n", $2, $1}'Desafio 8: Verificacao de qualidade de dados
Construa um script que verifique a qualidade dos dados CSV e reporte total de linhas/colunas, linhas vazias, valores unicos por coluna e min/max/media das colunas numericas.
Desafio 8 - Mostrar solucao
awk -F',' '
NR == 1 {
num_columns = NF
for (i = 1; i <= NF; i++) headers[i] = $i
next
}
NF == 0 { empty_lines++; next }
{
total_rows++
for (i = 1; i <= num_columns && i <= NF; i++) {
field_values[i][$i] = 1
if ($i ~ /^[0-9]+\.?[0-9]*$/) {
numeric_count[i]++
numeric_sum[i] += $i
if (numeric_min[i] == "" || $i < numeric_min[i]) numeric_min[i] = $i
if (numeric_max[i] == "" || $i > numeric_max[i]) numeric_max[i] = $i
}
}
}
END {
printf "Linhas: %d\n", total_rows
printf "Colunas: %d\n", num_columns
printf "Linhas vazias: %d\n", empty_lines + 0
for (i = 1; i <= num_columns; i++) {
printf "Col%d (%s): unicos=%d", i, headers[i], length(field_values[i])
if (numeric_count[i] > 0) {
avg = numeric_sum[i] / numeric_count[i]
printf ", min=%.2f, max=%.2f, media=%.2f", numeric_min[i], numeric_max[i], avg
}
print ""
}
}' data.csvDesafio 9: Script de backup automatizado
Construa um script de backup para arquivos importantes. Apenas arquivos alterados desde o ultimo backup; apenas arquivos menores que 100MB; registre todas as operacoes de backup; exclua automaticamente backups antigos (mais de 7 dias).
Desafio 9 - Mostrar solucao
#!/bin/bash
BACKUP_DIR="/backup/$(date +%Y%m%d_%H%M%S)"
LAST_BACKUP_MARKER="/var/log/last_backup.timestamp"
LOG_FILE="/var/log/backup.log"
echo "=== Backup iniciado em $(date) ===" >> "$LOG_FILE"
mkdir -p "$BACKUP_DIR"
find /home/important -type f -size -100M -newer "$LAST_BACKUP_MARKER" 2>/dev/null | \
while read file; do
rel_path="${file#/home/important/}"
backup_path="$BACKUP_DIR/$rel_path"
backup_dir=$(dirname "$backup_path")
mkdir -p "$backup_dir"
if cp "$file" "$backup_path" 2>/dev/null; then
echo "Backup realizado: $file" >> "$LOG_FILE"
fi
done
# Excluir backups antigos
find /backup -type d -mtime +7 -exec rm -rf {} + 2>/dev/null
# Atualizar timestamp
date > "$LAST_BACKUP_MARKER"Desafio Mestre
Desafio 10: Painel de monitoramento abrangente do sistema
Construa um script de monitoramento do sistema com:
- Monitoramento de logs em tempo real
- Alerta automatico sobre erros
- Visualizacao de uso de recursos
- Geracao de relatorio diario
- Confirmacao via web (relatorio HTML)
Desafio 10 - Dica de abordagem
Use tail -f para monitoramento em tempo real, awk para estatisticas, find para gerenciamento de arquivos antigos, templates HTML para relatorios.
Completar este desafio significa que voce pode se chamar com confianca de usuario avancado de Linux.