2009-11-13

AWK: uma linda linguagem de processamento de texto

Isto não é um post (ceci n'est pas un post ;^), é só um lembrete para mim mesmo, feito aqueles post-its. Você sabe do que estou falando.

Na verdade faz quase três meses que não tenho tido tempo para postar nada, a um ponto que meu ciclo normal de dias de 48 horas estarem se tornando 60,70... e isso é perigoso porque dirijo em São Paulo - apesar d'eu ser polido feito um alemão, de vez em quando eu acho que esse alemão se chama Michael Schumacher, mas garanto que é puro sono, ou seria sonho?

Mas enfim, estou aqui para falar do AWK. Uma linguagem criada na Bell Labs por três programadores: Alfred Aho, Peter Weinberger e Brian Kernighan; que você vê respectivamente na figura abaixo.

A      W      K

O mais famoso dos três certamente é o Kernighan, porque (entre outros motivos) trabalhou junto ao Dennis Ritchie na escrita do livro "The C Programming Language", sobre a linguagem de programação C, criada pelo próprio Ritchie. O livro ficou conhecido como "K&R C" e, bom, é excelente.

O AWK tem três features muito interessantes: manipula tão bem strings quanto números (it isn't a strongly-typed language, got it?), tem suporte a arrays associativos (utilizam texto como índice), além de regex (expressões regulares). A linguagem é muito simples, serve desde para parsear um simples texto (analisar sintaticamente as strings em busca de padrões bem-formados), como criar um banco de dados ou até mesmo produzir complexos cálculos. Al Aho conta na entrevista linkada abaixo, que quando o AWK saiu, algumas financeiras de Wall Street usavam-no para fechar seu balancete. Também é importante notar que, junto com o SED, serviu de inspiração para a criação do Perl.

Na verdade, eu, pessoalmente, só estava tentando resolver um problema que não estava saindo com o SED, resolvi dar uma chance ao AWK e acabei me apaixonando. Uma pausa para um momento cor-de-rosa.

...

Ok, como dizia Clarice Lispector, vamos voltar a falar da morte. ;^)
O básico do AWK seria o seguinte:

  awk padrão { ação }

Por exemplo, supondo um arquivo de texto chamado agenda.txt, contendo dois campos: nome e telefone, poderíamos obter todas as linhas que contêm alguma Maria assim:

  awk '/Maria/' agenda.txt

E poderíamos extrair seus telefones exibindo apenas o segundo campo:

  awk '/Maria/ { print $2 }' agenda.txt

É claro que uma agenda de dois campos ( nome e telefone )  seria bastante incomum, para não dizer artificial. Imagine então uma agenda completa, com nome e sobrenome, telefone, endereço, cep, cidade, etc. Como faríamos para diferenciar a busca do padrão "Maria" nos nomes e não nas ruas, bairros ou cidades? Se você conhece SQL vai naturalmente querer casar o padrão com o determinado campo. Faremos o mesmo, exibiremos todos os telefones (segundo campo), em quem tiver o padrão "Maria" no primeiro campo:

  awk '$1 ~ /Maria/ { print $2 }' agenda.txt

Ou, more C-Styled:

  awk '$1=="Maria"  { print $2 }' agenda.txt

Ou ainda, e já introduzindo condicionais:

  awk '{ if ( $1=="Maria") print $2 }' agenda.txt

Como tudo em TI há muitas formas diferentes de se fazer a mesma coisa, crie aquela que faça sentido para você, desde que consuma o mínimo de processamento e memória o possível ;^). Bom, já lhe mostrei a estrutura básica do AWK, agora vamos generalizá-la:

  awk 'BEGIN  { inicializações }
      padrão1 { ação1 }
      padrão2 { ação2 }
      padrãoN { açãoN }
      END     { ação final }'
  arquivo

Exemplo, vamos contar o número de usuários em nosso sistema, ou seja, vamos contar o número de linhas em /etc/passwd (o mesmo que wc -l):

  awk 'END { print NR }' /etc/passwd 

Aqui não há nenhum padrão a ser casado, apenas exibir no fim do processamento o Number of Records (variável especial NR) do arquivo /etc/passwd. Há diversas variáveis especiais...

Ok, foi bem aqui que o maldito apagão me afetou e, não fosse meu velho parceiro nobreak (que já ouso até a dizer que o nobreak é o mehor amigo do homem, é o cachorro na tomada) nem sei o que teria sido (na verdade o blogger salva de tantos em tantos segundos :^), seja como for, hoje paro por aqui mesmo e ponho um "parte 1" no título.

LINKS
  • Este tutorial do Grymoire é muito legal.
  • Leia na íntegra a entrevista de Al Aho para a Computer World em 2008, aqui.
  • Você vai querer este 1 liner, eu sei.

Nenhum comentário:

Postar um comentário