- O awk é uma ferramenta para tratamento de textos baseada em expressões regulares.
- O awk lê um script e o aplica na sua entrada.
- Um script awk é formado basicamente por pares do tipo
- PADRÃO AÇÃO
- A entrada é quebrada em registros (normalmente linhas)
- Os registros são quebrados em campos (normalmente nos espaços em branco) que podem ser referenciados por $1, $2, ..., $n. $0 se refere ao registro todo.
- As variáveis não são declaradas. Elas passam a existir na primeira vez em que são usadas.
- Não existe tipo de variável. Cada variável pode conter qualquer tipo.
- Além das variáveis normais, podem ser utilizados vetores. Os vetores no
entanto têm uma característica interessante: seus índices são cadeias de
caracteres (vetores associativos). Veja o exemplo abaixo.- Exemplo: Um contador de ocorrências de palavras, um dos exemplos mais comuns em
AWK. A variável especial NF contém o número de campos no registro corrente:# freqüência de palavras
{
for (i = 1; i <= NF; i++)
freq[$i]++
}END {
for (word in freq)
printf "%s\t%d\n", word, freq[word]
}
- Vejamos alguns exemplos mais (o script pode ser passado como primeiro argumento entre ' '):
- awk '/^[AEIOUaeiou]/' imprime todas as linhas que começam com uma vogal.
- awk '$2 > $1' linhas cuja segunda palavra é maior (numérica ou lexicograficamente) do que a primeira. A comparação será numérica se ambas palavras tiverem representação numérica.
Resultados de jogos onde o primeiro time venceu (o nome do time não pode ter espaços).
- awk '/^[a-zA-Z]+ +[0-9]+ +x +[0-9]+ +[a-zA-Z]+/ && $2>$4':
- awk '/^[0-9]/ || $2 > 3$' começando com dígito ou com o segundo campo maior do que o terceiro.
- awk '$1 ~ /Janeiro/' linhas cujo primeiro campo contém a expressão regular Janeiro.
- awk '$1 !~ /Janeiro/' linhas cujo primeiro campo não contém a expressão regular Janeiro.
- O operador ~ é chamado de "match" e diz se uma expressão casa com um determinado padrão especificado através de uma expressão regular. Os operadores ~ e !~ podem ser utilizados como no exemplo acima ou dentro de comandos if, while, e for.
- Mais um exemplo interessante:
- ls -lg | awk '$6 == "Nov" { sum += $5 }
END { print sum }'- Onde a saída do comando ls -lg é algo como:
-rw-r--r-- 1 arnold user 1933 Nov 7 13:05 Makefile
-rw-r--r-- 1 arnold user 10809 Nov 7 13:03 gawk.h
-rw-r--r-- 1 arnold user 983 Apr 13 12:14 gawk.tab.h
-rw-r--r-- 1 arnold user 31869 Jun 15 12:20 gawk.y
-rw-r--r-- 1 arnold user 22414 Nov 7 13:03 gawk1.c
-rw-r--r-- 1 arnold user 37455 Nov 7 13:03 gawk2.c
-rw-r--r-- 1 arnold user 27511 Dec 9 13:07 gawk3.c
-rw-r--r-- 1 arnold user 7989 Nov 7 13:03 gawk4.c