Como usar o comando awk no Linux

Conteúdo

En Linux, awk é um dínamo de manipulação de texto de linha de comando, bem como uma poderosa linguagem de script. Aqui está uma introdução a alguns de seus recursos mais interessantes.

RELACIONADO: 10 comandos básicos do Linux para iniciantes

Como ganhou o nome dele

a awk O comando foi nomeado usando as iniciais das três pessoas que escreveram a versão original em 1977: Alfred Aho, Peter Weinberger, e Brian Kernighan. Esses três homens eram da lendária NO&T Bell Labs Pantheon Unix. Com contribuições de muitos outros desde então, awk continuou a evoluir.

É uma linguagem de script completa, bem como um kit de ferramentas de manipulação de texto completo para a linha de comando. Se esta postagem abrir seu apetite, poderia olhe para cada detalhe sobre awk e sua funcionalidade.

Regras, padrões e ações

awk funciona em programas que contêm regras compostas por padrões e ações. A ação é executada no texto que corresponde ao padrão. Os padrões são colocados entre colchetes ({}). Juntos, um padrão e uma ação formam uma regra. A totalidade awk O programa está entre aspas simples (').

Vamos dar uma olhada no tipo mais simples de awk Programa. Não tem padrão, então ele corresponde a todas as linhas de texto inseridas nele. Isso significa que a ação ocorre em todas as linhas. Nós vamos use-o na saída de a who comando.

Aqui está a saída padrão de who:

quem

Podemos não precisar de todas essas informações, mas sim, só queremos ver os nomes nas contas. Podemos canalizar a saída de who dentro de awke depois diga awk imprimir apenas o primeiro campo.

Por padrão, awk considera um campo como uma sequência de caracteres cercada por um espaço em branco, o início de uma linha ou o fim de uma linha. Os campos são identificados com um cifrão ($) e um número. Então, $1 representa o primeiro campo, o que vamos usar com isso print ação para imprimir o primeiro campo.

Nós escrevemos o seguinte:

quem | awk '{imprimir $1}'

awk imprima o primeiro campo e descarte o resto da linha.

Podemos imprimir quantos campos quisermos. Se adicionarmos uma vírgula como separador, awk imprima um espaço entre cada campo.

Escrevemos o seguinte para também imprimir a hora em que a pessoa logou (campo quatro):

quem | awk '{imprimir $1,$4}'

Existem alguns identificadores de campo especiais. Eles representam toda a linha de texto e o último campo na linha de texto:

  • $ 0: Representa toda a linha de texto.
  • $ 1: Representa o primeiro campo.
  • $ 2: Representa o segundo campo.
  • $ 7: Representa o sétimo campo.
  • $ 45: Representa o campo 45.
  • $ NF: Significa “número de campos” y representa o último campo.

Vamos escrever o seguinte para abrir um pequeno arquivo de texto contendo uma pequena citação atribuída a Dennis Ritchie:

gato dennis_ritchie.txt

Nós queremos awk imprimir o primeiro, segundo e último campo da citação. tenha em conta que, mesmo quando embrulhado na janela do terminal, é apenas uma linha de texto.

Nós escrevemos o seguinte comando:

awk '{imprimir $ 1, $ 2, $ NF}'dennis_ritchie.txt

nós não sabemos disso “simplicidade”. é o campo numérico 18 na linha de texto, e nós não nos importamos. O que sabemos é que é o último campo e podemos usar $NF para obter seu valor. O ponto final é considerado apenas mais um caractere no corpo do campo.

Adicionar separadores de campo de saída

Você também pode dizer awk para imprimir um caractere particular entre os campos em vez do caractere de espaço padrão. A saída padrão do date o comando é um pouco peculiar porque o tempo está bem no meio. Apesar disto, podemos escrever o seguinte e usar awk para extrair os campos que queremos:

encontro
encontro | awk '{imprimir $2,$3,$6}'

Nós vamos usar o OFS (separador de campo de saída) variável para colocar um separador entre o mês, o dia e o ano. Observe que colocamos o comando entre aspas simples abaixo ('), sem chaves ({}):

encontro | awk 'OFS ="https://www.systempeaker.com/" {imprimir $ 2, $ 3, $ 6}'
encontro | awk 'OFS ="-" {imprimir $ 2, $ 3, $ 6}'

As regras BEGIN e END

UMA BEGIN A regra é executada uma vez antes do início do processamento de texto. Na realidade, corre antes awk até leia qualquer texto. uma END A regra é executada após todo o processamento ser concluído. Você pode ter vários BEGIN e END as regras, e eles vão funcionar em ordem.

Para nosso exemplo de BEGIN regra, vamos imprimir a citação completa do dennis_ritchie.txt arquivo que usamos anteriormente com um título no topo.

Para faze-lo, nós escrevemos este comando:

awk 'BEGIN {imprimir "Dennis Ritchie"} {imprimir $0}'dennis_ritchie.txt

Note o BEGIN A regra tem seu próprio conjunto de ações dentro de seu próprio conjunto de chaves ({}).

Podemos usar essa mesma técnica com o comando que usamos anteriormente para canalizar a saída de who dentro de awk. Para faze-lo, nós escrevemos o seguinte:

quem | awk 'BEGIN {imprimir "Sessões ativas"} {imprimir $1,$4}'

Separadores de campo de entrada

Se você fingir awk trabalhar com texto que não usa espaços em branco para separar campos, deve informar qual caractere o texto usa como separador de campo. Como um exemplo, a /etc/passwd o arquivo usa dois-pontos (:) para separar campos.

Usaremos esse arquivo e o -F (cadeia de separação) opção de dizer awk use o cólon:) como separador. Escrevemos o seguinte para contar awk para imprimir o nome da conta do usuário e pasta pessoal:

awk -F: '{imprimir $1,$6}'/ etc / passwd

A saída contém o nome da conta do usuário (ou o nome do aplicativo ou daemon) e a pasta pessoal (ou a localização do aplicativo).

Adicionando padrões

Se a única coisa que nos interessa são as contas de usuário usuais, podemos incluir um padrão com nossa ação de impressão para filtrar todas as outras entradas. Devido a que ID do usuário Se os números forem iguais ou maiores que 1.000, podemos basear nosso filtro nessas informações.

Escrevemos o seguinte para executar nossa ação de impressão apenas quando o terceiro campo ($3) contém um valor de 1000 o mais:

awk -F: '$ 3 >= 1000 {imprimir $1,$6}'/ etc / passwd

O padrão deve preceder imediatamente a ação à qual está relacionado.

Podemos usar o BEGIN regra para fornecer um título ao nosso pequeno relatório. Nós escrevemos o seguinte, usando o (n) notação para inserir um caractere de nova linha na string do título:

awk -F: 'COMEÇAR {imprimir "Contas de usuário -------------"} $3 >= 1000 {imprimir $1,$6}'/ etc / passwd

Os padrões estão completos expressões regulares, e eles são uma das glórias de awk.

Digamos que queremos ver os identificadores únicos universais (UUID) de sistemas de arquivos montados. Se pesquisarmos no /etc/fstab arquivo para ocorrências de string “UUID”, você deve retornar essa informação para nós.

Usamos o padrão de pesquisa "/ UUID /" em nosso comando:

awk '/ UUID / {imprimir $0}'/ etc / fstab

Encontre todas as ocorrências de "UUID" e imprima essas linhas. Na realidade, teríamos obtido o mesmo resultado sem o print ação porque a ação padrão imprime toda a linha de texto. Apesar disto, para mais clareza, muitas vezes é útil ser explícito. Ao revisar um script ou seu arquivo, você ficará feliz por termos deixado pistas para você.

A primeira linha encontrada foi uma linha de comentário e, mesmo quando a cadeia “UUID” está no meio, awk Eu ainda encontrei. Podemos modificar o regex e dizer awk para processar apenas as linhas que começam com “UUID”. Para faze-lo, escrevemos o seguinte, que inclui o token de início de linha (^):

awk '/ ^ UUID / {imprimir $0}'/ etc / fstab

Isso é melhor! Agora, nós apenas vemos instruções de montagem genuínas. Para refinar ainda mais a saída, escrevemos o seguinte e restringimos a exibição ao primeiro campo:

awk '/ ^ UUID / {imprimir $1}'/ etc / fstab

Se tivéssemos vários sistemas de arquivos montados nesta máquina, obteríamos uma tabela ordenada de seus UUIDs.

Funções integradas

awk tenho muitas funções que você pode chamar e usar em seus próprios programas, tanto na linha de comando quanto em scripts. Se você fizer uma pequena pesquisa, você vai achar que é muito frutífero.

Para demonstrar a técnica geral para chamar uma função, veremos alguns números. Como um exemplo, o seguinte imprime a raiz quadrada de 625:

awk 'BEGIN { imprimir sqrt(625)}'

Este comando imprime o arco tangente de 0 (zero) e -1 (que acaba sendo a constante matemática, pi):

awk 'BEGIN {imprimir atan2(0, -1)}'

No seguinte comando, nós modificamos o resultado do atan2() função antes de imprimir:

awk 'BEGIN {imprimir atan2(0, -1)*100}'

Funções podem aceitar expressões como parâmetros. Como um exemplo, aqui está uma maneira complicada de pedir a raiz quadrada de 25:

awk 'BEGIN { imprimir sqrt((2+3)*5)}'

scripts awk

Se sua linha de comando ficar complicada ou você desenvolver uma rotina que você sabe que vai querer usar novamente, você pode transferir seu awk comando em um script.

Em nosso script de exemplo, nós faremos tudo o seguinte:

  • Diga ao shell qual executável usar para executar o script.
  • Configurar awk use o FS variável de separação de campo para ler o texto de entrada com campos separados por dois pontos (:).
  • Use o OFS separador de campo de saída para contar awk use dois pontos:) separar campos na saída.
  • Defina um contador em 0 (zero).
  • Defina o segundo campo de cada linha de texto com um valor em branco (é sempre um “x”, então não é necessário que vejamos).
  • Imprime a linha com o segundo campo modificado.
  • Aumente o contador.
  • Imprimir o valor do contador.

Nosso script é mostrado abaixo.

Exemplo de um script awk em um editor.

a BEGIN governante realiza etapas preparatórias, Entretanto ele END A régua mostra o valor do contador. A regra do meio (que não tem nome ou padrão, então corresponde a todas as linhas) modifique o segundo campo, imprimir a linha e incrementar o contador.

A primeira linha do script diz ao shell qual executável usar (awk, em nosso exemplo) para executar o script. Também passa o -f (nome do arquivo) opção para awk, que informa que o texto a ser processado virá de um arquivo. Passaremos o nome do arquivo para o script quando o executarmos.

Incluímos o seguinte script como texto para que você possa recortar e colar:

#!/usr/bin/awk -f

BEGIN {
  # set the input and output field separators
  FS=":"
  OFS=":"
  # zero the accounts counter
  accounts=0
}
{
  # definir campo 2 to nothing
  $2=""
  # print the entire line
  print $0
  # count another account
  accounts++
}
FIM {
  # print the results
  print accounts " contas.n"
}

Salve isso em um arquivo chamado omit.awk. Para tornar o script executávelmim, escrevemos o seguinte usando chmod:

chmod +x omit.awk

Agora, vamos executá-lo e passar o /etc/passwd arquivo para script. Este é o arquivo awk irá processar para nós, usando as regras dentro do script:

./omit.awk / etc / passwd

O arquivo é processado e cada linha é exibida, como é mostrado a seguir.

As entradas foram removidas “x” no segundo campo, mas observe que os separadores de campo ainda estão presentes. As linhas são contadas e o total é dado na parte inferior da saída.

awk não significa estranho

awk não significa desconfortável; é sinônimo de elegância. Ele foi descrito como um filtro de processamento e redator de relatórios. Mais precisamente, são ambos ou, melhor dito, uma ferramenta que você pode usar para ambas as tarefas. Em apenas algumas linhas, awk alcança o que a codificação extensiva em uma linguagem tradicional precisa.

Esse poder é aproveitado pelo conceito simples de regras contendo padrões., que selecionam o texto a ser processado e ações que definem o processamento.

Assine a nossa newsletter

Nós não enviaremos SPAM para você. Nós odiamos isso tanto quanto você.