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).
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
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
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--1Usuarioroot7022Jul202011Cygwin.ico-rwxr-xr-x1Usuarioroot57Jul202011Cygwin.batdrwxr-xr-x+1Usuarioroot0Jul212011opt$1$2$3$4$5$6$7$8$9#$0 = Imprime toda a linha dependendo do modo que use
Exemplos de código
Sintaxe
#Sintaxe da utilização do AWK simplesawk‘<padrao-acao>’[arquivo_1][arquivo_2]...[arquivo_n]
Exemplo 1
#Exemplo abaixo ele imprime todos os clientes do arquivo lista_clientes (dentro do ambiente Unix/Linux)bash-4.1$awk'{print $0}'lista_clientesClaudiaMariaSalvador555-6666EduardoSilvaCampinas222-3333JulianoMendesManaus333-2222LuizCarlosCuritiba777-9999MarioSergioFlorianopolis888-7777MariaJuliaSalvador666-8888
Exemplo 2
#Neste caso ele imprime somente o primeiro nome do cliente e o seu telefone referenciadobash-4.1$awk'{print $1,$4}'lista_clientesClaudia555-6666Eduardo222-3333Juliano333-2222Luiz777-9999Mario888-7777Maria666-8888
Exemplo 3
# No comando ele imprime toda linha que tiver a letra Mbash-4.1$awk'/M/ {print}'lista_clientesClaudiaMariaSalvador555-6666JulianoMendesManaus333-2222MarioSergioFlorianopolis888-7777MariaJuliaSalvador666-8888
Exemplo 4
#AWK sendo utilizado em conjunto com o comando Unix ls –ltr retornando os nomes dos arquivos do argumento $9bash-4.1$ls-ltr|awk'{print $9}'Cygwin.icoCygwin.batoptusrsbinhomelibvarsrvdevetcDocumentos_Linuxbintmpproccygdrive
Exemplo 5
# 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--1Usuarioroot7022Jul202011Cygwin.ico-rwxr-xr-x1Usuarioroot57Jul202011Cygwin.batdrwxr-xr-x+1Usuarioroot0Jul212011optdrwxr-xr-x+1Usuarioroot0Jul212011usrdrwxr-xr-x+1Usuarioroot0Jul212011sbindrwxrwxrwt+1Usuarioroot0Jul212011homedrwxr-xr-x+1Usuarioroot0Jul212011libdrwxr-xr-x+1Usuarioroot0Jul212011vardrwxr-xr-x+1UsuarioNone0Jul212011srvdrwxr-xr-x+1UsuarioNone0Jul212011devdrwxrwxr-x+1Usuarioroot0Jul212011etcdrwxrwxrw-+1UsuarioNone0Jul212011Documentos_Linux
Exemplo 6
# 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.awkawk‘{i=1while(i<=NF){print$i++}}’carros
AHO, Alfred V.; KERNIGAN, Brian K.; WEINBERGER, Peter J. (1988). The AWK Programming Language. Reading, Massachusetts, EUA: Addison-Wesley. 210 páginas. ISBN0-201-07981-X !CS1 manut: Nomes múltiplos: lista de autores (link)
DOUGHERTY, Dale; ROBBINS, Arnold (1997). Sed & Awk. Beijing: O´Reilly. 407 páginas. ISBN1-56592-225-5 !CS1 manut: Nomes múltiplos: lista de autores (link)