AWK

linguagem de programação

A linguagem de programação AWK foi criada em 1977 pelos cientistas Alfred Aho, Peter J. Weinberger e Brian Kernighan no laboratório Bell Labs. A palavra AWK é uma abreviatura das iniciais dos sobrenomes dos criadores da linguagem (Aho, Weinberger e Kernighan).

AWK
Paradigma Linguagem de script, procedural, orientada a eventos
Surgido em 1977
Última versão IEEE Std 1003.1-2004 (POSIX) / 1985
Criado por Alfred Aho, Peter Weinberger, and Brian Kernighan
Estilo de tipagem Estática e Fraca
Influenciada por C, SNOBOL4, Bourne shell
Influenciou Tcl, AMPL, Perl, Korn Shell (ksh93, dtksh, tksh), Lua

A linguagem é interpretada linha por linha e tem como principal objetivo deixar os scripts de Shell em sistemas POSIX mais poderosos e com muito mais recursos sem utilizar muitas linhas de comando, podendo resolver infinidades de problemas do dia-a-dia do desenvolvedor nesses sistemas operacionais.

Baseada na linguagem C, é utilizada frequentemente por desenvolvedores para processar textos e manipular arquivos. Tem como os paradigmas linguagem de script, procedural e orientada a eventos.

Esta linguagem é considerada por muitos um importante marco para história da programação, tendo tido bastante influência na criação de outras linguagens de programação, como Perl e Lua.

Variantes do AWK

editar
  • BWK: conhecido também como AWK ou NAWK se refere à versão por Brian Kernighan. Ele foi apelidado de "Um AWK True" por causa do uso do termo em associação com o livro que originalmente descrita a linguagem e o fato de Kernighan ter sido um dos autores originais do AWK. Esta versão é usada por exemplo nos sistemas operativos FreeBSD, NetBSD, OpenBSD e OS X .
  • GAWK: (GNU AWK) é outra implementação do software livre (open source) e de implementação única que fez grandes progressos na implementação de internacionalização e localização de redes TCP/IP. Ele foi escrito antes da implementação original ter se tornado livre. Ela inclui o seu próprio depurador, e seu perfil permite ao usuário fazer melhorias de desempenho medidos para um script, e também permite que o usuário possa estender as funcionalidades através de bibliotecas compartilhadas. As distribuições Linux são em sua maioria de software GNU, e assim eles podem incluir GAWK. FreeBSD antes da versão 5.0 também incluiu GAWK versão 3.0, mas as versões posteriores do FreeBSD uso BWK para evitar a mais restritiva licença GNU General Public License (GPL), bem como por suas características técnicas.
  • MAWK: é uma versão muito mais rápida da implementação AWK por Mike Brennan com base em um código de bytes intérprete.
  • LIBAWK: é um fork (comando para criar threads de um processo) do MAWK, permitindo que os aplicativos para incorporar várias instâncias paralelas de intérpretes AWK.
  • AWKA: é outro tradutor de scripts AWK em código C. Quando compilado, estaticamente incluindo libawka.a do autor, os executáveis resultantes são consideravelmente acelerados e, de acordo com testes do autor, comparam muito bem com outras versões do AWK, Perl , ou Tcl . Pequenos scripts vão se transformar em programas de 160-170 Kb.
  • TAWK: (Thompson AWK) é um AWK compilador para Solaris , DOS , OS/2 e do Windows , anteriormente vendido por Thompson softwares de automação.
  • JAWK: é um projeto para implementar AWK em Java, hospedado no SourceForge, extensões à linguagem são adicionados para fornecer acesso a recursos do Java dentro de scripts AWK (ou seja, os encadeamentos Java, soquetes, Coleções, etc.)
  • XGAWK: é um projeto baseado em SourceForge GAWK. Ela se estende pela GAWK mas com bibliotecas carregadas dinamicamente.
  • QSEAWK: é uma implementação intérprete incorporada do AWK incluídos na biblioteca QSE que proporciona a incorporação de interface de programação de aplicação (API) para C e C++.
  • BusyBox: inclui um pouco documentada implementação AWK que parece ser completa, escrito por Dmitry Zakharov. Esta é uma implementação muito pequena adequada para sistemas embarcados.

Variáveis da Linguagem

editar

Na Linguagem AWK são muitos utilizados argumentos já pre-definidos do sistema operacional (iremos utilizar linux). Criamos a tabela abaixo que ficará mais fácil de entender os próximos exemplos.

-rw-r--r--    	1 	Usuario   	root  7022    Jul     20  	2011 	Cygwin.ico
-rwxr-xr-x  	1 	Usuario   	root   57     Jul     20  	2011	Cygwin.bat
drwxr-xr-x+ 	1 	Usuario   	root    0     Jul     21  	2011 	opt

$1             $2     $3         $4    $5     $6      $7     $8       $9

#$0 = Imprime toda a linha dependendo do modo que use

Exemplos de código

editar

Sintaxe

editar
#Sintaxe da utilização do AWK simples

awk <padrao-acao> [arquivo_1] [arquivo_2]... [arquivo_n]

Exemplo 1

editar
#Exemplo abaixo ele imprime todos os clientes do arquivo lista_clientes (dentro do ambiente Unix/Linux)

bash-4.1$ awk '{print $0}' lista_clientes
Claudia Maria Salvador 555-6666
Eduardo Silva Campinas 222-3333
Juliano Mendes Manaus 333-2222
Luiz Carlos Curitiba 777-9999
Mario Sergio Florianopolis 888-7777
Maria Julia Salvador 666-8888

Exemplo 2

editar
#Neste caso ele imprime somente o primeiro nome do cliente e o seu telefone referenciado

bash-4.1$ awk '{print $1,$4}' lista_clientes
Claudia 555-6666
Eduardo 222-3333
Juliano 333-2222
Luiz 777-9999
Mario 888-7777
Maria 666-8888

Exemplo 3

editar
# No comando ele imprime toda linha que tiver a letra M

bash-4.1$ awk '/M/ {print}' lista_clientes
Claudia Maria Salvador 555-6666
Juliano Mendes Manaus 333-2222
Mario Sergio Florianopolis 888-7777
Maria Julia Salvador 666-8888

Exemplo 4

editar
#AWK sendo utilizado em conjunto com o comando Unix ls –ltr retornando os nomes dos arquivos do argumento $9

bash-4.1$ ls -ltr | awk '{print $9}'
Cygwin.ico
Cygwin.bat
opt
usr
sbin
home
lib
var
srv
dev
etc
Documentos_Linux
bin
tmp
proc
cygdrive

Exemplo 5

editar
# AWK sendo utilizado em conjunto com o comando Unix  ls –ltr e o comando if/else retornando os nomes dos diretórios/arquivos
# com a ultima modificação em 2011. Lembrando que ele pode ser utilizado em conjunto com qualquer
# comando em unix, por exemplo os comandos: cat, more, ls e entre outros.

bash-4.1$ ls -ltr | awk '{if ($8 == "2011") print ($0)}'
-rw-r--r--  1 Usuario root 7022 Jul 20  2011 Cygwin.ico
-rwxr-xr-x  1 Usuario root   57 Jul 20  2011 Cygwin.bat
drwxr-xr-x+ 1 Usuario root    0 Jul 21  2011 opt
drwxr-xr-x+ 1 Usuario root    0 Jul 21  2011 usr
drwxr-xr-x+ 1 Usuario root    0 Jul 21  2011 sbin
drwxrwxrwt+ 1 Usuario root    0 Jul 21  2011 home
drwxr-xr-x+ 1 Usuario root    0 Jul 21  2011 lib
drwxr-xr-x+ 1 Usuario root    0 Jul 21  2011 var
drwxr-xr-x+ 1 Usuario None    0 Jul 21  2011 srv
drwxr-xr-x+ 1 Usuario None    0 Jul 21  2011 dev
drwxrwxr-x+ 1 Usuario root    0 Jul 21  2011 etc
drwxrwxrw-+ 1 Usuario None    0 Jul 21  2011 Documentos_Linux

Exemplo 6

editar
# O script inicializará a variável i com 1 e o comando while, enquanto o valor de i for menor ou
# igual ao número de campos da linha atual, irá imprimir
# (print) cada campo em uma linha diferente, acrescentando 1 a i após a
# impressão (print).

./camposcar.awk
awk { i = 1 while ( i <= NF ) { print $ i ++ } } carros

Referências

Bibliografia

editar
  • AHO, Alfred V.; KERNIGAN, Brian K.; WEINBERGER, Peter J. (1988). The AWK Programming Language. Reading, Massachusetts, EUA: Addison-Wesley. 210 páginas. ISBN 0-201-07981-X 
  • DOUGHERTY, Dale; ROBBINS, Arnold (1997). Sed & Awk. Beijing: O´Reilly. 407 páginas. ISBN 1-56592-225-5 

Ligações externas

editar