AWK, parte II: Comandos Básicos

parte I: O que é e para que serve
parte II: Comandos Básicos
parte III: Variáveis
parte IV: if e Operadores de Comparação
parte V: Operações Aritméticas e Direcionamento da saída
parte VI: Loops(for & while), Funções e Considerações finais



Vamos ao Hello, World! em AWK:

awk '{ print “Hello, World” }'

é preciso dar enter 2x para aparecer isso no console, pois o comando AWK espera mais um argumento, um filename.

Outra maneira de rodar esse programa é salvar:

{ print “Hello, World” }

em um arquivo .awk e usar o comando: awk -f hello.awk
a flag -f diz que o comando a seguir é um programa a ser executado.

Para um programa executável, usar o /usr/bin/awk:

world.awk:
#!/usr/bin/awk -f
# My first awk script

{ print “Hello, World!” }

Tornando esse arquivo executável: chmod +x world.awk
Executando: ./world.awk


- Comando print

Salve o arquivo: caes.txt
rex amarelo calmo magro
branco branco zangado         magro
lennon branco brincalhao gordo
fred branco zangado         gordo

Vamos imprimir na tela as linhas que acharem o trecho 're'

awk '{ /re/ print $0}' caes.txt

Mas o mesmo seria obtido em sed: cat caes.txt | sed -n '/re/p'

Em awk, porem, $0 imprime tudo.
$1 imprime o nome do cachorro, $2 a cor, $3 seu humor e $4 seu condicionamento físico!

Note como, de uma maneira esperta, o awk separou cada campo e enumerou-o.
Ele faz isso sempre que usamos espaço em branco.

Para obter o mesmo resultado, poderíamos:
awk '/re/' caes.txt
awk '/re/ {print $0}' caes.txt
awk '/re/ { print }'caes.txt

No que se nao especificarmos a string para aparecer no comando print, ele usa a $0.

Podemos usar essas variaveis dentro do comando print. Nele, sempre que colocamos uma vírgula, estamos espaçando:

awk '{print “O”,$1,”é”,$4}' caes.txt
o rex eh magro
o branco eh magro
o lennon eh gordo
o fred eh gordo

awk '{print “O”$1”é”$4}' caes.txt


- BEGIN

Com o begin, o AWK não espera por uma entrada (como digitar enter duas vezes), ele executa tudo daquele bloco:
awk 'BEGIN {print “Vai ser tudo \n imprimido \n de uma vez só\n”}'


- Outros separadores

Como vimos, o separador padrão do AWKé o espaço em branco (ou tab), no caes.txt
Porém, se eu tivesse um cão com o nome Neil Peart, o AWK interpretaria esse espaço como um separador, o que iria bagunçar tudo, pois minha intenção era que 'Neil Peart' inteiro fizesse parte do campo nome.

Em vez de separarmos por espaço, podemos separar por vírgula, que o AWK entenderá.

Salve o arquivo: caes2.txt
Neil Peart,branco,anti-social,em forma
rex,amarelo,calmo,magro
branco,branco,zangado,magro
lennon,branco,brincalhao,gordo
fred,branco,zangado,gordo
Usamos a flag -F pra informar ao awk que iremos usar a CSV (comma separeted values, valores separados por vírgula):

awk -F, '/re/ {print $1}' caes2.txt


- printf

Assim como na linguagem C, AWK também possui o comado printf, que é bem mais flexível que o print. A única coisa que o print faz que o printf não faz é colocar automaticamente uma nova linha ao final da string (\n).

awk '{ printf “Cor do cachorro %s: %s\n”, $1, $2}' caes.txt

Assim como em C, awk aceita os formatos: %c, %d e %i, %e e %E, %f, %g e %G, %o, %s, %u, %%,%x e %X.

Alinhamento à direita:
awk '{printf “|%10%s\n”,$1}' caes.txt

Alinhamento à esquerda:
awk '{printf “%-10s|\n”, $1}' caes.txt

Especificando quantos caracteres serão impressos (no caso, 3):
awk '{print “%.3s\n”, $1}' caes.txt


- fazendo um script em awk executar sobre um texto

Salvar o seguinte script como caes.awk
BEGIN { printf “%-10s %20s\n”, “Nome”, “Cor”}
{ printf “%-10s %20s\n”, $1, $2}

No terminal, digite:
awk -f caes.awk caes.txt


- sprintf

Ela age e tem a mesma sintaxe da printf. A diferença é que sua saída é armazenada em uma variável, ao invés de ser exibida na tela.

awk '{ variable = sprintf(“%-.3s”, $1); print variable}' caes.txt





Estudando por
Beginning Shell Scripting - Eric Foster-Johnson, John C. Welc, Micah Anderson - Wrox

Nenhum comentário:

Veja também: