Académique Documents
Professionnel Documents
Culture Documents
Dezembro, 2010
Empresa Brasileira de Pesquisa Agropecuria
Embrapa Informtica Agropecuria
Ministrio da Agricultura, Pecuria e Abastecimento
Documentos 103
Autor
Apresentao
Mesmo que o Windows ainda seja, disparado, o sistema operacional mais
utilizado e conhecido pelas pessoas no mundo todo, o Linux vem se difundindo cada vez mais em diversos nichos da populao, sejam profissionais
de informtica ou no.
Uma das grandes vantagens do Linux sobre seu concorrente a diversidade
de comandos que seu terminal shell (interface de linha de comando) possui,
o que se tornou uma caracterstica forte deste sistema operacional.
O awk um desses comandos que faz o terminal shell do Linux ser a marca
forte desse sistema. um comando to importante e com tantas funcionalidades que muitos o confundem com uma linguagem de programao.
O presente trabalho procura fazer uma pequena introduo sobre as principais possibilidades de utilizao do awk, desde a construo de simples
linhas de comando at a programao de pequenos scripts para execuo
no shell do Linux.
Sumrio
O comando awk................................................................................ 9
Utilizando o awk............................................................................. 10
Listagem de dados......................................................................... 11
Os padres usados pelo awk........................................................ 13
Trabalhando com expresses relacionais................................... 13
Trabalhando com expresses regulares...................................... 15
Utilizando BEGIN e END................................................................ 17
As variveis no awk....................................................................... 17
Operadores aritmticos do awk.................................................... 21
Funes matemticas.................................................................... 21
Trabalhando com cadeias de caracteres..................................... 23
O comando if................................................................................ 25
O comando while.......................................................................... 27
O comando for.............................................................................. 29
O comando awk
Pela quantidade de recursos que possui e pela sua total integrao ao
shell (interface de linha de comando) do Unix e Linux, muitos consideram o
awk como uma linguagem de programao. Comando ou linguagem, todos
concordam que o awk uma ferramenta excelente para resolver desde os
problemas simples at os mais complexos que aparecem no dia-a-dia de
usurios e administradores de sistemas operacionais Unix e Linux.
O awk possui esse nome em virtude dos sobrenomes dos trs programadores que escreveram o comando: Alfred V. Aho, Peter J. Weinberg e Brian
W. Kernighan. Eles queriam desenvolver um comando que englobasse as
funes da famlia grep (grep, egrep e fgrep) e do sed, o que resultou no
awk.
A funo do awk analisar um conjunto de linhas de entrada, uma por
uma, procurando as que satisfaam a determinados padres ou condies
especificados pelo usurio.
Veja a estrutura bsica a seguir:
[ padro / condio ]
[ (ao) ]
10
Exemplo:
awk $1 == Jose { print $2, $3 } arquivo1
O exemplo anterior ilustra bem uma tpica instruo awk, ou seja, do tipo
padro-ao. A instruo mostrada imprime o segundo e o terceiro campos de cada linha do arquivo arquivo1 quando o primeiro campo for igual
a Jose. Em resumo, o comando awk ir executar a ao especificada
(que pode ter diversos passos) para cada padro ou condio que encontrar na linha que estiver lendo.
Utilizando o awk
H duas formas de se executar o awk:
A partir da linha de comando, como a seguir:
awk <padrao-acao> [arquivo_1] [arquivo_2] ...
[arquivo_n]
Note que tanto o padro quanto a ao vm entre apstrofos. Isso serve
para inibir do Shell a interpretao de caracteres especiais, como o cifro
($), e tambm para permitir que o comando se prolongue por quantas
linhas forem necessrias.
A partir de um arquivo de comando, usando a opo -f, como a seguir:
awk -f <arquivo de programa> <lista de arquivos
de entrada>
A leitura dos dados feita linha por linha, que por padro uma sequncia
de caracteres terminada por um new-line (ASCII 10). E cada linha (ou registro) lida dividida em campos, que, por padro, so uma sequncia de
caracteres separados por <TAB> (ASCII 9) ou por espaos em branco.
Salvador
555-6666
Juliano Mendes
Manaus
333-2222
Eduardo Silva
Luiz Carlos
Mario Sergio
Maria Julia
Campinas
Curitiba
Florianopolis
Salvador
222-3333
777-9999
888-7777
666-8888
Listagem de dados
Para se fazer uma listagem simples de um arquivo usando o awk, pode se
usar o seguinte comando::
$ awk { print } clientes
Claudia Maria
Salvador
555-6666
Juliano Mendes
Manaus
333-2222
Eduardo Silva
Campinas
222-3333
11
12
Luiz Carlos
Curitiba
777-9999
Maria Julia
Salvador
666-8888
Mario Sergio
Florianpolis
888-7777
$3 } clientes
Claudia Salvador
Eduardo Campinas
Juliano Manaus
Luiz Curitiba
Mario Florianpolis
Maria Salvador
Note que apenas o primeiro nome, do campo nome, foi exibido, pois o awk,
por padro, interpreta tanto espao em branco como <TAB> como separador de campos. Sendo assim, para o comando o campo cidade est na
posio 3. Agora, se desejar que o separador seja o <TAB>, basta digitar o
comando abaixo:
$ awk BEGIN{FS=\t}{print $1, $3} clientes
Claudia Maria 555-6666
Eduardo Silva 222-3333
13
14
No exemplo seguinte, vamos mostrar como possvel utilizar os operadores de comparao com cadeias de caracteres, listando os registros do
arquivo clientes em que o primeiro campo (com o primeiro nome) inicie a
partir da letra J:
$ awk $1 > J { print } clientes
Juliano Mendes
Manaus
333-2222
Mario Sergio
Florianpolis
888-7777
Luiz Carlos
Maria Julia
Curitiba
Salvador
777-9999
666-8888
possvel tambm montar expresses compostas, combinando operadores relacionais simples com os operadores lgicos || (ou), && (e) e !
(no).
Supondo que se esteja procurando o telefone de uma pessoa cujo segundo nome sabe-se que comea pela letra S ou M, pode-se usar o comando
abaixo:
$ awk $2 >= M || $2 >= S { print } clientes
Claudia Maria
Salvador
555-6666
Juliano Mendes
Manaus
333-2222
Eduardo Silva
Mario Sergio
Campinas
Florianpolis
222-3333
888-7777
Salvador
555-6666
Mario Sergio
Florianpolis
888-7777
Juliano Mendes
Maria Julia
Manaus
Salvador
333-2222
666-8888
Florianpolis
Salvador
888-7777
666-8888
Salvador
555-6666
15
16
Juliano Mendes
Manaus
333-2222
Maria Julia
Salvador
666-8888
Luiz Carlos
Curitiba
777-9999
Salvador
555-6666
Juliano Mendes
Manaus
333-2222
Eduardo Silva
Campinas
222-3333
Alm dos metacaracteres citados anteriormente, o awk reconhece os seguintes caracteres (Tabela 3).
Vale lembrar que o caractere \t (do <TAB>) j foi utilizado num exemplo
anterior.
Cidade
Telefone
Eduardo Silva
Campinas
222-3333
Claudia Maria
Juliano Mendes
Luiz Carlos
Mario Sergio
Maria Julia
Salvador
Manaus
Curitiba
Florianpolis
Salvador
555-6666
333-2222
777-9999
888-7777
666-8888
As variveis no awk
O awk trabalha com dois tipos de variveis:
Variveis definidas pelo prprio programador, ou seja, variveis de
trabalho que sero controladas pelo prprio programa.
Variveis Internas, que so variveis pr-definidas e que so muito
utilizadas pelo awk. Devem ser sempre usadas em letras maisculas,
sem o cifro ($) precedendo-as, sendo que cada uma possui uma
funo.
Na Tabela 4, observa-se as variveis internas do awk.
17
18
Cidade
Telefone
Eduardo Silva
Campinas
222-3333
Claudia Maria
Juliano Mendes
Luiz Carlos
Mario Sergio
Maria Julia
Salvador
Manaus
Curitiba
Florianpolis
Salvador
Total de registros = 6
555-6666
333-2222
777-9999
888-7777
666-8888
Vamos ver um exemplo de como contar o nmero de registros que possuem um determinado padro:
Salvador
Encontrados
registros
Maria Julia
Salvador
555-6666
666-8888
Corsa-3portas
Corsa-Sedan
Corsa-4portas
Corsa-Wagon
Plio
Plio-Weekend
Tipo
Gol
Parati
19
20
$ cat listacar.awk
awk
Corsa-3portas
Vel.Max.
0 a 100
Cons.
182
11.10
10.00
Corsa-4portas
Corsa-Sedan
Corsa-Wagon
Palio
Plio-Weekend
Tipo
Gol
Parati
MEDIAS:
Velocidade 177.11
Preco
18431.27
150
182
183
188
15.20
11.10
12.20
9.50
185
11.92
175
12.40
176
173
11.70
12.20
Preco
12.20
16068.00
10.00
17376.49
12.71
10.90
10.65
11.00
11.60
11.31
16928.44
20253.45
19974.15
21200.44
18310.70
16960.50
18809.22
Funes matemticas
O awk possui diversas funes matemticas internas para manipulao de
dados numricos, as quais esto na Tabela 6.
21
22
23
24
Foi retornado o valor 6, que corresponde ao nome Jose, pois foi procurado por uma sequncia Jo seguida ou no de outro caractere o mais o
caractere s.
v[3] = virgula
O comando if
O comando if no awk, como na linguagem C, possui a seguinte sintaxe:
if (expressao)
{
comando 1
comando 2
. . .
comando n
else
{
comando 1
comando 2
. . .
comando n
25
26
}
Dentro de expresso pode ser includos operadores lgicos (||, &&,
!), operadores relacionais (<, <=, >, >=, == e !=) e operadores
de pesquisa em expresses regulares (~ e !~).
Observe um exemplo do comando if utilizando o arquivo carros que, ao
seu final, exibir o carro mais veloz e o mais econmico:
$ cat velecon.awk
if ( $2 > MaxVel )
{
CarVel=$1
MaxVel=$2
if ( $4 < MinCons )
{
CarEcon=$1
MinCons=$4
END {
O comando while
A sintaxe do comando while o seguinte:
while (expressao)
{
comando 1
comando 2
. . .
comando n
Os comandos dentro de while so executados at que o valor de expresso seja falso (0 zero).
Vejamos um exemplo de while para listar cada campo do arquivo carros
em uma linha:
$ cat camposcar.awk
awk {
i = 1
while ( i <= NF )
{
print $i
i ++
} carros
O script inicializar a varivel i com 1 e o comando while, enquanto o valor de i for menor ou igual ao nmero de campos da linha atual, ir imprimir
(print) cada campo em uma linha diferente, acrescentando 1 a i aps a
impresso (print). A sada gerada por esse script awk ser a seguinte, com cada campo lido em uma linha diferente:
27
28
$ ./camposcar.awk
Corsa-3portas
150
15.20
12.20
16068.00
Corsa-4portas
182
11.10
10.00
16928.44
Corsa-Sedan
182
11.10
10.00
17376.49
Corsa-Wagon
183
12.20
12.71
20253.45
Plio
188
9.50
10.90
19974.15
Plio-Weekend
185
11.92
10.65
21200.44
Tipo
176
11.70
11.00
18310.70
Gol
175
12.40
11.60
16960.50
Parati
173
12.20
11.31
18809.22
O comando for
A sintaxe do comando for a seguinte:
for (expressao1; expressao2; expressao3)
{
comando 1
comando 2
...
comando n
29
30
invs do while:
$ cat camposcar2.awk
awk {
print $i
} carros
Nesse exemplo, o comando for inicializou a varivel i com 1, incrementando-a em 1 at que seu valor fosse menor ou igual ao nmero de campos
do registro (NF). Ou seja, fez o mesmo que o comando while no exemplo
anterior a este, sendo que a sada exatamente igual tambm.
END {
print Registro[i]
} clientes
Nesse exemplo, foi guardado o contedo de cada linha do arquivo clientes, representada por $0, dentro do vetor Registro. Usando o comando
for, o programa faz um loop para listar cada linha do vetor, partindo da
ltima linha (NR) at a primeira. Executando este script, o resultado o
seguinte:
$ ./tac.awk
Maria Julia
Salvador
666-8888
Luiz Carlos
Curitiba
777-9999
Mario Sergio
Juliano Mendes
Eduardo Silva
Florianpolis
Manaus
Campinas
888-7777
333-2222
222-3333
31
32
Claudia Maria
Salvador
555-6666
O awk permite tambm que indexemos os vetores com valores no numricos. No exemplo a seguir, foi criado um vetor que armazena o campo
velocidade do arquivo carros, sendo que o indexador o campo modelo
(no numrico):
$ cat indexauto.awk
awk
{
}
END {
} carros
Aps a execuo desse programa, a sada foi a seguinte:
$ ./indexauto.awk
Plio-Weekend
Plio
Tipo
185
188
176
Corsa-4portas
182
Corsa-Wagon
183
Corsa-Sedan
182
Gol
Parati
Corsa-3portas
175
173
150
Velocidades [$1] = $2
END {
sort
} carros
o resultado ser outro:
$ ./indexauto.awk
Corsa-3portas
150
Corsa-Sedan
182
Corsa-4portas
Corsa-Wagon
Gol
Plio
182
183
175
188
33
34
Plio-Weekend
Parati
Tipo
185
173
176
Recebendo parmetros
O awk permite tambm que passemos parmetros para programas escritos com ele. Esses parmetros sero recebidos por uma varivel inteira e
por um vetor. Essas variveis so as seguintes:
ARGC Essa varivel contm a quantidade de parmetros recebidos;
ARGV Vetor que contm os valores recebidos. Seus elementos variam
desde ARGV[0], que contm o nome da rotina, at ARGV[ARGC 1].
Vejamos um exemplo com o uso dessas variveis:
$ cat param.awk
awk
BEGIN {
35
36
{
}
print ARGV[i], \n
} $*
Florianpolis
888-7777
Literatura recomendada
AURELIO.NET [Site do autor]. Disponvel em: <http://aurelio.net/shell>.
Acesso em: 13 dez. 2010.
NEVES, J. C. Programao Shell Linux. Rio de Janeiro: Brasport, 2005.
p. 261-295.
37
CGPE 9059