Comando AWK


Comandos intermediário do GNU/Linux

grep-awk-sed

Comando AWK

AWK é uma linguagem de programação para processamento de dados baseados em texto, sejam eles provenientes de arquivos ou de streams de dados. Com AWK é possível: gerenciar pequenos banco de dados pessoais; gerar relatórios; validar dados; produzir índices, e fazer outras tarefas de preparação de documentos; fazer experimentos com algoritmos que podem ser adaptados posteriormente a outras linguagens de programação.

Função básica do awk é procurar por linhas (ou outras unidades de texto) em arquivos que possuem certos padrões especificados no programa; para cada “padrão” (pattern) deve haver uma ação associada, isto é, quando uma linha corresponde a um dos padrões, awk realiza a ação especificada naquela linha; depois, awk continua processando as linhas de entrada desta maneira até encontrar o fim do arquivo de entrada; o conjunto de comandos “padrão-ação” pode aparecer literalmente como um programa ou em um arquivo específico.

opções usadas

-f, arquivos de entrada são lidos em ordem; se não há arquivos, a entrada padrão é lida.

-F, serve para definir qual o carácter separador de campos no arquivo de entrada. Se por acaso não for informado -F, o awk sempre assume que os brancos (um ou mais espaços ou tabs) serão os separadores.

Quando awk é executado, deve-se especificar um programa awk que diga o que ele tem que fazer. O programa consiste numa série de regras, sendo que cada uma especifica um padrão que deve ser procurado e uma ação que deve ser tomada quando o padrão é encontrado. Sintaticamente, uma regra consiste de um padrão seguido de uma ação que deve estar entre { e }. Cada regra é separada por uma nova linha. Então, um programa awk se parece com:
<padrão> { <ação> }
<padrão> { <ação> }

O básico do AWK

Expressões Regulares

Uma expressão regular é uma maneira de descrever um conjunto de strings. A expressão regular mais simples é uma seqüência de letras, números, ou ambos.

Uma expressão regular pode ser usada como um padrão quando colocada entre /. Neste caso ela é comparada com cada registro em todo o texto. Normalmente só é necessário encontrar uma parte do texto para ter sucesso. O seguinte exemplo imprime o segundo campo de cada registro que contém os três caracteres ‘awk’ em qualquer posição.
$ awk ‘/awk/ { print $2 }’ texto.txt

Expressões regulares também podem ser usadas na correspondência de expressões. Estas expressões permitem especificar uma string a ser procurada que não precisa ser todo o registro de entrada. Os operadores ~ e !~ realizam comparações de expressões regulares. Expressões que usam estes operadores podem ser usadas como um padrão ou em comandos if, while, for e do.

Escape Sequences

Alguns caracteres não podem ser incluídos “literalmente” em expressões regulares constantes. Neste caso eles são representados com escape sequences, que são seqüências de caracteres que começam com \.

Isto é útil, por exemplo, para incluir ” numa constante do tipo string. Por exemplo:
$ awk ‘BEGIN { print “Ele disse \”Oi!\” para ela.” }’

O próprio caracter \ não pode ser incluído normalmente; deve-se colocar ‘\\’ para que um ‘\’ faça parte da string.

O caracter \ também é usado para representar caracteres que não podem ser exibidos, tais como tab ou newline. Outras utilizações são apresentadas abaixo:
\\       \
\/       /
\”       “
\a Caracter de alerta (beep)
\t tab horizontal
\v tab vertical
\b Backspace
\f Formfeed
\n Newline
\r Carriage return

Operadores de Expressões Regulares

Expressões regulares podem ser combinadas com caracteres chamados de operadores de expressões regulares ou metacaracteres, apresentados a seguir.

* \
É usado para suprimir o significado especial de um caracter quando encontrado. Por exemplo: \$, corresponde ao caracter $
* ^
Corresponde ao início de uma string. Por exemplo: ^@chapter, corresponde a uma string que começa com ‘@chapter’.
* $
É similar a ^, mas corresponde ao fim de uma string. Por exemplo: p$, corresponde a um registro que termina do ‘p’.
* .
O ponto corresponde a um único caracter, incluindo newline. Por exemplo: .P, corresponde a qualquer caracter seguido por P em uma string.
* [..]
Esta é a chamada lista de caracteres. Corresponde aos caracteres que estão entre [ e ]. Por exemplo: [MVX], corresponde a qualquer um dos caracteres ‘M’, ‘V ou ‘X’ em uma string. Um intervalo é indicado por um hífen (exemplo: [0-9]). Classe de caracter é uma notação especial para descrição de listas de caracteres que possuem um atributo específico. Uma classe de caracter consiste de: [: :]. Algumas classes de caracteres são:


[:alnum:]
caracteres alfanuméricos
[:alpha:] caracteres alfabéticos
[:blank:] espaço e tab
[:digit:] caracteres numéricos
[:cntrl:] caracteres de controle
[:print:] caracteres que podem ser impressos(- caracteres de controle)
[:punct:] caracteres de pontuação

Uma classe de equivalência é um nome para uma lista de caracteres que são equivalentes, que deve estar entre [= e =]. Por exemplo: e pode ser usado para representar e, é ou è. Neste caso, [[=e]] é uma expressão regular que corresponde a qualquer um destes caracteres (e,é,è).
* [^..]
Corresponde a qualquer caracter exceto os listados. Por exemplo: [^0-9] corresponder a qualquer caracter que não é um dígito.
* |
É um operador usado para especificar alternativas. Por exemplo: ^P|[0-9] corresponde a qualquer string que começa com P ou contém um dígito.
* (..)
São usados para agrupar expressões regulares, assim como aritméticas.
* *
Este símbolo significa que a expressão regular precedente pode ser repetida quantas vezes for necessário. Por exemplo: ph* corresponde a um p seguido de vários h.
* +
É similar a *, a expressão precedente deve aparecer pelo menos uma vez. Isto significa que wh+y corresponde a why e whhy, mas não wy.
* ?
É similar a *, mas a expressão precedente deve aparecer uma ou nenhuma vez. Por exemplo: fe?d corresponde a fed e fd.
* {n} {n,} {n,m}
Um ou dois números entre { e } denota uma expressão de intervalo. Por exemplo: wh{3}y corresponde a whhhy, mas não a why ou whhhhy; wh{3,5}y corresponde somente a whhhy, ou whhhhy ou whhhhhy; wh(2,}y corresponde a whhy ou whhhy e assim por diante.

Em expressões regulares os operadores *, + e ?, bem como { e }, possuem a maior precedência, seguidos pela concatenação e por |. Parênteses podem mudar como os operadores são agrupados.

Comandos print e printf

O print é um comando de saída simples (padrão). Já o printf é usado quando se deseja uma saída formatada.

O comando print exige simplesmente a especificação da lista de números, strings, variáveis, expressões awk e/ou campos do registro corrente (tal como $1), que devem ser exibidos, separados por vírgula. Eles são, então, exibidos separados por espaços em branco e seguidos por uma nova linha. Opcionalmente, a lista de números e strings pode ser colocada entre parênteses.
O print sem um item especificado, é equivalente a print $0, e imprime todo o registro corrente. Para imprimir uma linha em branco usa-se print “”, onde “” é a string vazia.

Há toda uma lista de variáveis internas úteis. Alguns destaques mais usados:
OFMT – formato (estilo do printf) usado na conversão de números para visualização.
FS – separador de campos da entrada
OFS – separador dos campos de saída
ORS – separador de registros de saída
ARGC, ARGV – descritores de parâmetros de chamada
ENVIRON – vetor contendo todas as variáveis do ambiente
ERRNO – número do erro ocorrido na última chamada ao sistema
NF – número de campos na linha corrente
NR – número do registro corrente

Exemplos:

1

2

3

5

1

2


3 comentários sobre “Comando AWK

  1. I do not even know how I ended up here, but I thought this post was good. I do not know who you are but certainly you are going to a famous blogger if you are not already ;) Cheers!

Os comentários estão desativados.