Awk Command in Linux with Examples

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 bash printf .

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 BEGINpattern 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 BEGINFILEeENDFILE, 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 e printf.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:

prg.awk
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:

prg.,awk
#!/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=51awk -v n="$num" 'BEGIN {print n}'

Leave a Comment