🧩 Exercícios: Shell Scripting e Pipes POSIX
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)
- Salve o arquivo como:
Atividade_03_1_SeuNome.sh - 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