Comando awk do Linux
Em sistemas operacionais do tipo Unix, o comando awk executa o AWK, uma linguagem de programação de processamento de texto.
Este documento cobre a versão GNU / Linux do AWK, gawk . Nos sistemas Linux, o comando awk geralmente é um link simbólico para o arquivo executável / usr / bin / gawk .
Descrição
Abreviação de “Aho, Weinberger e Kernighan”, AWK é uma linguagem de programação interpretada que se concentra no processamento de texto.
O AWK foi desenvolvido na década de 1970 no Bell Labs por Alfred Aho, Peter Weinberger e Brian Kernighan . Ele foi projetado para executar operações complexas de correspondência de padrões em fluxos de dados textuais. Faz uso intenso de strings , matrizes associativas e expressões regulares e é imensamente útil para analisar dados do sistema e gerar relatórios automáticos.
O AWK é um antecessor direto do Perl e ainda é muito útil em sistemas modernos. O projeto de software livre GNU distribui uma versão de código aberto do AWK chamada gawk .
Sintaxe
awk [ -F fs ] [ -v var=value ] [ 'prog' | -f progfile ] [ file ... ]
Argumentos
-F fs | Define o separador do campo de entrada para a expressão regular fs . |
-v var=value | Atribui o valor do valor à variável var antes de executar o programa awk. |
‘prog’ | Um programa awk . |
-f progfile | Especifique um arquivo, progfile , que contém o programa awk a ser executado. |
file … | Um arquivo a ser processado pelo programa awk especificado. |
visão global
O Awk verifica cada arquivo de entrada em busca de linhas que correspondam a qualquer conjunto de padrões especificados literalmente em prog ou em um ou mais arquivos especificados como -f progfile . Com cada padrão, pode haver uma ação associada que será executada quando uma linha de um arquivo corresponder ao padrão. Cada linha é comparada com a parte do padrão de cada instrução de ação do padrão; a ação associada é executada para cada padrão correspondido. O nome do arquivo ” – ” (um traço) instrui o awk a ler a partir da entrada padrão . A opção -v seguida de var = value é uma atribuição a ser feita antes da execução do prog ; qualquer número de opções -v pode estar presente. A opção -F fs define o separador do campo de entrada como a expressão regular fs .
Uma linha de entrada é normalmente composta de campos separados por espaços em branco ou pela expressão regular fs . Os campos são indicados como $ 1, $ 2, … , enquanto $ 0 se refere à linha inteira. Se fs for nulo, a linha de entrada é dividida em um campo por caractere .
Uma instrução de ação padrão tem o formato
pattern { action }
Uma { ação } ausente significa imprimir a linha; se nenhum padrão for especificado, ele sempre corresponderá. As instruções de ação padrão são separadas por novas linhas ou ponto e vírgula.
Uma ação é uma sequência de instruções. Uma declaração pode ser uma das seguintes:
If( expression ) statement [ else statement ]
while( expression ) statement
for( expression ; expression ; expression ) statement
for( var in array ) statement
do statement while( expression )
break
continue
{ [ statement ... ] }
expression
print [ expression-list ] [ > expression ]
printf format [ , expression-list ] [ > expression ]
return [ expression ]
next
(pula os padrões restantes nesta linha de entrada)
nextfile
(pula o restante deste arquivo, abre em seguida, inicia no topo)
delete array[ expression ]
(exclui um elemento da matriz)
delete array
(exclui todos os elementos da matriz)
exit [ expression ]
(sai imediatamente; status de saída é a avaliação da expressão )
As declarações são encerradas por ponto-e-vírgula, novas linhas ou chaves à direita. Uma lista de expressões vazia significa $ 0 . As constantes de seqüência de caracteres são citadas “” , com as fugas comuns de C reconhecidas. As expressões assumem valores numéricos ou de seqüência de caracteres, conforme apropriado, e são criadas usando os operadores + , – , * , / , % , ^ (exponenciação) e concatenação (indicado por espaço em branco).
operadores ! , ++ , – , + = , – = , * = , / = , % = , ^ = , > , > = , < , <= , == ,! = e ?: também estão disponíveis nas expressões. As variáveis podem ser escalares, elementos de matriz (denotados x [i] ) ou campos. Variáveis são inicializadas para a cadeia nula . Os subscritos de matriz podem ser qualquer sequência, não necessariamente numéricos; isso permite uma forma de memória associativa. Múltiplos subscritos como [i, j, k] são permitidos; os constituintes são concatenados, separados pelo valor de SUBSEP .
A instrução print imprime seus argumentos na saída padrão (ou em um arquivo se > file ou >> estiver presente ou em um pipe se | cmd estiver presente), separados pelo separador de campos de saída atual e finalizados pelo separador de registros de saída . file e cmd podem ser nomes literais ou expressões entre parênteses; valores de sequência idênticos em diferentes instruções indicam o mesmo arquivo aberto. A instrução printf formata sua lista de expressões de acordo com o formato (consulte printf ). A função interna close (expr) fecha o arquivo ou pipe expr . A função interna fflush (expr) libera qualquer saída em buffer para o arquivo ou pipe expr .
As funções matemáticas exp , log , sqrt , sin , cos e atan2 estão embutidas. Outras funções embutidas:
length | O comprimento de seu argumento usado como uma string ou $ 0 se não houver argumento. |
rand | Número aleatório entre 0 e 1 |
srand | Define a semente para rand e retorna a semente anterior. |
int | Trunca para um valor inteiro |
substr ( s , m , n ) | A substring de n- caractere de s que começa na posição m contada a partir de 1. |
index(s, t) | A posição em s onde a sequência t ocorre ou 0 se não ocorrer. |
match(s, r) | A posição em s onde a expressão regular r ocorre ou 0 se não ocorrer. As variáveis RSTART e RLENGTH são definidas para a posição e o comprimento da sequência correspondente. |
split(s, a, fs) | Divide a string s em elementos da matriz a [1], a [2], …, a [ n ] e retorna n . A separação é feita com a expressão regular fs ou com o separador de campo FS se fs não for fornecido. Uma sequência vazia como separador de campo divide a sequência em um elemento da matriz por caractere. |
sub ( r , t , s ) | Substitui t pela primeira ocorrência da expressão regular r na sequência s . Se s não for fornecido, $ 0 será usado. |
gsub | O mesmo que sub, exceto que todas as ocorrências da expressão regular são substituídas; sub e gsub retornam o número de substituições. |
sprintf ( fmt , expr , … ) | A sequência resultante da formatação expr … de acordo com o formato printf fmt |
system(cmd) | Executa o cmd e retorna seu status de saída |
tolower ( str ) | Retorna uma cópia de str com todos os caracteres maiúsculos traduzidos para seus equivalentes minúsculos correspondentes. |
toupper ( str ) | Retorna uma cópia de str com todos os caracteres minúsculos traduzidos para seus equivalentes maiúsculos correspondentes. |
A função getline define $ 0 para o próximo registro de entrada do arquivo de entrada atual; O arquivo getline < define $ 0 para o próximo registro do arquivo. getline x define a variável x . Finalmente, cmd | getline canaliza a saída do cmd para o getline ; cada chamada de getline retorna a próxima linha de saída do cmd . Em todos os casos, getline retorna 1 para uma entrada bem-sucedida, 0 para final de arquivo e -1 para um erro.
Padrões são combinações booleanas arbitrárias (com ! || && ) de expressões regulares e expressões relacionais. Expressões regulares são como definidas em re_format . Expressões regulares isoladas em um padrão se aplicam a toda a linha. Expressões regulares também podem ocorrer em expressões relacionais, usando os operadores ~ e ! ~ . / re / é uma expressão regular constante; qualquer string (constante ou variável) pode ser usada como expressão regular, exceto na posição de uma expressão regular isolada em um padrão.
Um padrão pode consistir em dois padrões separados por vírgula; nesse caso, a ação é executada para todas as linhas de uma ocorrência do primeiro padrão a uma ocorrência do segundo.
Uma expressão relacional é uma das seguintes:
expressão matchop expressão regular
expressão relançar expressão
expressão em nome da matriz
( expr , expr , ...) no nome da matriz
onde um relop é um dos seis operadores relacionais em C e um matchop é ~ (correspondências) ou ! ~ (não corresponde). Condicional é uma expressão aritmética, uma expressão relacional ou uma combinação booleana deles.
Os padrões especiais BEGIN e END podem ser usados para capturar o controle antes que a primeira linha de entrada seja lida e depois da última. BEGIN e END não combinam com outros padrões.
Nomes de variáveis com significados especiais:
CONVFMT | Formato de conversão usado ao converter números (padrão: % .6g ). |
FS | Expressão regular usada para separar campos; também configurável pela opção -F fs . |
NF | Número de campos no registro atual. |
NR | Número ordinal do registro atual. |
FNR | Número ordinal do registro atual no arquivo atual. |
FILENAME | O nome do arquivo de entrada atual. |
RS | Separador de registros de entrada (padrão: nova linha). |
OFS | Separador de campos de saída (padrão: em branco). |
ORS | Separador de registros de saída (padrão: nova linha). |
OFMT | Formato de saída para números (padrão: % .6g ). |
SUBSEP | Caractere para separar vários subscritos (padrão: 034 , que é o código ASCII para aspas duplas). |
ARGC | Contagem de argumentos, atribuível. |
ARGV | Matriz de argumentos, atribuível; membros não nulos são tomados como nomes de arquivos. |
ENVIRON | Matriz de variáveis de ambiente; subscritos são nomes. |
As funções podem ser definidas (na posição de uma instrução de ação padrão) assim:
função foo ( a , b , c ) {...; retornar x }
Os parâmetros são passados por valor (se escalar ) ou por referência (se nome da matriz); funções podem ser chamadas recursivamente . Os parâmetros são locais para a função; todas as outras variáveis são globais. Assim, variáveis locais podem ser criadas fornecendo parâmetros em excesso na definição da função.
Exemplos
awk 'length ($ 0)> 72' text.txt
Imprima apenas as linhas do arquivo text.txt com mais de 72 caracteres.
awk '{print $ 2, $ 1}' data.txt
Imprima os dois primeiros campos de dados na ordem oposta. Por exemplo, se o arquivo data.txt contiver as linhas:
maçã vermelha azul berry verde polegar
… então a saída do comando awk acima seria:
maçã baga vermelha azul polegar verde
A maioria dos programas awk é muito longa para especificar na linha de comando. Se o programa estiver salvo no arquivo prog.awk , o comando abaixo.
awk -f prog.awk file.txt
O comando acima executa o programa awk em prog.awk para processar o conteúdo do arquivo file.txt .
O restante dos exemplos são apenas os programas awk.
{s + = $ 1} END {print "soma é", s, "média é", s / NR}
Este programa adicionará a primeira coluna do seu arquivo de entrada e imprimirá a soma e a média dos valores.
/ start /, / stop /
Este programa imprimirá todas as linhas de texto encontradas entre ” iniciar ” e ” parar “.
INÍCIO { para (i = 1; i <ARGC; i ++) printf "% s", ARGV [i] printf "\ n" Saída }
Este programa awk simula o comando echo .
Comandos relacionados
gawk – versão do AWK do GNU.