Skip to main content

AWK Cheat Sheet

·1967 words·10 mins
timEU
Author
timEU

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