awk One-Liners - 30 Padrões Práticos para Uso no Mundo Real
O Que Você Vai Obter Deste Artigo
- 30 one-liners de
awkprontos 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
- Extração de campos --
awk '{print $N}'para fatiar colunas (mais poderoso quecut) - Agregação -- Use blocos
ENDpara calcular somas, médias e valores max/min - Transformação --
sub/gsubpara substituição com regex,printfpara 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 }' arquivoVariá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 CSVManipulaçã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 tabulacaoPadrão 2: Reordenar campos
# Trocar 1o e 2o campos
awk '{print $2, $1}' file.txtPadrão 3: Último campo e penúltimo
awk '{print $NF}' file.txt # Ultimo campo
awk '{print $(NF-1)}' file.txt # Penultimo campoPadrã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.txtCorrespondê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 esquerdaPadrã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 CSVPadrão 17: Média
awk '{sum += $1; count++} END {print sum/count}' data.txtPadrã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.txtPadrão 19: Contar linhas (condicional)
awk 'END {print NR}' file.txt # Mesmo que wc -l
awk '/ERROR/ {count++} END {print count}' logfile # Contar linhas correspondentesPadrã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 -rnPadrã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.txtPadrão 23: Alterar caixa
awk '{print toupper($0)}' file.txt # Maiusculas na linha inteira
awk '{print tolower($1)}' file.txt # Minusculas somente no 1o campoPadrã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 diantePadrã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.txtPadrão 27: Converter CSV em tabela alinhada
awk -F, '{printf "%-15s %-10s %-8s\n", $1, $2, $3}' data.csvMú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}' *.csvPadrã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.txtNR==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.txtCheatsheet -- 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 virgulaFiltragem
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