awk One-Liners - 30 Padrões Práticos para Uso no Mundo Real

awk One-Liners - 30 Padrões Práticos para Uso no Mundo Real

O Que Você Vai Obter Deste Artigo

  • 30 one-liners de awk prontos para copiar e colar, organizados por caso de uso
  • Padrões de extração de campos, filtragem, agregação e transformação de texto
  • Padrões do mundo real para CSV, TSV, arquivos de log e dados numéricos

Resumo Rápido: Três Usos Principais do awk

  1. Extração de campos -- awk '{print $N}' para fatiar colunas (mais poderoso que cut)
  2. Agregação -- Use blocos END para calcular somas, médias e valores max/min
  3. Transformação -- sub/gsub para substituição com regex, printf para saída formatada

Pré-requisitos

  • Estes exemplos assumem GNU awk (gawk). O macOS vem com POSIX awk que carece de alguns recursos.
  • Todos os padrões funcionam tanto em arquivos quanto como parte de um pipeline via stdin.

Como Funciona a Sintaxe do awk?

A forma principal é awk 'padrao { acao }' arquivo. Omitir o padrão aplica a ação a toda linha; omitir a ação usa {print} por padrão.

# Formas basicas
awk '{ acao }' arquivo
awk 'padrao' arquivo
awk 'padrao { acao }' arquivo

Variáveis internas essenciais:

Variável Significado
$0 Linha inteira
$1, $2... 1o campo, 2o campo...
NF Número de campos (colunas) na linha atual
NR Número da linha atual (entre todos os arquivos)
FNR Número da linha dentro do arquivo atual
FS Separador de campos de entrada (padrão: espaço em branco)
OFS Separador de campos de saída (padrão: espaço)
# Definir separador com -F
awk -F: '{print $1}' /etc/passwd   # 1o campo, delimitado por dois-pontos
awk -F, '{print $2}' data.csv      # 2a coluna de CSV

Manipulação de Campos -- Como Extrair e Transformar Colunas?

Extrair, reordenar e reformatar campos é o caso de uso mais comum do awk.

Padrão 1: Imprimir campos específicos

awk '{print $2}' file.txt           # Somente o 2o campo
awk '{print $1, $3}' file.txt       # 1o e 3o campo, separados por espaco
awk '{print $1 "\t" $3}' file.txt   # Saida separada por tabulacao

Padrão 2: Reordenar campos

# Trocar 1o e 2o campos
awk '{print $2, $1}' file.txt

Padrão 3: Último campo e penúltimo

awk '{print $NF}' file.txt          # Ultimo campo
awk '{print $(NF-1)}' file.txt      # Penultimo campo

Padrão 4: Converter separador de campos

# Delimitado por dois-pontos para delimitado por virgula
awk -F: '{OFS=","; $1=$1; print}' file.txt

# Delimitado por espaco para delimitado por tabulacao
awk '{OFS="\t"; $1=$1; print}' file.txt

$1=$1 é um idioma do awk que força o awk a reconstruir $0 usando OFS. O valor de $1 não muda -- a atribuição apenas aciona a reconstrução da linha completa.

Padrão 5: Filtrar por quantidade de campos

awk 'NF==5' file.txt        # Linhas com exatamente 5 campos
awk 'NF>=3' file.txt        # Linhas com 3 ou mais campos

Padrão 6: Normalizar espaços em branco inconsistentes

# Colapsar multiplos espacos/tabulacoes em um unico OFS
awk '{$1=$1; print}' file.txt

Correspondência de Padrões e Filtragem -- Como Extrair Linhas Correspondentes?

O awk permite filtrar tanto por conteúdo quanto por valor de coluna, algo que o grep sozinho não consegue.

Padrão 7: Corresponder linhas contendo uma string

awk '/ERROR/' logfile            # Linhas contendo ERROR (mesmo que grep)
awk '/^2026/' access.log         # Linhas comecando com 2026
awk '/ERROR|WARN/' logfile       # Linhas contendo ERROR ou WARN

Padrão 8: Filtrar por campo específico

awk '$3 == "200"' access.log          # Linhas onde o 3o campo e 200
awk '$2 > 100' data.txt               # Linhas onde o 2o campo excede 100
awk '$1 ~ /^user/' data.txt           # 1o campo comeca com "user" (regex)
awk '$1 !~ /^#/' config.txt           # Pular linhas onde 1o campo comeca com #

Padrão 9: Condições AND / OR

awk '$1 == "GET" && $9 >= 500' access.log    # AND
awk '$3 == "404" || $3 == "500"' access.log  # OR

Padrão 10: Pular linhas vazias

awk 'NF > 0' file.txt        # Linhas com pelo menos um campo (sem linhas em branco)
awk '!/^$/' file.txt         # Mesmo via regex

Números de Linha e Intervalos -- Como Selecionar Linhas Específicas?

Padrão 11: Imprimir uma linha ou intervalo específico

awk 'NR==3' file.txt             # Somente a linha 3
awk 'NR>=5 && NR<=10' file.txt   # Linhas 5 a 10

Padrão 12: Pular a linha de cabeçalho

awk 'NR>1' data.csv        # Pular linha 1 (cabecalho)

Padrão 13: Linhas impares e pares

awk 'NR%2==1' file.txt     # Linhas impares
awk 'NR%2==0' file.txt     # Linhas pares

Padrão 14: Adicionar números de linha

awk '{print NR ": " $0}' file.txt             # Prefixo com numero de linha
awk '{printf "%04d %s\n", NR, $0}' file.txt   # Numeracao com zeros a esquerda

Padrão 15: Imprimir linhas entre dois padrões

# Imprimir de START ate END (inclusive)
awk '/START/,/END/' file.txt

# Da linha apos um marcador de cabecalho ate a primeira linha em branco
awk '/^---$/,/^$/' file.txt

Agregação e Cálculo -- Como Resumir Dados Numéricos?

Os blocos BEGIN e END executam antes e após processar todas as linhas -- ideais para acumular totais.

Padrão 16: Somar uma coluna

awk '{sum += $1} END {print sum}' data.txt
awk -F, '{sum += $3} END {print sum}' data.csv    # 3a coluna de um CSV

Padrão 17: Média

awk '{sum += $1; count++} END {print sum/count}' data.txt

Padrão 18: Máximo e mínimo

awk 'NR==1 {max=$1; min=$1} {if($1>max) max=$1; if($1<min) min=$1} END {print "max:"max, "min:"min}' data.txt

Padrão 19: Contar linhas (condicional)

awk 'END {print NR}' file.txt                       # Mesmo que wc -l
awk '/ERROR/ {count++} END {print count}' logfile   # Contar linhas correspondentes

Padrão 20: Contar ocorrências por valor (histograma)

# Contagem por valor do 3o campo
awk '{count[$3]++} END {for(k in count) print k, count[k]}' access.log

# Histograma de codigos de status HTTP, ordenado por frequencia decrescente
awk '{count[$3]++} END {for(k in count) print count[k], k}' access.log | sort -rn

Padrão 21: Valores únicos (deduplicar)

# Valores unicos do 1o campo, preservando ordem
awk '!seen[$1]++' file.txt

# Deduplicar linhas inteiras, preservando ordem
awk '!seen[$0]++' file.txt

!seen[$1]++ funciona assim: se seen[$1] é 0 (primeira ocorrência), a condição é verdadeira então o awk imprime a linha; o pós-incremento então define como 1, suprimindo duplicatas subsequentes. A ordem é preservada -- diferente de sort -u.

Manipulação de Strings -- Como Transformar Texto?

Padrão 22: Substituir strings (sub / gsub)

# Substituir primeira correspondencia (sub)
awk '{sub(/foo/, "bar"); print}' file.txt

# Substituir todas as correspondencias (gsub)
awk '{gsub(/foo/, "bar"); print}' file.txt

# Substituir apenas em um campo especifico
awk '{gsub(/http:/, "https:", $1); print}' file.txt

Padrão 23: Alterar caixa

awk '{print toupper($0)}' file.txt    # Maiusculas na linha inteira
awk '{print tolower($1)}' file.txt    # Minusculas somente no 1o campo

Padrão 24: Extrair uma substring

# substr(string, inicio, comprimento) -- indexado a partir de 1
awk '{print substr($1, 1, 8)}' file.txt      # Primeiros 8 caracteres do campo 1
awk '{print substr($1, 5)}' file.txt         # Campo 1 da posicao 5 em diante

Padrão 25: Filtrar por comprimento de string

awk 'length($1) > 10' file.txt      # 1o campo com mais de 10 caracteres
awk 'length > 80' file.txt          # Linhas com mais de 80 caracteres

Saída Formatada com printf -- Como Alinhar Colunas?

Use printf quando print produzir saída desalinhada.

Padrão 26: Alinhar colunas

# Coluna de 20 caracteres alinhada a esquerda, coluna de 8 caracteres alinhada a direita
awk '{printf "%-20s %8s\n", $1, $2}' file.txt

# Saida numerica com 2 casas decimais
awk '{printf "%.2f\n", $1}' data.txt

Padrão 27: Converter CSV em tabela alinhada

awk -F, '{printf "%-15s %-10s %-8s\n", $1, $2, $3}' data.csv

Múltiplos Arquivos e Comparação de Arquivos

Padrão 28: Processar múltiplos arquivos, pular cada cabeçalho

# FNR reinicia por arquivo; NR continua contando entre arquivos
awk 'FNR>1 {print FILENAME, $0}' *.csv

Padrão 29: Linhas no arquivo1 mas não no arquivo2

# Diff simples: imprimir linhas do arquivo2 ausentes no arquivo1
awk 'NR==FNR {a[$0]=1; next} !a[$0]' file1.txt file2.txt

NR==FNR é verdadeiro apenas enquanto o primeiro arquivo está sendo processado. next pula o resto da regra, então apenas o primeiro arquivo popula o array a. Para cada linha no segundo arquivo, !a[$0] filtra linhas não vistas no primeiro.

Padrão 30: Inicializar variáveis em BEGIN, resumir em END

# Definir FS/OFS antes de iniciar o processamento
awk 'BEGIN {FS=","; OFS="\t"} {print $1, $2, $3}' data.csv

# Imprimir cabecalho e rodape ao redor dos dados
awk 'BEGIN {print "name\tscore"} {print $1, $2} END {print "---"}' data.txt

Cheatsheet -- Padrões de Referência Rápida

Operações de campos

awk '{print $1}'                      # 1o campo
awk '{print $NF}'                     # Ultimo campo
awk '{print $(NF-1)}'                 # Penultimo campo
awk -F, '{print $2}'                  # 2a coluna de CSV
awk -F: '{OFS=","; $1=$1; print}'     # Converter dois-pontos para separador virgula

Filtragem

awk 'NR>1'                            # Pular linha de cabecalho
awk '/ERROR/'                         # Linhas contendo ERROR
awk '$3 >= 500'                       # 3o campo >= 500
awk '!seen[$0]++'                     # Remover linhas duplicadas
awk 'NF>0'                            # Remover linhas em branco

Agregação

awk '{sum+=$1} END{print sum}'        # Soma da coluna
awk 'END{print NR}'                   # Contagem de linhas (como wc -l)
awk '{c[$1]++} END{for(k in c) print k, c[k]}'   # Contagem por valor

Próximas Leituras