Extra Guia de Ferramentas • Trilha Progressiva em 4 Níveis


🎯 Nível 1: Fundamentos

Problema 3.1 — Pipeline de Análise de Frequência de IP em Logs do Nginx

Contexto: Dado um arquivo access.log do Nginx onde a primeira coluna ($1) contém o endereço IP do cliente, monte um pipeline em uma única linha (one-liner) que liste os 5 endereços IP com maior volume de requisições.

Resultado Esperado

awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -n 5

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_03_1_SeuNome.sh
  2. Envie na tarefa: Atividade Cap 03 - Shell Scripting e Pipes
🔑 Gabarito de Código & Solução Comentada
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -n 5

Comentário: O comando sort antes do uniq -c é mandatório porque o uniq agrupa apenas linhas adjacentes consecutivas. O sort -nr final ordena numericamente em ordem decrescente.


🎯 Nível 2: Prática

Problema 3.2 — Script de Backup Automatizado com Rotação e Timestamps

Escreva um script Bash que comprima a pasta /var/data em formato .tar.gz com nome contendo data e hora (backup_YYYYMMDD_HHMMSS.tar.gz), salve em /backups/ e exclua backups com mais de 7 dias usando find.

🔑 Gabarito de Código & Solução Comentada
#!/usr/bin/env bash
set -euo pipefail

DEST_DIR="/backups"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
ARQUIVO_BACKUP="${DEST_DIR}/backup_${TIMESTAMP}.tar.gz"

mkdir -p "$DEST_DIR"

echo "Iniciando backup em: $ARQUIVO_BACKUP"
tar -czf "$ARQUIVO_BACKUP" -C /var data

echo "Removendo backups com mais de 7 dias..."
find "$DEST_DIR" -type f -name "backup_*.tar.gz" -mtime +7 -delete

echo "✅ Backup concluído com sucesso!"

🎯 Nível 3: Integração

Problema 3.3 — Processamento Paralelo com xargs -P e Compressão de Imagens

Escreva um script que localize todas as imagens .png em uma árvore de diretórios e utilize find -print0, xargs -0 -P 8 e optipng para otimizá-las paralelamente em até 8 núcleos de CPU.

🔑 Gabarito de Código & Solução Comentada
#!/usr/bin/env bash
set -euo pipefail

echo "Otimizando imagens PNG em paralelo (8 workers)..."
find . -type f -name "*.png" -print0 | xargs -0 -P 8 -n 1 optipng -o2

echo "✅ Todas as imagens foram otimizadas!"

🎯 Nível 4: Desafio

Problema 3.4 — CLI Interativa de Diagnóstico de Processos com fzf e awk

Desenvolva um script pkill-interactive.sh que liste todos os processos consumindo mais de 1% de CPU, exiba-os em uma interface interativa com fzf com preview detalhado e permita ao usuário matar (kill -9) o processo selecionado com confirmação.

🔑 Gabarito de Código & Solução Comentada
#!/usr/bin/env bash
set -euo pipefail

SELECAO=$(ps -eo pid,user,%cpu,%mem,comm --sort=-%cpu | awk 'NR>1 && $3>0.5 {print $0}' | fzf \
    --header="Selecione um processo para encerrar (ENTER para matar, ESC para cancelar)" \
    --preview="ps -u {2} -o pid,comm,%cpu,%mem" \
    --preview-window=right:40%)

if [[ -n "$SELECAO" ]]; then
    PID=$(echo "$SELECAO" | awk '{print $1}')
    COMM=$(echo "$SELECAO" | awk '{print $5}')
    read -p "Tem certeza que deseja encerrar o processo '$COMM' (PID: $PID)? [s/N] " RESP
    if [[ "$RESP" =~ ^[sS]$ ]]; then
        kill -9 "$PID"
        echo "✅ Processo $PID ($COMM) encerrado com sucesso."
    else
        echo "Operação cancelada."
    fi
fi