awk One-Liners - 30 Padroes Praticos para Uso no Mundo Real

awk One-Liners - 30 Padroes Praticos para Uso no Mundo Real

O Que Voce Vai Obter Deste Artigo

  • 30 one-liners de awk prontos para copiar e colar, organizados por caso de uso
  • Padroes de extracao de campos, filtragem, agregacao e transformacao de texto
  • Padroes do mundo real para CSV, TSV, arquivos de log e dados numericos

Resumo Rapido: Tres Usos Principais do awk

  1. Extracao de campos -- awk '{print $N}' para fatiar colunas (mais poderoso que cut)
  2. Agregacao -- Use blocos END para calcular somas, medias e valores max/min
  3. Transformacao -- sub/gsub para substituicao com regex, printf para saida formatada

Pre-requisitos

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

Como Funciona a Sintaxe do awk?

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

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

Variaveis internas essenciais:

Variavel Significado
$0 Linha inteira
$1, $2... 1o campo, 2o campo...
NF Numero de campos (colunas) na linha atual
NR Numero da linha atual (entre todos os arquivos)
FNR Numero da linha dentro do arquivo atual
FS Separador de campos de entrada (padrao: espaco em branco)
OFS Separador de campos de saida (padrao: espaco)
# 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

Manipulacao de Campos -- Como Extrair e Transformar Colunas?

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

Padrao 1: Imprimir campos especificos

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

Padrao 2: Reordenar campos

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

Padrao 3: Ultimo campo e penultimo

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

Padrao 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 e um idioma do awk que forca o awk a reconstruir $0 usando OFS. O valor de $1 nao muda -- a atribuicao apenas aciona a reconstrucao da linha completa.

Padrao 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

Padrao 6: Normalizar espacos em branco inconsistentes

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

Correspondencia de Padroes e Filtragem -- Como Extrair Linhas Correspondentes?

O awk permite filtrar tanto por conteudo quanto por valor de coluna, algo que o grep sozinho nao consegue.

Padrao 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

Padrao 8: Filtrar por campo especifico

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 #

Padrao 9: Condicoes AND / OR

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

Padrao 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

Numeros de Linha e Intervalos -- Como Selecionar Linhas Especificas?

Padrao 11: Imprimir uma linha ou intervalo especifico

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

Padrao 12: Pular a linha de cabecalho

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

Padrao 13: Linhas impares e pares

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

Padrao 14: Adicionar numeros 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

Padrao 15: Imprimir linhas entre dois padroes

# 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

Agregacao e Calculo -- Como Resumir Dados Numericos?

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

Padrao 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

Padrao 17: Media

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

Padrao 18: Maximo e minimo

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

Padrao 19: Contar linhas (condicional)

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

Padrao 20: Contar ocorrencias 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

Padrao 21: Valores unicos (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] e 0 (primeira ocorrencia), a condicao e verdadeira entao o awk imprime a linha; o pos-incremento entao define como 1, suprimindo duplicatas subsequentes. A ordem e preservada -- diferente de sort -u.

Manipulacao de Strings -- Como Transformar Texto?

Padrao 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

Padrao 23: Alterar caixa

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

Padrao 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

Padrao 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

Saida Formatada com printf -- Como Alinhar Colunas?

Use printf quando print produzir saida desalinhada.

Padrao 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

Padrao 27: Converter CSV em tabela alinhada

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

Multiplos Arquivos e Comparacao de Arquivos

Padrao 28: Processar multiplos arquivos, pular cada cabecalho

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

Padrao 29: Linhas no arquivo1 mas nao 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 e verdadeiro apenas enquanto o primeiro arquivo esta sendo processado. next pula o resto da regra, entao apenas o primeiro arquivo popula o array a. Para cada linha no segundo arquivo, !a[$0] filtra linhas nao vistas no primeiro.

Padrao 30: Inicializar variaveis 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 -- Padroes de Referencia Rapida

Operacoes 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

Agregacao

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

Proximas Leituras