AWK... uma ferramenta extremamente util principalmente para quem vive criando scripts que analisam saídas de dados e logs (ao menos é para isso que eu mais uso hahaha)
Sintaxe Básica #
awk 'padrão { ação }' arquivo.txt # Sintaxe básica
awk '{ print }' arquivo.txt # Imprimir todas as linhas
awk '{ print $0 }' arquivo.txt # Imprimir linha completa ($0)
awk '{ print $1 }' arquivo.txt # Imprimir primeira coluna
awk '{ print $1, $3 }' arquivo.txt # Imprimir colunas 1 e 3
awk '{ print NF }' arquivo.txt # Imprimir número de campos
awk '{ print NR }' arquivo.txt # Imprimir número da linha
Variáveis Internas #
$0 # Linha completa
$1, $2, $3, ... # Campos 1, 2, 3, etc.
NF # Número de campos na linha atual
NR # Número da linha atual
FNR # Número da linha no arquivo atual
FILENAME # Nome do arquivo atual
FS # Field Separator (separador de campo)
OFS # Output Field Separator
RS # Record Separator (separador de registro)
ORS # Output Record Separator
Separadores de Campo #
awk -F: '{ print $1 }' /etc/passwd # Usar ':' como separador
awk -F',' '{ print $2 }' arquivo.csv # Usar ',' para CSV
awk 'BEGIN { FS=":" } { print $1 }' arquivo # Definir separador no script
awk -F'[ \t]+' '{ print $1 }' arquivo # Múltiplos espaços/tabs
awk -F'[,:]' '{ print $1 }' arquivo # Múltiplos separadores
Padrões de Busca #
awk '/padrão/' arquivo.txt # Linhas que contêm "padrão"
awk '!/padrão/' arquivo.txt # Linhas que NÃO contêm "padrão"
awk '/^padrão/' arquivo.txt # Linhas que começam com "padrão"
awk '/padrão$/' arquivo.txt # Linhas que terminam com "padrão"
awk '/padrão1|padrão2/' arquivo.txt # Linhas com padrão1 OU padrão2
awk '/padrão1/ && /padrão2/' arquivo.txt # Linhas com padrão1 E padrão2
Condições Numéricas #
awk '$3 > 100' arquivo.txt # Terceira coluna maior que 100
awk '$2 >= 50' arquivo.txt # Segunda coluna maior ou igual a 50
awk '$1 == "nome"' arquivo.txt # Primeira coluna igual a "nome"
awk '$4 != 0' arquivo.txt # Quarta coluna diferente de zero
awk 'NR > 1' arquivo.txt # Pular primeira linha (cabeçalho)
awk 'NF > 3' arquivo.txt # Linhas com mais de 3 campos
Condições de String #
awk '$1 == "João"' arquivo.txt # Primeira coluna igual a "João"
awk '$2 ~ /^[0-9]+$/' arquivo.txt # Segunda coluna contém apenas números
awk '$1 !~ /test/' arquivo.txt # Primeira coluna não contém "test"
awk 'length($1) > 5' arquivo.txt # Primeira coluna com mais de 5 caracteres
Blocos BEGIN e END #
awk 'BEGIN { print "Início" } { print } END { print "Fim" }' arquivo.txt
awk 'BEGIN { print "Nome\tIdade" } { print $1 "\t" $2 }' arquivo.txt
awk 'BEGIN { FS=":" } { print $1 }' /etc/passwd
awk 'END { print "Total de linhas:", NR }' arquivo.txt
Operações Matemáticas #
awk '{ print $1 + $2 }' arquivo.txt # Somar colunas 1 e 2
awk '{ print $3 - $2 }' arquivo.txt # Subtrair coluna 2 da 3
awk '{ print $1 * $2 }' arquivo.txt # Multiplicar colunas 1 e 2
awk '{ print $1 / $2 }' arquivo.txt # Dividir coluna 1 por 2
awk '{ print $1 % $2 }' arquivo.txt # Resto da divisão
awk '{ print $1 ** 2 }' arquivo.txt # Elevar coluna 1 ao quadrado
Funções Matemáticas #
awk '{ print sqrt($1) }' arquivo.txt # Raiz quadrada
awk '{ print int($1) }' arquivo.txt # Parte inteira
awk '{ print sin($1) }' arquivo.txt # Seno
awk '{ print cos($1) }' arquivo.txt # Cosseno
awk '{ print atan2($1, $2) }' arquivo.txt # Arco tangente
awk '{ print log($1) }' arquivo.txt # Logaritmo natural
awk '{ print exp($1) }' arquivo.txt # Exponencial
awk '{ print rand() }' arquivo.txt # Número aleatório (0-1)
Funções de String #
awk '{ print length($1) }' arquivo.txt # Comprimento da string
awk '{ print substr($1, 2, 3) }' arquivo.txt # Substring (posição 2, 3 caracteres)
awk '{ print toupper($1) }' arquivo.txt # Converter para maiúsculas
awk '{ print tolower($1) }' arquivo.txt # Converter para minúsculas
awk '{ print index($0, "texto") }' arquivo.txt # Posição de "texto" na linha
Substituições #
awk '{ gsub(/antigo/, "novo"); print }' arquivo.txt # Substituir todas as ocorrências
awk '{ sub(/antigo/, "novo"); print }' arquivo.txt # Substituir primeira ocorrência
awk '{ gsub(/[0-9]/, "X"); print }' arquivo.txt # Substituir dígitos por X
awk '{ gsub(/ +/, " "); print }' arquivo.txt # Múltiplos espaços por um
Split de Strings #
awk '{ split($0, arr, ":"); print arr[1] }' arquivo.txt # Dividir linha por ':'
awk '{ n = split($1, arr, ","); for(i=1; i<=n; i++) print arr[i] }' arquivo.txt
Contadores e Somas #
awk '{ soma += $1 } END { print soma }' arquivo.txt # Somar primeira coluna
awk '{ count++ } END { print count }' arquivo.txt # Contar linhas
awk '$1 == "erro" { count++ } END { print count }' log.txt # Contar erros
awk '{ soma += $3; n++ } END { print soma/n }' arquivo.txt # Média da coluna 3
Arrays Associativos #
# Contar ocorrências
awk '{ count[$1]++ } END { for (word in count) print word, count[word] }' arquivo.txt
# Somar por categoria
awk '{ total[$1] += $2 } END { for (cat in total) print cat, total[cat] }' arquivo.txt
# Array multidimensional simulado
awk '{ arr[$1","$2] = $3 } END { for (key in arr) print key, arr[key] }' arquivo.txt
Estruturas Condicionais #
# If simples
awk '{ if ($1 > 100) print "Grande: " $1 }' arquivo.txt
# If-else
awk '{ if ($1 > 50) print "Grande"; else print "Pequeno" }' arquivo.txt
# If-else if-else
awk '{
if ($1 > 100) print "Grande"
else if ($1 > 50) print "Médio"
else print "Pequeno"
}' arquivo.txt
Loops #
# For loop simples
awk '{ for(i=1; i<=3; i++) print $i }' arquivo.txt
# For loop com array
awk '{ for(i=1; i<=NF; i++) soma += $i; print soma }' arquivo.txt
# While loop
awk '{ i=1; while(i<=NF) { print $i; i++ } }' arquivo.txt
# Loop através de array
awk '{ arr[$1]++ } END { for (key in arr) print key, arr[key] }' arquivo.txt
Formatação de Saída #
awk '{ printf "%10s %5d\n", $1, $2 }' arquivo.txt # Formatação com printf
awk '{ printf "%-10s %5.2f\n", $1, $2 }' arquivo.txt # Alinhamento à esquerda
awk 'BEGIN { OFS="\t" } { print $1, $2, $3 }' arquivo.txt # Separador de saída
Especificadores de Formato printf #
%s # String
%d # Inteiro decimal
%f # Ponto flutuante
%e # Notação científica
%g # Formato geral (mais compacto)
%c # Caractere
%x # Hexadecimal minúsculo
%X # Hexadecimal maiúsculo
%-10s # Alinhamento à esquerda, largura 10
%10.2f # Largura 10, 2 casas decimais
Processamento de CSV #
awk -F',' '{ print $2 }' arquivo.csv # Segunda coluna de CSV
awk -F',' 'NR>1 { print $1, $3 }' arquivo.csv # Pular cabeçalho
awk -F',' '{ gsub(/"/, "", $2); print $2 }' arquivo.csv # Remover aspas
Análise de Logs #
# Contar IPs únicos em log de acesso
awk '{ ip[$1]++ } END { for (i in ip) print i, ip[i] }' access.log
# Códigos de status HTTP
awk '{ status[$9]++ } END { for (s in status) print s, status[s] }' access.log
# Top 10 páginas mais acessadas
awk '{ pages[$7]++ } END {
for (page in pages) print pages[page], page
}' access.log | sort -nr | head -10
# Análise por hora
awk '{
gsub(/\[/, "", $4);
split($4, time, ":");
hour[time[2]]++
} END {
for (h in hour) print h"h:", hour[h]
}' access.log
Processamento de Múltiplos Arquivos #
awk '{ print FILENAME, NR, $0 }' *.txt # Mostrar nome do arquivo e linha
awk 'FNR==1 { print "Arquivo:", FILENAME }' *.txt # Primeira linha de cada arquivo
awk 'END { print "Total de arquivos:", NR }' *.txt # Total de linhas em todos os arquivos
Expressões Regulares Avançadas #
awk '/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/' log # IPs
awk '/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/' dados # Emails
awk '/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/' arquivo.txt # Datas (YYYY-MM-DD)
Funções Definidas pelo Usuário #
awk '
function max(a, b) {
return a > b ? a : b
}
{
print max($1, $2)
}' arquivo.txt
awk '
function factorial(n) {
if (n <= 1) return 1
return n * factorial(n-1)
}
{
print factorial($1)
}' arquivo.txt
Exemplos Práticos #
Análise de Vendas #
# Arquivo: vendas.csv (produto,quantidade,preco)
awk -F',' '
NR > 1 {
vendas[$1] += $2 * $3
qtd[$1] += $2
}
END {
for (produto in vendas) {
printf "%-15s Vendas: R$%8.2f Qtd: %5d\n",
produto, vendas[produto], qtd[produto]
}
}' vendas.csv
Estatísticas de Arquivo #
awk '
{
chars += length($0)
words += NF
lines++
if (length($0) > max_line) max_line = length($0)
}
END {
printf "Linhas: %d\nPalavras: %d\nCaracteres: %d\nMaior linha: %d\n",
lines, words, chars, max_line
}' arquivo.txt
Processamento de Notas #
# Arquivo: notas.txt (aluno nota1 nota2 nota3)
awk '{
media = ($2 + $3 + $4) / 3
if (media >= 7) status = "Aprovado"
else if (media >= 5) status = "Recuperação"
else status = "Reprovado"
printf "%-15s Média: %5.2f %s\n", $1, media, status
}' notas.txt
Conversão de Formato #
# Converter de formato delimitado para JSON simples
awk -F',' '
BEGIN { print "[" }
NR > 1 {
if (NR > 2) print ","
printf " {\"nome\":\"%s\",\"idade\":%d,\"cidade\":\"%s\"}", $1, $2, $3
}
END { print "\n]" }' pessoas.csv
Monitor de Sistema #
# Processar saída do 'ps' para encontrar processos com alta CPU
ps aux | awk '
NR > 1 && $3 > 10 {
printf "PID: %-8s CPU: %5.1f%% MEM: %5.1f%% CMD: %s\n",
$2, $3, $4, $11
}'
Análise de Rede #
# Analisar conexões de rede (netstat)
netstat -an | awk '
/^tcp/ {
state[$6]++
}
END {
for (s in state)
printf "%-15s: %d\n", s, state[s]
}'
Scripts AWK Completos #
Script em Arquivo #
# Criar arquivo script.awk
#!/usr/bin/awk -f
BEGIN {
FS = ","
OFS = "\t"
print "Processando dados..."
}
NR > 1 {
total += $3
count++
}
END {
print "Total:", total
print "Média:", total/count
}
# Executar script
awk -f script.awk dados.csv
Relatório de Sistema #
#!/usr/bin/awk -f
# relatorio.awk - Análise de log do sistema
BEGIN {
print "=== RELATÓRIO DE SISTEMA ==="
print "Data:", strftime("%Y-%m-%d %H:%M:%S")
print ""
}
/ERROR/ { errors++ }
/WARNING/ { warnings++ }
/INFO/ { info++ }
{
total++
if ($0 ~ /[0-9]{1,2}:[0-9]{2}:[0-9]{2}/) {
match($0, /[0-9]{1,2}:[0-9]{2}/)
hour = substr($0, RSTART, 2)
hourly[hour]++
}
}
END {
print "RESUMO:"
printf "Total de linhas: %d\n", total
printf "Erros: %d\n", errors
printf "Avisos: %d\n", warnings
printf "Informações: %d\n", info
print ""
print "ATIVIDADE POR HORA:"
for (h=0; h<24; h++) {
printf "%02d:00 - %d eventos\n", h, hourly[sprintf("%02d", h)]
}
}
Dicas de Performance #
# Use BEGIN para configurações que não mudam
awk 'BEGIN { FS=":" } { print $1 }' arquivo
# Evite expressões regulares desnecessárias
awk '$1 == "texto"' arquivo # Melhor que /^texto$/
# Use exit quando encontrar o que procura
awk '/padrão/ { print; exit }' arquivo
# Pre-compile expressões regulares complexas quando possível
Debugging AWK #
awk '{ print "Debug:", NR, NF, $0; print $1 }' arquivo # Debug simples
awk 'BEGIN { print "Iniciando..." } { print "Linha", NR ":", $0 } END { print "Terminado" }' arquivo
Casos de Uso Comuns #
Extrair Colunas Específicas #
awk '{ print $1, $3, $5 }' arquivo.txt # Colunas 1, 3 e 5
awk -F: '{ print $1, $3 }' /etc/passwd # Usuário e UID
Filtrar e Processar #
awk '$3 > 1000 { print $1, $3*1.1 }' vendas.txt # Vendas > 1000 com 10% de aumento
Aggregações #
awk '{ sum += $2; count++ } END { print "Média:", sum/count }' numeros.txt
Transformações #
awk '{ $1 = toupper($1); print }' arquivo.txt # Primeira coluna em maiúsculas