Awk is a general-purpose scripting language designed for advanced text processing. É usado principalmente como uma ferramenta de relatórios e análise.
Ao contrário da maioria das outras linguagens de programação que são processuais, o awk é orientado por dados, o que significa que você define um conjunto de ações a serem executadas contra o texto de entrada. Ele pega os dados de entrada, transforma-o, e envia o resultado para a saída padrão.este artigo abrange o essencial da linguagem de programação awk., Saber o básico do awk irá melhorar significativamente a sua capacidade de manipular arquivos de texto na linha de comando.
How awk Works #
There are several different implementations of awk. Usaremos a implementação GNU do awk, que se chama gawk. Na maioria dos sistemas Linux, o interpretador awk
é apenas uma ligação simbólica para gawk
.
Records and fields #
Awk can process textual data files and streams. Os dados de entrada são divididos em registos e campos. Awk opera em um registro de cada vez até que o fim da entrada seja alcançado., Os registos são separados por um carácter chamado separador de registos. O separador de registro padrão é o caractere newline, o que significa que cada linha nos dados de texto é um registro. Um novo separador de registos pode ser definido usando a variável RS
.
os registos consistem em campos separados pelo separador de campos. Por padrão, os campos são separados por um espaço em branco, incluindo um ou mais caracteres tab, espaço e newline.
os campos em cada registo são referenciados pelo símbolo do dólar ($
) seguido pelo número do campo, começando com 1., O primeiro campo é representado com $1
, o segundo com $2
, e assim por diante. O último campo também pode ser referenciado com a variável especial $NF
. Todo o registro pode ser referenciado com $0
.
Aqui é uma representação visual mostrando como referência registros e campos:
tmpfs 788M 1.8M 786M 1% /run/lock /dev/sda1 234G 191G 31G 87% /|-------| |--| |--| |--| |-| |--------| $1 $2 $3 $4 $5 $6 ($NF) --> fields|-----------------------------------------| $0 --> record
programa Awk #
Para processar um texto com awk
, você escreve um programa que indica o comando que fazer., O programa consiste de uma série de regras e funções definidas pelo Usuário. Cada regra contém um padrão e um par de ação. As regras são separadas por newline ou semi-colons (;
). Tipicamente, um programa awk se parece com este:
pattern { action }pattern { action }...
quando awk
dados de processo, se o padrão corresponde ao registro, ele executa a ação especificada nesse registro. Quando a regra não tem padrão, todos os registros (linhas) são combinados.
uma ação awk é incluída em suspensórios ({}
) e consiste em declarações., Cada declaração especifica a operação a ser realizada. Uma ação pode ter mais de uma declaração separada por newline ou semi-colons (;
). Se a regra não tem nenhuma ação, é por omissão imprimir todo o registro.
Awk suporta diferentes tipos de declarações, incluindo expressões, condicionalismos, entradas, declarações de saída, e muito mais. As declarações awk mais comuns são:
-
exit
– pára a execução de todo o programa e sai., -
next
– pára de processar o registo actual e passa para o próximo registo nos dados de entrada. -
print
– imprimir registos, campos, variáveis e texto personalizado. -
printf
– Dá-lhe mais controlo sobre o formato de saída, semelhante a C e bashprintf
.
ao escrever programas awk, tudo após a marca hash (#)
e até o fim da linha é considerado um comentário., Linhas longas podem ser quebradas em várias linhas usando o carácter de continuação, barra invertida (\
).
executando programas awk #
um programa awk pode ser executado de várias maneiras. Se o programa é curto e simples, ele pode ser passado diretamente para o awk
interpretador de linha de comando:
awk 'program' input-file...
Ao executar o programa em linha de comando, ele deve estar entre aspas simples (''
), para que o shell não interpreta o programa.,
Se o programa é grande e complexo, é melhor colocá-lo em um arquivo e usar o -f
opção para passar o arquivo para o awk
comando:
awk -f program-file input-file...
Nos exemplos abaixo, vamos utilizar um arquivo chamado “equipas.txt ” que se parece com o abaixo:
Bucks Milwaukee 60 22 0.732 Raptors Toronto 58 24 0.707 76ers Philadelphia 51 31 0.622Celtics Boston 49 33 0.598Pacers Indiana 48 34 0.585
padrões Awk #
padrões no controle awk se a ação associada deve ser executada ou não.,
Awk suporta diferentes tipos de padrões, incluindo expressão regular, expressão de relação, gama e padrões de expressão especial.
Quando a regra não tem padrão, cada registro de entrada é correspondido. Aqui está um exemplo de uma regra que contém apenas uma ação:
awk '{ print $3 }' teams.txt
O programa vai imprimir o terceiro campo de cada registo:
6058514948
expressão Regular padrões #
Uma expressão regular ou expressão regular é um padrão que corresponde a um conjunto de cadeias de caracteres., Os padrões de expressão regular Awk são incluídos em barras (//
):
/regex pattern/ { action }
o exemplo mais básico é um carácter literal ou correspondência de cordas. Por exemplo, para exibir o primeiro campo de cada registro que contém “0.5”, você deve executar o seguinte comando:
awk '/0.5/ { print $1 }' teams.txt
CelticsPacers
O padrão pode ser qualquer tipo de expressão regular extendida., Aqui está um exemplo que imprime o primeiro campo se o registro começa com dois ou mais dígitos:
awk '/^/ { print $1 }' teams.txt
76ers
Relacional expressões padrões #
O relacional expressões padrões são usados, geralmente, para coincidir com o conteúdo de um campo específico ou variável.
Por padrão, padrões de expressões regulares são comparados com os registros. Para corresponder um regex a um campo, especifique o campo e use o operador de comparação “contain”(~
) contra o padrão.,
Por exemplo, para imprimir o primeiro campo de cada registro cujo segundo campo contém “ia”, digite:
awk '$2 ~ /ia/ { print $1 }' teams.txt
76ersPacers
Para coincidir campos que não contêm um determinado padrão de uso de !~
operadora:
awk '$2 !~ /ia/ { print $1 }' teams.txt
BucksRaptorsCeltics
Você pode comparar cadeias de caracteres ou números de relacionamentos, tais como, maior que, menor que, igual a, e assim por diante., O comando a seguir imprime o primeiro campo de todos os registros cujo terceiro campo é maior do que 50:
awk '$3 > 50 { print $1 }' teams.txt
BucksRaptors76ers
Intervalo de padrões #
Intervalo de padrões consistem em dois padrões separados por uma vírgula:
pattern1, pattern2
Todos os registros de partida com um registro que coincide com o primeiro padrão até que um registro que coincide com o segundo padrão são correspondidos.,
Aqui está um exemplo que imprimirá a primeira campo de todos os registros a partir do registro, incluindo “aves de Rapina” até que o registro incluindo “Celtics”:
awk '/Raptors/,/Celtics/ { print $1 }' teams.txt
Raptors76ersCeltics
Os padrões também podem ter relação expressões. O comando abaixo irá imprimir todos os registros a partir do cujo quarto campo é igual a 32, até aquele cujo quarto campo é igual a 33:
awk '$4 == 31, $4 == 33 { print $0 }' teams.txt
76ers Philadelphia 51 31 0.622Celtics Boston 49 33 0.598
Intervalo de padrões não pode ser combinada com outras expressões padrão.,
padrões de expressão especial #
Awk inclui as seguintes protecções especiais:
-
BEGIN
– usadas para realizar acções antes de serem processados registos. -
END
– usado para executar acções após o processamento dos registos.
The BEGIN
pattern is generally used to set variables and theEND
pattern to process data from the records such as calculation.
o exemplo seguinte irá imprimir ” iniciar o processamento.”, em seguida, imprimir o terceiro campo de cada registro e, finalmente, “processamento final.,”:
awk 'BEGIN { print "Start Processing." }; { print $3 }; END { print "End Processing." }' teams.txt
Start Processing6058514948End Processing.
Se um programa tem somente um BEGIN
padrão, as ações são executadas e os dados de entrada não é processado. Se um programa tem apenas um padrão
, a entrada é processada antes de executar as ações das regras.
a versão Gnu do awk também inclui mais dois padrões especiais BEGINFILE
eENDFILE
, o que lhe permite realizar acções ao processar ficheiros.,
combinando padrões #
Awk permite combinar dois ou mais padrões usando o lógico e o operador (&&
) e lógico ou operador (||
).,
Aqui está um exemplo que usa o &&
operador para imprimir o primeiro campo de aqueles registro cujo terceiro campo é maior que 50 e o quarto campo é menor do que 30:
awk '$3 > 50 && $4 < 30 { print $1 }' teams.txt
BucksRaptors
Variáveis internas #
Awk tem uma série de variáveis internas que contêm informações úteis e permite que você controle como o programa é processado. Abaixo estão algumas das variáveis embutidas mais comuns:
-
NF
– o número de Campos no registro., -
NR
– o número do registo actual. -
FILENAME
– o nome do ficheiro de entrada que é actualmente processado. -
FS
– separador de campo. -
RS
– separador de Registos. -
OFS
– separador de campo de saída. -
ORS
– separador de registo de saída.,
Aqui está um exemplo mostrando como imprimir o nome do arquivo e o número de linhas (registros):
awk 'END { print "File", FILENAME, "contains", NR, "lines." }' teams.txt
File teams.txt contains 5 lines.
Variáveis em AWK pode ser definida em qualquer linha do programa. Para definir uma variável para todo o programa, coloque-a em um padrão BEGIN
.
alterando o separador de campo e registo #
o valor por omissão do separador de campo é qualquer número de espaços ou tabulações. Ele pode ser alterado pela configuração na variável FS
.,
Por exemplo, para definir o separador de campo para .
você usaria:
awk 'BEGIN { FS = "." } { print $1 }' teams.txt
Bucks Milwaukee 60 22 0Raptors Toronto 58 24 076ers Philadelphia 51 31 0Celtics Boston 49 33 0Pacers Indiana 48 34 0
O separador de campo também pode ser configurado para mais do que um caracteres:
awk 'BEGIN { FS = ".." } { print $1 }' teams.txt
Ao executar o awk one-liners na linha de comando, você também pode usar o -F
opção para alterar o separador de campo:
awk -F "." '{ print $1 }' teams.txt
Por padrão, o registro separador é um caractere de nova linha e pode ser alterado usando o RS
variável.,
Aqui está um exemplo mostrando como alterar o registro separador .
:
awk 'BEGIN { RS = "." } { print $1 }' teams.txt
Bucks Milwaukee 60 22 0732 Raptors Toronto 58 24 0707 76ers Philadelphia 51 31 0622Celtics Boston 49 33 0598Pacers Indiana 48 34 0585
Awk Ações #
Awk ações são delimitados por chaves ({}
) e executado quando o padrão de jogos. Uma ação pode ter zero ou mais declarações. Múltiplas declarações são executadas na ordem que aparecem e devem ser separadas por newline ou semi-colons (;
).,
Existem vários tipos de declarações de ação que são suportadas em awk:
- expressões, tais como atribuição variável, operadores aritméticos, incrementadores e operadores decrementes.
- Controle de instruções, utilizado para controlar o fluxo do programa (
if
for
while
switch
, e mais) - Saída de instruções, como
print
eprintf
.declarações compostas, para agrupar outras declarações., - declarações de entrada, para controlar o processamento da entrada.declarações de eliminação
- , Para remover elementos da lista.
a declaraçãoprint
é provavelmente a declaração awk mais usada. Ele imprime uma saída formatada de texto, registros, campos e variáveis.ao imprimir vários itens, você precisa separá-los com vírgulas., Aqui está um exemplo:
awk '{ print $1, $3, $5 }' teams.txt
O impresso itens são separados por espaços simples:
Bucks 60 0.732Raptors 58 0.70776ers 51 0.622Celtics 49 0.598Pacers 48 0.585
Se você não usar vírgulas, não haverá nenhum espaço entre os itens:
awk '{ print $1 $3 $5 }' teams.txt
Os itens impressos são concatenados:
Bucks600.732Raptors580.70776ers510.622Celtics490.598Pacers480.585
Quando print
é usado sem um argumento, o valor padrão é print $0
. O registo actual está impresso.,
Para imprimir um texto personalizado, você pode citar-se o texto com aspas duplas caracteres:
awk '{ print "The first field:", $1}' teams.txt
The first field: BucksThe first field: RaptorsThe first field: 76ersThe first field: CelticsThe first field: Pacers
Você também pode imprimir caracteres especiais, tais como quebra de linha:
awk 'BEGIN { print "First line\nSecond line\nThird line" }'
First lineSecond lineThird line
printf
declaração dá a você mais controle sobre o formato de saída., id=”aa8cfd3cbd”>
printf
não criar uma marca de nova linha após cada registro, por isso estamos usando \n
:
1. Bucks Milwaukee 60 22 0.732 2. Raptors Toronto 58 24 0.707 3. 76ers Philadelphia 51 31 0.622 4. Celtics Boston 49 33 0.598 5. Pacers Indiana 48 34 0.585
O seguinte comando calcula a soma dos valores armazenados no terceiro campo em cada linha:
awk '{ sum += $3 } END { printf "%d\n", sum }' teams.txt
266
Aqui está outro exemplo que mostra como utilizar expressões e indicações de controle para imprimir os quadrados dos números de 1 a 5:
awk 'BEGIN { i = 1; while (i < 6) { print "Square of", i, "is", i*i; ++i } }'
Square of 1 is 1Square of 2 is 4Square of 3 is 9Square of 4 is 16Square of 5 is 25
Uma linha de comandos, tais como as acima são mais difíceis de entender e manter., Ao escrever programas mais longos, você deve criar um arquivo de programa separado:
BEGIN { i = 1 while (i < 6) { print "Square of", i, "is", i*i; ++i } }
Executar o programa, passando o nome do arquivo para o awk
interpretador:
awk -f prg.awk
Você também pode executar um programa awk como um executável usando o shebang directiva e configuração de awk
intérprete:
#!/usr/bin/awk -fBEGIN { i = 1 while (i < 6) { print "Square of", i, "is", i*i; ++i } }
Salve o arquivo e torná-lo executável :
chmod +x prg.awk
agora Você pode executar o programa digitando:
./prg.awk
Usar Variáveis Shell em Awk Programas #
Se você estiver usando o awk
comando no shell scripts, as chances são de que você precisa para passar uma variável de shell para o awk programa. Uma opção é fechar o programa com aspas duplas em vez de aspas simples e substituir a variável no programa., No entanto, esta opção tornará o seu programa awk mais complexo, uma vez que terá de escapar às variáveis awk.
a forma recomendada de usar variáveis de linha de comandos em programas awk é atribuir a variável de linha de comandos a uma variável awk. Aqui está um exemplo:
num=51
awk -v n="$num" 'BEGIN {print n}'