awk One-Liners - 30 Padroes Praticos para Uso no Mundo Real
O Que Voce Vai Obter Deste Artigo
- 30 one-liners de
awkprontos 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
- Extracao de campos --
awk '{print $N}'para fatiar colunas (mais poderoso quecut) - Agregacao -- Use blocos
ENDpara calcular somas, medias e valores max/min - Transformacao --
sub/gsubpara substituicao com regex,printfpara 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 }' arquivoVariaveis 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 CSVManipulacao 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 tabulacaoPadrao 2: Reordenar campos
# Trocar 1o e 2o campos
awk '{print $2, $1}' file.txtPadrao 3: Ultimo campo e penultimo
awk '{print $NF}' file.txt # Ultimo campo
awk '{print $(NF-1)}' file.txt # Penultimo campoPadrao 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.txtCorrespondencia 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 esquerdaPadrao 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 CSVPadrao 17: Media
awk '{sum += $1; count++} END {print sum/count}' data.txtPadrao 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.txtPadrao 19: Contar linhas (condicional)
awk 'END {print NR}' file.txt # Mesmo que wc -l
awk '/ERROR/ {count++} END {print count}' logfile # Contar linhas correspondentesPadrao 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 -rnPadrao 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.txtPadrao 23: Alterar caixa
awk '{print toupper($0)}' file.txt # Maiusculas na linha inteira
awk '{print tolower($1)}' file.txt # Minusculas somente no 1o campoPadrao 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 diantePadrao 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.txtPadrao 27: Converter CSV em tabela alinhada
awk -F, '{printf "%-15s %-10s %-8s\n", $1, $2, $3}' data.csvMultiplos 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}' *.csvPadrao 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.txtNR==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.txtCheatsheet -- 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 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
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