comando awk
Propósito
Encontra linhas em arquivos que correspondem a um padrão e executa ações especificadas nessas linhas.
Sintaxe
awk [ -u ] [ -F Ere ] [ -v Designação ] ... { -f ProgramArquivo | 'Programa' } [ [ Arquivo ... | Designação ... ] ] ...
Descrição
O comando awk usa um conjunto de instruções fornecidas pelo usuário para comparar um conjunto de arquivos, uma linha por vez, para estenderem as expressões regulares fornecidas pelo usuário. Em seguida, as ações são executadas mediante qualquer linha que corresponda às expressões regulares estendidas.
O padrão em busca do comando awk é mais geral do que o do comando grep , e permite que o usuário realize diversas ações em linhas de texto de entrada. A linguagem de programação de comandos awk não requer compilação, e permite que o usuário utilize variáveis, funções numéricas, funções string e operadoras lógicas.
O comando awk é afetado pelas variáveis de ambiente LANG, LC_ALL, LC_COLLATE, LC_CTYPE, LC_MENSAGENS, LC_NUMÉRICO, NLSPATHe PATH .
Os tópicos a seguir são abordados neste artigo:
Entrada para o Comando awk
O comando awk leva dois tipos de entrada: arquivos de texto de entrada e instruções do programa.
Arquivos de Texto de Entrada
Pesquisa e ações são executadas em arquivos de texto de entrada. Os arquivos são especificados por:
- Especificando a variável Arquivo na linha de comando.
- Modificando as variáveis especiais ARGV e ARGC.
- Fornecendo entrada padrão na ausência da variável Arquivo .
Se vários arquivos forem especificados com a variável Arquivo , os arquivos serão processados na ordem especificada.
Instruções Do Programa
Instruções fornecidas pelo usuário controlam as ações do comando awk . Essas instruções são provenientes da variável ` Program' na linha de comandos ou de um arquivo especificado pelo sinalizador -f junto com a variável ProgramFile Se vários arquivos de programas forem especificados, os arquivos são concatenados na ordem especificada e a ordem resultante de instruções é utilizada.
Saída para o Comando awk
O comando awk produz três tipos de saída a partir dos dados dentro do arquivo de texto de entrada:
- Os dados selecionados podem ser impressos para a saída padrão, sem alteração no arquivo de entrada.
- As porções selecionadas do arquivo de entrada podem ser alteradas.
- Os dados selecionados podem ser alterados e impressos para a saída padrão, com ou sem alteração do conteúdo do arquivo de entrada.
Todos esses tipos de saída podem ser executados no mesmo arquivo. A linguagem de programação reconhecida pelo comando awk permite que o usuário redirecionar a saída.
Processamento de Arquivos com Registros e Campos
Os arquivos são processados da seguinte maneira:
- O comando awk varre suas instruções e executa quaisquer ações especificadas para ocorrer antes que o arquivo de entrada seja lido.
A instrução COMEÇAR na linguagem de programação awk permite que o usuário especifique um conjunto de instruções a serem feitas antes que o primeiro registro seja lido. Isso é particularmente útil para inicializar variáveis especiais.
- Um registro é lido a partir do arquivo de entrada.
Um registro é um conjunto de dados separados por um separador de registros. O valor padrão para o separador de registro é o caractere de nova linha, o que faz com que cada linha no arquivo seja um registro separado. O separador de registro pode ser alterado configurando a variável especial RS .
- O registro é comparado a cada padrão especificado pelas instruções do comando awk .
As instruções de comando podem especificar que um campo específico dentro do registro seja comparado. Por padrão, os campos são separados por espaço em branco (espaços em branco ou guias). Cada campo é referido por uma variável de campo. O primeiro campo em um registro é atribuído a variável $1 , o segundo campo é atribuído a variável $2 , etc. O registro inteiro é atribuído à variável $0 . O separador de campo pode ser alterado usando-se a sinalização -F na linha de comando ou configurando o FS variável especial. A variável especial FS pode ser configurada para os valores de: branco, caractere único ou expressão regular estendida.
- Se o registro corresponde a um padrão, quaisquer ações associadas a esse padrão são realizadas no registro.
- Depois que o registro é comparado a cada padrão, e todas as ações especificadas são executadas, o próximo registro é lido a partir de entrada; o processo é repetido até que todos os registros sejam lidos a partir do arquivo de entrada.
- Se vários arquivos de entrada tiverem sido especificados, o próximo arquivo será então aberto e o processo repetido até que todos os arquivos de entrada tenham sido lidos.
- Após a leitura do último registro no último arquivo, o comando awk executa quaisquer instruções especificadas para ocorrer após o processamento de entrada.
A instrução END na linguagem de programação awk permite que o usuário especifique ações a serem executadas após a leitura do último registro. Isso é particularmente útil para o envio de mensagens sobre o que o trabalho foi realizado pelo comando awk .
Linguagem de Programação de Comando awk
A linguagem de programação de comandos awk consiste em instruções na forma:
Padrão { Action }
Se um registro corresponde ao padrão especificado, ou contém um campo que corresponde ao padrão, a ação associada é então realizada. Um padrão pode ser especificado sem uma ação, caso em que a linha inteira contendo o padrão é escrita para saída padrão. Uma ação especificada sem um padrão é realizada para cada registro de entrada.
Padrões
Existem quatro tipos de padrões usados na sintaxe de linguagem de comandos awk :
Expressões Regulares
As expressões regulares estendidas usadas pelo comando awk são semelhantes àquelas usadas pelo comando grep ou egrep . A forma mais simples de uma expressão regular estendida é uma sequência de caracteres fechados em barras. Para um exemplo, suponha um arquivo denominadotestfiletinha os seguintes conteúdos:
smawley, andy
smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexisEntrando na linha de comando a seguir:
awk '/smi/' testfileimprimiria a saída padrão de todos os registros que continou uma ocorrência da stringsmi. Neste exemplo, o programa'/smi/'para o comando awk é um padrão sem nenhuma ação. A saída é:
smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexisOs seguintes caracteres especiais são usados para formar expressões regulares estendidas:
| Caractere (Character) | Função |
|---|---|
| + | Especifica que uma string corresponde se uma ou mais ocorrências do caractere ou expressão regular estendida que precede o + (mais) estão dentro da string. A linha de comando:imprime à saída padrão qualquer registro que continha uma string com os caracteressmit, seguido por um ou maishcaracteres, e, em seguida, terminando com os caracteresern. A saída neste exemplo é: |
| ? | Especifica que uma string corresponde se zero ou uma ocorrências do caractere ou expressão regular estendida que precede o? (ponto de interrogação) estão dentro da sequência. A linha de comando:imprime à saída padrão de todos os registros que contêm os caracteressmit,seguido por zero ou uma instância doh!. A saída neste exemplo é: |
| | | Especifica que uma string corresponde se qualquer uma das strings separadas pela | (linha vertical) estiver dentro da string. A linha de comando:imprime à saída padrão de todos os registros que continem a stringallenoualan. A saída neste exemplo é: |
| ( ) | Agrupa cadeias em expressões regulares. A linha de comando:imprime à saída padrão de todos os registros com a stringaeoualleouanneouallnne. A saída neste exemplo é: |
| { m } | Especifica que uma string corresponde se exatamente m ocorrências do padrão estão dentro da string. A linha de comando:imprime à saída padrão |
| {m, } | Especifica que uma string corresponde se pelo menos m ocorrências do padrão estiverem dentro da string. A linha de comando:imprime à saída padrão: |
| {m, n} | Especifica que uma string corresponde se entre m e n, inclusiva, ocorrências do padrão estão dentro da string (onde m < = n). A linha de comando:imprime à saída padrão: |
| [Sequência] | Significa que a expressão regular corresponde a quaisquer caracteres especificados pela variável Sequência dentro dos colchetes. A linha de comando:imprime à saída padrão de todos os registros com os caracteressmseguido por qualquer caractere em ordem alfabética deaparah. A saída neste exemplo é: |
| [^ Sequência] | A ^ (careta) dentro do [] (colchetes) e no início da string especificada indica que a expressão regular não faz corresponde a quaisquer caracteres dentro dos colchetes. Assim, a linha de comando:imprime à saída padrão: |
| ~,!~ | Significa uma instrução condicional que uma variável especificada corresponde (inclinação) ou não corresponde (inclinação, ponto de exclamação) a expressão regular. A linha de comando:imprime à saída padrão de todos os registros cujo primeiro campo continha o caracteren.A saída neste exemplo é: |
| ^ | Significa o início de um campo ou registro. A linha de comando:imprime à saída padrão de todos os registros com o caracterehcomo o primeiro caractere do segundo campo. A saída neste exemplo é: |
| $ | Significa o fim de um campo ou registro. A linha de comando:imprime à saída padrão de todos os registros com o caractereycomo o último caractere do segundo campo. A saída neste exemplo é: |
| . (período) | Significa qualquer um caractere, exceto o caracter de nova linha terminal no final de um espaço. A linha de comando:imprime à saída padrão de todos os registros com os caracteresae e separados por dois caracteres. A saída neste exemplo é: |
| *(asterisco) | Significa zero ou mais de quaisquer caracteres. A linha de comando:imprime à saída padrão de todos os registros com os caracteresae e separados por zero ou mais caracteres. A saída neste exemplo é: |
| \ (barra invertida) | O caráter de fuga. Quando precedendo qualquer um dos caracteres que tenham significado especial em expressões regulares estendidas, o caractere de escape remove qualquer significado especial para o personagem. Por exemplo, a linha de comando:corresponderia ao padrão a //, uma vez que os retrocessos negam o significado usual da barra como um delimitador da expressão regular. Para especificar o backslash em si como um caractere, use uma barra inverte dupla. Veja o item a seguir sobre sequências de escape para obter mais informações sobre a barra invernada e seus usos. |
Seqüências De Escape Reconhecidas
O comando awk reconhece a maioria das sequências de escape usadas em convenções de linguagem C, assim como várias que são usadas como caracteres especiais pelo próprio comando awk . As seqüências de escape são:
| seqüência de escape | Caractere Representado |
|---|---|
| \" | \" (Cocitação dupla) marca |
| \/ | / (slash) caractere |
| \ddd | Caractere cuja codificação é representada por um número inteiro octal de um, dois ou três dígitos, em que d representa um dígito octal |
| \\ | \ (backslash) caractere |
| \a | Caractere de alerta |
| \b | Caractere de backspace |
| \f | Caractere de alimentação de forma |
| \n | Caractere de nova linha (veja a seguir nota) |
| \r | Caractere de retorno de carro |
| \t | Caractere de guia |
| \v | Guia vertical. |
Nota: Exceto nas funções gsub, match, divisãoe sub embutidas, a correspondência de expressões regulares estendidas é baseada em registros de entrada. Caracteres de separador de registro (o caractere de nova linha por padrão) não pode ser integrado na expressão, e nenhuma expressão corresponde ao caractere de separador de registro. Se o separador de registro não for o caractere de nova linha, então o caractere de nova linha pode ser correspondido. Nas quatro funções integradas especificadas, a correspondência é baseada em strings de texto, e qualquer caractere (incluindo o separador de registro) pode ser incorporado no padrão para que o padrão corresponda ao caráter adequado. No entanto, em toda a expressão regular combinando com o comando awk , o uso de um ou mais caracteres NULL no padrão produz resultados indefinidos.
Expressões Relacionais
As operadoras relacionais < (menor do que),> (maior que), < = (menor ou igual a),> = (maior ou igual a), = = (igual a), e! = (não igual a) pode ser usado para formar padrões. Por exemplo, o padrão:
$1 < $4corresponde aos registros onde o primeiro campo é menor que o quarto campo. Os operadores relacionais também trabalham com valores string. Por exemplo:
$1 =! "q"corresponde a todos os registros onde o primeiro campo não é umq. Os valores de String também podem ser correspondidos em valores de ordenação. Por exemplo:
$1 >= "d"corresponde a todos os registros onde o primeiro campo começa com um caractere que éa,b,coud. Se nenhuma outra informação for dada, as variáveis de campo são comparadas como valores string.
Combinações de Padrões
Os padrões podem ser combinados usando três opções:
- Intervalos são especificados por dois padrões separados com a, (vírgula). As ações são executadas em todos os registros iniciando com o registro que corresponde ao primeiro padrão, e continuando por meio e incluindo o registro que corresponde ao segundo padrão. Por exemplo:
corresponde ao registro contendo a sequênciabegin, e a cada registro entre ele e o registro contendo a stringend, incluindo o registro contendo a sequênciaend./begin/,/end/ - Parênteses () padrões de grupo juntos.
- As operadoras booleanas | | (ou), & & (e), e! (não) combinar padrões em expressões que combinam se avaliarem true, caso contrário não combinam. Por exemplo, o padrão:
corresponde registros onde o primeiro campo éale o segundo campo é123.$1 == "al" && $2 == "123"
BEGIN e END Patterns
Ações especificadas com o padrão COMEÇAR são executadas antes de qualquer entrada ser lida. As ações especificadas com o padrão END são realizadas após toda a entrada ter sido lida. Vários padrões COMEÇAR e END são permitidos e processados na ordem especificada. Um padrão END pode preceder um padrão COMEÇAR dentro das instruções do programa. Se um programa consiste apenas em instruções COMEÇAR , as ações são executadas e nenhuma entrada é lida. Se um programa consiste apenas em instruções END , toda a entrada é lida antes de quaisquer ações serem tomadas.
Ações
Existem vários tipos de instruções de ação:
- Instruções De Ação
- Funções Integradas
- Funções Definidas Pelo Usuário
- Instruções Condicionais
- Ações de Saída
Instruções De Ação
As instruções de ação são encerradas em { } (braces). Se as instruções forem especificadas sem um padrão, elas são realizadas em cada registro. Diversas ações podem ser especificadas dentro do aparelho, mas devem ser separadas por caracteres de nova linha ou; (semicolons), e as instruções são processadas na ordem em que aparecem. As instruções de ação incluem:
- Declarações Aritméticas
- Os operadores matemáticos + (mais),-(menos), / (divisão), ^ (exponenciação), * (multiplicação),% (modulus) são utilizados na forma:
Expression Operator ExpressionAssim, a instrução:
$2 = $1 ^ 3atribui o valor do primeiro campo elevado à terceira potência para o segundo campo.
- Declarações Unárias
- O unário - (menos) e o unário + (mais) operam como na linguagem de programação C:
+Expression or -Expression
- Demonstrações de incremento e Decaposentadoria
- As instruções de pré-incremento e pré-decretação operam como na linguagem de programação C:
++Variable or --VariableAs instruções pós-incremento e pós-decretação operam como na linguagem de programação C:
Variable++ or Variable--
- Instruções De Designação
- Os operadores de designação + = (adição),-= (subtração), / = (divisão), e * = (multiplicação) operam como na linguagem de programação C, com o formulário:
Variable += ExpressionVariable -= ExpressionVariable /= ExpressionVariable *= ExpressionPor exemplo, a instrução:
$1 *= $2multiplica a variável de campo $1 pela variável de campo $2 e, em seguida, designa o novo valor para $1.
Os operadores de designação ^ = (exponenciação) e% = (modulus) possuem o formulário:
Variable1^=Expression1E
Variable2%=Expression2e são equivalentes às instruções de linguagem de programação C:
Variable1=pow(Variable1, Expression1)E
Variable2=fmod(Variable2, Expression2)em quepowé o pow subroutine efmodé a subroutina fmod .
- Instruções Concatenação String
- Os valores da sequência podem ser concatenados, declarando-os lado a lado. Por exemplo:
$3 = $1 $2designa a concatenação das strings nas variáveis de campo $1 e $2 para a variável de campo $3.
Funções Integradas
A linguagem de comando awk usa funções aritméticas, funções de cadeia e funções gerais. A instrução próxima Subroutine é necessária se você pretende escrever um arquivo, depois leia-o posteriormente no mesmo programa.
Funções Aritméticas
As funções aritméticas a seguir executam as mesmas ações que as subroutines de linguagem C pelo mesmo nome:
| Item | Descrição |
|---|---|
| atan2( y, x ) | Retorna arctangent de y/x. |
| cos ( x ) | Retorna cosseno de x; x está em radianos. |
| o pecado ( x ) | Retorna sin de x; x está em radianos. |
| exp ( x ) | Retorna a função exponencial de x. |
| log ( x ) | Retorna o logaritmo natural de x. |
| sqrt ( x ) | Retorna a raiz quadrada de x. |
| int ( x ) | Retorna o valor de x truncado para um inteiro. |
| rand ( ) | Retorna um número aleatório n, com 0 < = n < 1. |
| srand ( [Expr] ) | Configura o valor da semente para a função rand para o valor do parâmetro Expr , ou use o tempo do dia se o parâmetro Expr for omitido. O valor da semente anterior é devolvido. |
Funções de sequência de caracteres
As funções string são:
| Item | Descrição |
|---|---|
| gsub ( Ere, Repl, [ Em ] ) | Executa exatamente como a função sub , exceto que todas as ocorrências da expressão regular são substituídas. |
| sub ( Ere, Repl, [ Em ] ) | Substitui a primeira ocorrência da expressão regular estendida especificada pelo parâmetro Ere na string especificada pelo parâmetro Em com a string especificada pelo parâmetro Repl . A função sub retorna o número de substituições. Um & (ampersand) aparecendo na string especificada pelo parâmetro Repl é substituído pela string no parâmetro Em que corresponde à expressão regular estendida especificada pelo parâmetro Ere . Se nenhum parâmetro Em for especificado, o valor padrão será o registro inteiro (a variável de registro $0 ). |
| índice ( String1, String2 ) | Retorna a posição, numerando a partir de 1, dentro da string especificada pelo parâmetro String1 onde ocorre a string especificada pelo parâmetro String2 . Se o parâmetro String2 não ocorrer no parâmetro String1 , será retornado um 0 (zero). |
| comprimento [(Sequência)] | Retorna o comprimento, em caracteres, da cadeia especificada pelo parâmetro Sequência . Se nenhum parâmetro Sequência for dado, o comprimento de todo o registro (a variável de registro $0 ) será retornado. |
| comprimento [(Sequência)] | Retorna o comprimento, em bytes, da string especificada pelo parâmetro Sequência . Se nenhum parâmetro Sequência for dado, o comprimento de todo o registro (a variável de registro $0 ) será retornado. |
| substr ( Sequência, M, [ N ] ) | Retorna uma substring com o número de caracteres especificados pelo parâmetro N . A substring é retirada da string especificada pelo parâmetro Sequência , iniciando com o caractere na posição especificada pelo parâmetro M . O parâmetro M é especificado com o primeiro caractere no parâmetro Sequência como número 1. Se o parâmetro N não for especificado, o comprimento da substring será a partir da posição especificada pelo parâmetro M até o final do parâmetro Sequência. |
| match ( Sequência, Ere ) | Retorna a posição, em caracteres, numerando a partir de 1, na string especificada pelo parâmetro Sequência onde ocorre a expressão regular estendida especificada pelo parâmetro Ere , ou então retorna um 0 (zero) se o parâmetro Ere não ocorrer. A variável especial RSTART é definida com o valor de retorno. A variável especial RLENGTH é definida como o comprimento da cadeia de caracteres correspondente ou como -1 (um negativo) se nenhuma correspondência for encontrada. |
| split ( Sequência, A, [Ere] ) | Divide a string especificada pelo parâmetro Sequência em elementos array A[1], A[2],.. ., A[n], e retorna o valor da variável n . A separação é feita com a expressão regular estendida especificada pelo parâmetro Ere ou com o separador de campo atual (a variável especial FS ) se o parâmetro Ere não for dado. Os elementos na matriz A são criados com valores string, a menos que o contexto indique um elemento em particular também deve ter um valor numérico. |
| tolower ( Sequência ) | Retorna a string especificada pelo parâmetro Sequência , com cada caractere maiús-percaso na string alterada para minúsção. O mapeamento em maiúsculas e minúsculas é definido pela categoria LC_CTYPE do locale atual. |
| toupper ( Sequência ) | Retorna a string especificada pelo parâmetro Sequência , com cada caractere minúspide na sequência alterada para maiús-maiúsculas. O mapeamento em maiúsculas e minúsculas é definido pela categoria LC_CTYPE do locale atual. |
| sprintf (Formato, Expr, Expr, . . . ) | Formata as expressões especificadas pelos parâmetros Expr de acordo com a cadeia de formato de subroutine printf especificada pelo parâmetro Formato e retorna a string resultante. |
Funções Gerais
As funções gerais são:
| Item | Descrição |
|---|---|
| fechar ( Expressão ) | Feche o arquivo ou tubo aberto por uma instrução imprimir ou printf ou uma chamada para a função getline com o mesmo parâmetro Expressão string valorizada. Se o arquivo ou tubo for fechado com sucesso, um 0 será retornado; caso contrário, um valor diferente de zero será retornado. A instrução fechar é necessária se você pretende gravar um arquivo, em seguida, leia o arquivo posteriormente no mesmo programa. |
| sistema (Comando ) | Executa o comando especificado pelo parâmetro Comando e retorna o seu status de saída. Equivalente ao subroutine sistema . |
| Expressão | getline [ Variável ] | Lê um registro de entrada de um fluxo pipado a partir da saída de um comando especificado pelo parâmetro Expressão e designa o valor do registro para a variável especificada pelo parâmetro Variável . O fluxo é criado se nenhum fluxo estiver atualmente aberto com o valor do parâmetro Expressão como seu nome de comando. O fluxo criado é equivalente a um criado por uma chamada para a subroutine popen com o parâmetro Comando levando o valor do parâmetro Expressão e o parâmetro Modo configurado para um valor de r. Cada chamada subsequente para a função getline lê outro registro, desde que o fluxo permaneça aberto e o parâmetro Expressão seja avaliado para a mesma string. Se um parâmetro Variável não for especificado, a variável de registro $0 e a variável especial NF serão definidas para o registro lido a partir do fluxo. |
| getline [ Variável ] < Expressão | Lê o próximo registro de entrada do arquivo denominado pelo parâmetro Expressão e configura a variável especificada pelo parâmetro Variável para o valor do registro. Cada chamada subsequente para a função getline lê outro registro, desde que o fluxo permaneça aberto e o parâmetro Expressão seja avaliado para a mesma string. Se um parâmetro Variável não for especificado, a variável de registro $0 e a variável especial NF serão definidas para o registro lido a partir do fluxo. |
| getline [ Variável ] | Configura a variável especificada pelo parâmetro Variável para o próximo registro de entrada a partir do arquivo de entrada atual. Se nenhum parâmetro Variável for especificado, $0 gravar variável será configurado para o valor do registro, e as variáveis especiais NF, NRe FNR também serão definidas. |
Observação: todas as formas da função getline retornam 1 para uma entrada bem-sucedida, zero para o fim do arquivo e -1 para um erro.
Funções Definidas Pelo Usuário
As funções definidas pelo usuário são declaradas na seguinte forma:
function Name (Parameter, Parameter,...) { Statements }Uma função pode ser referência em qualquer lugar em um programa de comandos awk e seu uso pode preceder sua definição. O escopo da função é global.
Os parâmetros de função podem ser escalares ou matrizes. Os nomes de parâmetros são locais para a função; todos os outros nomes de variáveis são globais. O mesmo nome não deve ser usado para entidades diferentes; por exemplo, um nome de parâmetro não deve ser duplicado como nome de função, ou variável especial. As variáveis com escopo global não devem compartilhar o nome de uma função. Os escalares e matrizes não devem ter o mesmo nome no mesmo escopo.
O número de parâmetros na definição de função não tem como corresponder o número de parâmetros utilizados quando a função é chamada. Os parâmetros formais em excesso podem ser usados como variáveis locais. Parâmetros escalares extras são inicializados com um valor string equivalente à string vazia e um valor numérico de 0 (zero); os parâmetros extra array são inicializados como matrizes vazias.
Ao invocar uma função, nenhum espaço em branco é colocado entre o nome da função e o parêntese de abertura. As chamadas de função podem ser aninhadas e recursivas. Ao retornar de qualquer chamada de função aninhada ou recursiva, os valores de todos os parâmetros da função de chamada devem ficar inalterados, exceto os parâmetros da matriz transmitidos por referência. A instrução voltar pode ser usada para retornar um valor.
Dentro de uma definição de função, os caracteres new-line são opcionais antes da abertura { (brace) and after the closing } (brace).
Um exemplo de uma definição de função é:
function average ( g,n)
{
for (i in g)
sum=sum+g[i]
avg=sum/n
return avg
} A média da função é passada uma matriz,g, e uma variável,n, com o número de elementos na matriz. A função então obtém uma média e a devolve.
Instruções Condicionais
A maioria das instruções condicionais na linguagem de programação de comandos awk tem a mesma sintaxe e função como instruções condicionais na linguagem de programação C. Todas as instruções condicionais permitem o uso de { } (braces) para agrupar declarações. Uma nova linha opcional pode ser usada entre a porção de expressão e a parte de instrução da instrução condicional, e novas-linhas ou; (ponto e vírgula) são usadas para separar várias instruções em { } (braces). Seis instruções condicionais em linguagem C são:
| Item | Descrição |
|---|---|
| if | Requer a seguinte sintaxe: se ( Expressão ) { Declaração} [ else Action ] |
| enquanto | Requer a seguinte sintaxe: enquanto ( Expressão ) { Declaração } |
| para | Requer a seguinte sintaxe: for ( Expression ; Expression ; Expression ) { Declaração } |
| dividir | Faz com que o loop do programa seja exitado quando a instrução quebra é usada em uma instrução enquanto ou para . |
| continuar | Faz com que o loop do programa se mova para a iteração seguinte quando a instrução continuar é usada em uma instrução enquanto ou para . |
Cinco instruções condicionais na linguagem de programação de comandos awk que não seguem as regras de C-language são:
| Item | Descrição |
|---|---|
| para ... em | Requer a seguinte sintaxe: para ( Variável in Array ) { Declaração } A instrução para...em configura o parâmetro Variável para cada valor de índice da variável Matriz , um índice por vez e em nenhuma ordem específica, e executa a ação especificada pelo parâmetro Declaração com cada iteração. Veja a instrução excluir para um exemplo de uma instrução para...em . |
| se ... em | Requer a seguinte sintaxe: if ( Variable in Array ) { Declaração } A instrução se...em procura a existência do elemento Matriz . A instrução é realizada se o elemento Matriz for encontrado. |
| excluir | Requer a seguinte sintaxe: excluir Matriz [ Expressão ] A instrução excluir exclui tanto o elemento da matriz especificado pelo parâmetro Matriz quanto o índice especificado pelo parâmetro Expressão . Por exemplo, as afirmações: excluiria cada elemento dog[]matriz. |
| exit | Requer a seguinte sintaxe: saída [ Expressão ] A instrução saída primeiro invoca todas as ações END na ordem em que elas ocorrem, então finaliza o comando awk com um status de saída especificado pelo parâmetro Expressão . Nenhuma ação END subsequente é invocada se a instrução saída ocorrer dentro de uma ação END . |
| # | Requer a seguinte sintaxe: # Comentário A instrução # coloca comentários. Os comentários devem sempre terminar com uma nova-linha mas podem começar em qualquer lugar em uma linha. |
| avançar | Pára o processamento do registro de entrada atual e prossegue com o próximo registro de entrada. |
Instruções De Saída
Duas instruções de saída na linguagem de programação de comandos awk são:
| Item | Descrição |
|---|---|
| imprimir | Requer a seguinte sintaxe: print [ ExpressionList ] [ Redirecionamento ] [ Expressão ] A instrução print grava o valor de cada expressão especificada pelo parâmetro ExpressionList na saída padrão. Cada expressão é separada pelo valor atual da variável especial OFS , e cada registro é finalizado pelo valor atual da variável especial ORS . A saída pode ser redirecionada usando o parâmetro Redirecionamento , que pode especificar as três redirecionamentos de saída com o> (maior que),>> (duplo maior que), e o | (pipe). O parâmetro Redirecionamento especifica como a saída é redirecionada, e o parâmetro Expressão é um nome de caminho para um arquivo (quando o parâmetro Redirecionamento é> ou>>) ou o nome de um comando (quando o parâmetro Redirecionamento for a |). |
| printf | Requer a seguinte sintaxe: printf Formato [, ExpressionList ] [ Redirecionamento ] [ Expressão ] A instrução printf grava na saída padrão as expressões especificadas pelo parâmetro ExpressionList no formato especificado pelo parâmetro Format . A instrução printf funciona exatamente como o comando printf , exceto para ocespecificação de conversão (%c). Os parâmetros Redirecionamento e Expressão funcionam o mesmo que na instrução imprimir . Para ocespecificação de conversão: se o argumento tiver um valor numérico, o caractere cuja codificação é esse valor será saída. Se o valor for zero ou não for a codificação de qualquer caractere no conjunto de caracteres, o comportamento será indefinido. Se o argumento não tiver um valor numérico, o primeiro caractere do valor string será saída; se a string não contém nenhum caractere o comportamento será indefinido. |
Nota: Se o parâmetro Expressão especificar um nome de caminho para o parâmetro Redirecionamento , o parâmetro Expressão deverá ser enfechado em cotações duplas para insure que ele é tratado como uma string.
Variáveis
As variáveis podem ser escalares, variáveis de campo, matrizes ou variáveis especiais. Os nomes de variáveis não podem começar com um dígito.
As variáveis podem ser usadas apenas referenciando-as. Com exceção dos parâmetros da função, eles não são declarados explicitamente. Variáveis escalares não inicializadas e elementos da matriz possuem um valor numérico de 0 (zero) e um valor string da string nula ("").
As variáveis assumem valores numéricos ou string de acordo com o contexto. Cada variável pode ter um valor numérico, um valor string ou ambos. Por exemplo:
x = "4" + "8"atribui o valor de12para a variávelx. Para constantes de cadeia, as expressões devem ser enfecadas em "" (aspas duplas) marcas.
Não há conversões explícitas entre números e strings. Para forçar uma expressão a ser tratada como um número, adicio 0 (zero) a ele. Para forçar uma expressão a ser tratada como uma string, anexe uma string nula ("").
Variáveis De Campo
As variáveis de campo são designadas por um $ (sinal de dólar) seguido por uma expressão numérica ou numérica. O primeiro campo em um registro é atribuído a variável $1 , o segundo campo é designado para a variável $2 , etc. A variável de campo $0 é atribuída a todo o registro. Novas variáveis de campo podem ser criadas atribuem um valor a elas. Atribuindo um valor a um campo inexistente, ou seja, qualquer campo maior que o valor atual da variável de campo $NF , força a criação de quaisquer campos intervencionantes (configurados para a cadeia nula), aumenta o valor da variável especial NF e força o valor de $0 variável de registro a ser recalculado. Os novos campos são separados pelo separador de campo atual (que é o valor da variável especial FS ). Espaços em branco e guias são os separadores de campo padrão. Para alterar o separador de campo, use a sinalização -F ou atribua a variável especial FS um valor diferente no programa de comandos awk .
Matrizes
As matrizes estão inicialmente vazias e seus tamanhos mudam dinamicamente. As matrizes são representadas por uma variável com subscritos em [] (colchetes). Os subscritos, ou identificadores de elementos, podem ser números de strings, que fornecem um tipo de capacidade de matriz associativa. Por exemplo, o programa:
/red/ { x["red"]++ }
/green/ { y["green"]++ }incrementos conta para ambos osredcontador e ogreencontador.
As matrizes podem ser indexadas com mais de um subscrito, semelhantes a matrizes multidimensionais em algumas linguagens de programação. Como as matrizes de programação para o comando awk são realmente uma dimensionais, os subscritos separados por vírgula são convertidos em uma única string concatenando os valores string das expressões separadas, com cada expressão separada pelo valor da variável ambiental SUBSEP . Portanto, as duas operações de índice seguintes são equivalentes:
x[expr1, expr2,...exprn]E
x[expr1SUBSEPexpr2SUBSEP...SUBSEPexprn]Ao utilizar o operador em , um valor de Índice multidimensional deve ser contido dentro de parênteses. Exceto para o operador em , qualquer referência a um elemento de matriz inexistente cria automaticamente esse elemento.
Variáveis Especiais
As variáveis a seguir têm significado especial para o comando awk :
| Item | Descrição |
|---|---|
| ARGC | O número de elementos na matriz ARGV . Esse valor pode ser alterado. |
| ARGV | A matriz com cada membro contendo uma das variáveis de arquivo ou variáveis de atribuição, extraídas em ordem da linha de comando e numeradas de 0 (zero) a ARGC -1. Como cada arquivo de entrada é finalizado, o próximo membro da matriz ARGV fornece o nome do próximo arquivo de entrada, a menos que:
|
| CONVFMT | O formato printf para conversão de números para strings (exceto para instruções de saída, onde a variável especial OFMT é usada). O padrão é "%.6g". |
| ENVIRÃO | Uma matriz representando o ambiente sob o qual o comando awk opera. Cada elemento da matriz é do formulário: ENVIRON [ " Environment VariableName " ] = EnvironmentVariableValue Os valores são configurados quando o comando awk inicia a execução, e esse ambiente é usado até o fim da execução, independentemente de qualquer modificação da variável especial ENVIRÃO . |
| nome do arquivo | O nome do caminho do arquivo de entrada atual. Durante a execução de uma ação COMEÇAR , o valor de FILENAME é indefinido. Durante a execução de uma ação END , o valor é o nome do último arquivo de entrada processado. |
| FNR | O número do registro de entrada atual no arquivo atual. |
| FS | O separador de campo de entrada. O valor padrão é um branco. Se o separador de campo de entrada for um branco, qualquer número de espaços definidos por locale pode separar campos. A variável especial FS pode levar dois valores adicionais:
|
| NF | O número de campos no registro atual, com limite de 99. Dentro de uma ação COMEÇAR , a variável especial NF é indefinida, a menos que uma função getline sem um parâmetro Variável tenha sido emitida anteriormente. Dentro de uma ação END , a variável especial NF mantém o valor que tinha para o último registro de leitura, a menos que uma função subseqüente, redirecionada, getline sem um parâmetro Variável seja emitida antes de entrar na ação END . |
| NR | O número do registro de entrada atual. Dentro de uma ação COMEÇAR o valor da variável especial NR é 0 (zero). Dentro de uma ação END , o valor é o número do último registro processado. |
| OFMT | O formato printf para conversão de números para strings em instruções de saída. O padrão é "% .6g". |
| OFS | O separador de campo de saída (padrão é um espaço). |
| ORS | O separador de registro de saída (padrão é um caractere de nova linha). |
| RLENGTH | O comprimento da sequência correspondeu à função match . |
| OS | Separador de registro de entrada (padrão é um caractere de nova linha). Se a variável especial RS for nula, os registros são separados por seqüências de uma ou mais linhas em branco; liderar ou rastar linhas em branco não resultam em registros vazios no início ou fim de entrada; e o caractere de nova linha é sempre um separador de campo, independentemente do valor da variável especial FS . |
| RSTART | A posição inicial da sequência correspondeu à função match , numerando a partir de 1. Equivalente ao valor de retorno da função match . |
| SUBSEÇÃO | Separa vários subscritos. O padrão é \031. |
Sinalizações
| Item | Descrição |
|---|---|
| -f ProgramFile | Obtém instruções para o comando awk do arquivo especificado pela variável ProgramFile . Se a sinalização -f for especificada várias vezes, a concatenação dos arquivos, na ordem especificada, será usada como o conjunto de instruções. |
| -u | Exibe a saída em um modo não buffered. Se esta sinalização for usada, o comando awk não armazene a saída. Em vez disso, ele exibe a saída instantaneamente. Por padrão, o comando awk exibe a saída em um modo buffered. |
| -F Ere | Usa a expressão regular estendida especificada pela variável Ere como separador de campo. O separador de campo padrão é um branco. |
| -v Designação | Atribui um valor a uma variável para a linguagem de programação do comando awk . O parâmetro Designação está na forma de Nome = Valor. A porção Nome especifica o nome da variável e pode ser qualquer combinação de sublinos, dígitos e caracteres alfabéticos, mas deve começar com um caractere alfabético ou um sublinhado. A porção Valor também é composta por sublinos, dígitos e caracteres alfabéticos, e é tratada como se ela fosse precedida e seguida por um " (caractere de aspas duplas, semelhante a um valor string). Se a porção Valor for numérica, a variável também será atribuído o valor numérico. A designação especificada pela sinalização -v ocorre antes que qualquer parcela do programa do comando awk seja executada, incluindo a seção COMEÇAR . |
| Designação | Atribui um valor a uma variável para a linguagem de programação do comando awk . Ele tem a mesma forma e função que a variável Designação com a sinalização -v , exceto o tempo em que cada um é processado. O parâmetro Designação é processado justamente antes do arquivo de entrada (especificado pela variável Arquivo ) que o segue na linha de comando. Se o parâmetro Designação for especificado apenas antes do primeiro de vários arquivos de entrada, as designações serão processadas logo após as seções COMEÇAR (se houver). Se um parâmetro Designação ocorrer após o último arquivo, a atribuição será processada antes das seções END (se houver). Se nenhum arquivo de entrada for especificado, as designações são processadas a entrada padrão é lida. |
| Arquivo | Especifica o nome do arquivo que contém a entrada para processamento. Se nenhuma variável Arquivo for especificada, ou se um sinal de - (menos) for especificado, a entrada padrão será processada. |
| 'Programa' | Contém as instruções para o comando awk . Se a sinalização -f não for especificada, a variável Programa deverá ser o primeiro item da linha de comando. Ele deve ser brackeado por '' (citações únicas). |
Status de saída
Esse comando retorna os valores de saída a seguir:
| Item | Descrição |
|---|---|
| 0 | Conclusão bem-sucedida. |
| >0 | Ocorreu um erro. |
Você pode alterar o status de saída dentro do programa usando a instrução condicional saída [ Expressão ] .
Exemplos
- Para exibir as linhas de um arquivo que tenham mais de 72 caracteres, digite:
Isso seleciona cada linha dochapter1arquivo que tem mais de 72 caracteres e grava estas linhas para saída padrão, pois não é especificado nenhum Ação . Um caractere de guia é contado como 1 byte.awk 'length >72' chapter1 - Como exibir todas as linhas entre as palavras startestop,incluindo "start"e "stop",Digite:
awk '/start/,/stop/' chapter1 - Para executar um programa de comandos awk ,sum2.awk,que processa o arquivo,chapter1, digite:
O programa a seguir,sum2.awk, computa a soma e média dos números na segunda coluna do arquivo de entrada,chapter1:awk -f sum2.awk chapter1
A primeira ação acrescenta o valor do segundo campo de cada linha para a variávelsum. Todas as variáveis são inicializadas para o valor numérico de 0 (zero) quando referenciadas pela primeira vez. O padrão END antes da segunda ação faz com que essas ações sejam executadas depois que todo o arquivo de entrada foi lido. A variável especial NR , que é usada para calcular a média, é uma variável especial especificando o número de registros que foram lidos.{ sum += $2 } END { print "Sum: ", sum; print "Average:", sum/NR; } - Para imprimir os dois primeiros campos em ordem contrária, digite:
awk '{ print $2, $1 }' chapter1 - O programa awk a seguir
imprime os dois primeiros campos do arquivochapter2com campos de entrada separados por vírgula e / ou espaços em branco e guias e, em seguida, adiciona-se a primeira coluna, e imprime a soma e média:awk -f sum3.awk chapter2BEGIN {FS = ",|[ \t]+"} {print $1, $2} {s += $1} END {print "sum is",s,"average is", s/NR }