Exercicios de find, grep e awk - Resolucao de Problemas e Desenvolvimento de Habilidades Praticas

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+ | bc

Tecnicas 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 -rn

Prioridade: 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.csv

Desafios 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 -l

Desafio 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 -5

Desafio 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 -rn

Desafios 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.csv

Desafio 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.

Conclusao: Primeiro Passo para Usuario Avancado de Linux

Esta serie cobriu find, grep e awk em detalhes, desde o basico ate aplicacoes praticas. Dominar esses comandos leva voce ao nivel de um verdadeiro usuario avancado de Linux.

Habilidades Adquiridas

  • find: Buscar arquivos e diretorios sob qualquer condicao, rapidamente
  • grep: Busca avancada de texto com regex
  • awk: Processamento de dados, agregacao, geracao de relatorios
  • Combinacoes eficazes dos tres comandos
  • Otimizacao de desempenho e resolucao de problemas
  • Estudos de caso da industria e habilidades de producao
  • Exercicios e validacao de habilidades

Recapitulacao da Serie

  • Basico -- Visao geral dos comandos e basicos de regex
  • Avancado -- grep e awk de alto nivel
  • Pratico -- Combinacoes e uso em producao
  • Profissional -- Exercicios e resolucao de problemas (este artigo)

Resultados Esperados

  • Produtividade: Automatizar a maior parte do trabalho manual
  • Resolucao de problemas: Lidar rapidamente com analise de logs e investigacao de dados
  • Carreira: Abrir caminhos para infraestrutura, dados e DevOps

Pratique agora

O mais importante e aplicar o que voce aprendeu no seu trabalho real. Pratica com o Penguin Gym Linux e uso diario desses comandos transformarao conhecimento em habilidades.