Vim: Muito Além de um Editor de Texto
O vim é uma ferramenta onipresente. Sua filosofia de design foca na eficiência através de comandos combinados, onde a ação precede a digitação.
O editor opera em diferentes modos, sendo o modo normal o ponto de partida para navegação e execução de comandos, o modo de inserção para edição de texto e o modo visual para seleção de blocos.
graph TD
A[Modo Normal] -->|i, a, o| B(Modo Inserção)
B -->|Esc| A
A -->|v, V, Ctrl+v| C(Modo Visual)
C -->|Esc| A
A -->|:| D[Modo Linha de Comando]
D -->|Enter/Esc| A
A sintaxe do Vim pode ser comparada a uma linguagem natural, combinando verbos e objetos. Por exemplo, para deletar até o final da linha, usa-se d$. Para modificar as próximas três palavras, c3w. Para copiar até o fim do arquivo, yG.
Para comentar múltiplas linhas, como da linha 20 à 25 em um arquivo de configuração, pode-se usar substituição:
:20,25 s/^/# /
O Vim também possui um poderoso motor de busca com suporte a expressões regulares. Para encontrar endereços IPv6, por exemplo:
/[0-9a-fA-F]\{4\}\(:[0-9a-fA-F]\{4\}\)\{2,7\}
Configurações recomendadas no .vimrc para melhorar a busca:
set incsearch " Busca incremental
set ignorecase " Ignorar maiúsculas/minúsculas
set smartcase " Diferenciar se houver maiúsculas na busca
Para trabalhar com múltiplos arquivos, abra-os simultaneamente e use :ls para listar os buffers. A divisão de tela com :sp (horizontal) ou :vsp (vertical) facilita a comparação de arquivos. A navegação entre janelas é feita com Ctrl+w seguido das setas direcionais ou h/j/k/l.
Atalhos e Navegação no Terminal
Os atalhos do shell funcionam como um acelerador para o fluxo de trabalho. É crucial entender a diferença entre os sinais de controle:
Ctrl+C(SIGINT): Encerra o processo em primeiro plano.Ctrl+Z(SIGTSTP): Suspende o processo e o envia para o plano de fundo. Pode ser retomado comfg(primeiro plano) oubg(plano de fundo).Ctrl+D(EOF): Indica o fim da entrada de dados, fechando o shell ou o programa em execução.
O autocompletar com a tecla Tab é essencial. Para otimizar o comportamento, adicione ao .inputrc:
set show-all-if-ambiguous on
set completion-ignore-case on
A busca reversa no histórico com Ctrl+R permite localizar comandos antigos rapidamente. Para maximizarr o histórico, configure no .bashrc:
export HISTSIZE=10000
export HISTFILESIZE=20000
shopt -s histappend
export PROMPT_COMMAND="history -a; history -c; history -r"
Na navegação de diretórios, cd - alterna para o diretório anterior. Para listar arquivos com detalhes e cores, crie um alias:
alias la='ls -lAh --color=auto'
Para obter o caminho absoluto do diretório onde um script está localizado, garantindo que ele funcione independentemente de onde seja executado:
DIRETORIO_ATUAL="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
ARQUIVO_CONF="$DIRETORIO_ATUAL/configuracao.ini"
Gestão de Permissões e Segurança
O modelo de segurança do Linux baseia-se no isolamento de permissões através do modelo UGO (User, Group, Others) e das permissões de Leitura (r), Escrita (w) e Execução (x).
As permissões podem ser representadas numericamente (octal). Por exemplo, 640 significa que o dono tem leitura e escrita (6), o grupo tem apenas leitura (4) e outros não têm acesso (0).
Permissões especiais incluem:
- SUID (4000): Permite que um executável seja executado com as permissões do dono do arquivo. Exemplo:
chmod u+s /usr/bin/meu_script. - SGID (2000): Em diretórios, faz com que novos arquivos herdem o grupo do diretório pai. Exemplo:
chmod g+s /var/log/minha_app/. - Sticky Bit (1000): Em diretórios como
/tmp, impede que usuários excluam arquivos de outros usuários. Exemplo:chmod +t /tmp.
Processamento de Texto com Awk
O awk é uma linguagem de programação projetada para processamento de texto e geração de relatórios. Ele opera no paradigma de padrão-ação.
Variáveis enternas úteis incluem $0 (linha completa), $1, $2 (campos), NR (número do registro/linha) e NF (número de campos).
Exemplo prático: processar um log de acesso HTTP para extrair IPs que geraram erros 5xx.
awk -F" " '
$9 ~ /^5[0-9][0-9]$/ {
print "IP com Erro 5xx:", $1, "| Status:", $9, "| Rota:", $7
}' /var/log/nginx/access.log
O awk também é excelente para agregar dados. O script abaixo calcula o tempo médio de resposta por endpoint:
awk '
{
rota = $7
tempo_ms = $10
soma_tempo[rota] += tempo_ms
contagem[rota]++
}
END {
printf "%-30s | %-15s | %-10s\n", "Endpoint", "Tempo Medio (ms)", "Requisicoes"
for (r in soma_tempo) {
media = soma_tempo[r] / contagem[r]
printf "%-30s | %-15.2f | %-10d\n", r, media, contagem[r]
}
}' /var/log/nginx/access.log
Engenharia de Scripts Shell
Scripts robustos devem ser modulares e tratar erros adequadamente. Encapsular lógica em funções evita repetição de código.
#!/bin/bash
# Função de log
registrar_log() {
local nivel=$1
shift
echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$nivel] $*" >&2
}
# Validação de porta
validar_porta() {
local porta=$1
if [[ "$porta" =~ ^[0-9]+$ ]] && [ "$porta" -ge 1 ] && [ "$porta" -le 65535 ]; then
return 0
fi
return 1
}
Para garantir que o script falhe de forma segura, utilize o modo estrito no início do arquivo:
set -euo pipefail
Use trap para limpar recursos temporários em caso de interrupção:
DIRETORIO_TEMP="/tmp/processamento_$$"
mkdir -p "$DIRETORIO_TEMP"
limpar_recursos() {
registrar_log "INFO" "Removendo diretório temporário..."
rm -rf "$DIRETORIO_TEMP"
}
trap limpar_recursos EXIT INT TERM
Automação e Casos de Uso Reais
A automação de tarefas rotineiras é fundamental. Abaixo, um script para rotacionar e compactar logs antigos de uma aplicação específica.
#!/bin/bash
set -euo pipefail
PASTA_LOGS="/opt/minha_app/logs"
PASTA_BACKUP="/opt/minha_app/logs_historico"
DIAS_RETENCAO=14
mkdir -p "$PASTA_BACKUP"
# Encontrar e compactar logs com mais de 14 dias
find "$PASTA_LOGS" -type f -name "*.log" -mtime +$DIAS_RETENCAO -print0 | while IFS= read -r -d '' arquivo_log; do
nome_base=$(basename "$arquivo_log")
data_hoje=$(date +%Y%m%d)
destino="$PASTA_BACKUP/${nome_base}.${data_hoje}.gz"
gzip -c "$arquivo_log" > "$destino"
rm -f "$arquivo_log"
echo "Arquivado: $arquivo_log -> $destino"
done
Outro cenário comum é o monitoramento de recursos do sistema. Um script pode verificar o uso de disco e enviar um alerta se ultrapassar um limite definido.
#!/bin/bash
LIMITE_USO=85
PARTICAO_MONITORADA="/dev/sda1"
uso_atual=$(df -h "$PARTICAO_MONITORADA" | tail -1 | awk '{print $5}' | sed 's/%//')
if [ "$uso_atual" -ge "$LIMITE_USO" ]; then
mensagem="ALERTA: A partição $PARTICAO_MONITORADA está com ${uso_atual}% de uso."
echo "$mensagem" | mail -s "Alerta de Disco Cheio" admin@empresa.com
echo "$mensagem" >> /var/log/alertas_sistema.log
fi