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