Header Ads

Como usar o comando awk no Linux

Fatmawati Achmad Zaenuri / Shutterstock

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

Como awk recebeu esse nome

O comando awk 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 do lendário panteão AT & TBell Laboratories Unix. Com as contribuições de muitos outros desde então, 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 este artigo estimular o seu apetite, você poderá conferir todos os detalhes sobre o awk e sua funcionalidade.

Regras, padrões e ações

O 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 chaves ({}). Juntos, um padrão e uma ação formam uma regra. Todo o programa awk está entre aspas simples (').

Vamos dar uma olhada no tipo mais simples de programa awk. Como não possui um padrão, corresponde a todas as linhas de texto inseridas nele. Isso significa que a ação é executada em todas as linhas. Nós o usaremos na saída do comando who.

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

 quem 

Talvez não precisemos de todas essas informações, mas apenas queremos ver os nomes nas contas. Podemos canalizar a saída de quem para o awk e, então, dizer ao awk para imprimir apenas o primeiro campo.

Por padrão, o awk considera um campo uma sequência de caracteres cercados por espaços em branco, o início de uma linha ou o final de uma linha. Os campos são identificados por um cifrão ($) e um número. Portanto, $ 1 representa o primeiro campo, que usaremos com a ação de impressão para imprimir o primeiro campo.

Digitamos o seguinte:

 quem | awk '' 

awk imprime o primeiro campo e descarta o restante da linha.

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

Digitamos o seguinte para também imprimir a hora em que a pessoa se conectou (campo quatro):

 quem | awk '' 

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 45º campo.
  • $ NF: Representa o “ número de campos, ” e representa o último campo.

Digitaremos o seguinte para exibir um pequeno arquivo de texto que contém uma pequena citação atribuída a Dennis Ritchie:

gato dennis_ritchie. txt

Queremos que o awk imprima o primeiro, o segundo e o último campo da cotação. Observe que, embora esteja enrolado na janela do terminal, é apenas uma única linha de texto.

Digitamos o seguinte comando:

 awk '' dennis_ritchie. txt 

Não sabemos que "simplicidade". ” é o 18º campo na linha de texto e não nos importamos. O que sabemos é que esse é o último campo e podemos usar $ NF para obter seu valor. O período é considerado apenas outro personagem no corpo do campo.

Adicionando separadores de campo de saída

Você também pode dizer ao awk para imprimir um caractere específico entre os campos, em vez do caractere de espaço padrão. A saída padrão do comando de dados é um pouco peculiar, porque o tempo é calculado bem no meio. No entanto, podemos digitar o seguinte e usar o awk para extrair os campos que queremos:

data

 

data

 | awk '' 

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

data

 | awk 'OFS = "/"' 

data

 | awk 'OFS = "-"' 

As regras BEGIN e END

Uma regra BEGIN é executada uma vez antes do início do processamento de texto. Na verdade, ele é executado antes que o awk leia qualquer texto. Uma regra END é executada após todo o processamento ser concluído. Você pode ter várias regras BEGIN e END, e elas serão executadas em ordem.

Para o nosso exemplo de regra BEGIN, imprimiremos a citação inteira do arquivo dennis_ritchie. txt que usamos anteriormente com um título acima.

Para fazer isso, digitamos este comando:

 awk 'COMEÇA' dennis_ritchie. txt 

Observe que a regra BEGIN tem seu próprio conjunto de ações entre seu próprio conjunto de chaves ({}).

Podemos usar essa mesma técnica com o comando que usamos anteriormente para canalizar a saída de quem para o awk. Para fazer isso, digite o seguinte:

 quem | awk 'BEGIN' 

Separadores de campos de entrada

Se você deseja que o awk trabalhe com texto que não usa espaço em branco para separar campos, você deve informar qual caractere o texto usa como separador de campos. Por exemplo, o arquivo / etc / passwd usa dois pontos (:) para separar os campos.

Nós usaremos esse arquivo e a opção -F (cadeia separadora) para dizer ao awk para usar os dois pontos (:) como separador. Digitamos o seguinte para informar ao awk para imprimir o nome da conta do usuário e da pasta pessoal:

 awk -F: '' / etc / passwd 

A saída contém o nome da conta do usuário (ou nome do aplicativo ou daemon) e a pasta inicial (ou o local do aplicativo).

Adicionando padrões

Se tudo o que estamos interessados ​​são contas de usuário comuns, podemos incluir um padrão em nossa ação de impressão para filtrar todas as outras entradas. Como os números de ID do usuário são iguais ou maiores que 1.000, podemos basear nosso filtro nessas informações.

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

 awk -F: '$ 3 > = 1000' / etc / passwd 

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

Podemos usar a regra BEGIN para fornecer um título para o nosso pequeno relatório. Digitamos o seguinte, usando a notação (\ n) para inserir um caractere de nova linha na cadeia de título:

 awk -F: 'COMEÇA $ 3 > = 1000' / etc / passwd 

Os padrões são expressões regulares de pleno direito e são uma das glórias do awk.

Digamos que queremos ver os UUIDs (identificadores universalmente exclusivos) dos sistemas de arquivos montados. Se procurarmos no arquivo / etc / fstab por ocorrências da string UUID, ” deve devolver essa informação para nós.

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

 awk '/ UUID /' / etc / fstab 

Encontra todas as ocorrências de “ UUID ” e imprime essas linhas. Na verdade, obteríamos o mesmo resultado sem a ação de impressão, porque a ação padrão imprime toda a linha do texto. Para maior clareza, porém, muitas vezes é útil ser explícito. Ao examinar um script ou seu arquivo de histórico, você ficará feliz por ter deixado pistas para si mesmo.

A primeira linha encontrada foi uma linha de comentário e, embora o “ UUID ” string está no meio dela, o awk ainda a encontrou. Podemos ajustar a expressão regular e dizer ao awk para processar apenas as linhas que começam com "UUID". ” Para isso, digite o seguinte, que inclui o início do token de linha (^):

 awk '/ ^ UUID /' / etc / fstab 

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

 awk '/ ^ UUID /' / etc / fstab 

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

Funções internas

O awk possui muitas funções que você pode chamar e usar em seus próprios programas, tanto na linha de comando quanto nos scripts. Se você escavar, você achará muito proveitoso.

Para demonstrar a técnica geral de chamar uma função, veremos algumas técnicas numéricas. Por exemplo, o seguinte imprime a raiz quadrada de 625:

 awk 'BEGIN {print sqrt (625)}' 

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

 awk 'COMEÇA' 

No comando a seguir, modificamos o resultado da função atan2 () antes de imprimi-la:

 awk 'COMEÇA' 

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

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

scripts do awk

Se sua linha de comando se complicar ou se você desenvolver uma rotina que sabe que deseja usar novamente, você pode transferir seu comando awk para um script.

No nosso exemplo de script, vamos fazer o seguinte:

  • Diga ao shell qual executável usar para executar o script.
  • Prepare o awk para usar a variável separadora de campo FS para ler o texto de entrada com campos separados por dois pontos (:).
  • Use o separador de campos de saída OFS para dizer ao awk para usar dois pontos (:) para separar campos na saída.
  • Defina um contador como 0 (zero).
  • Definir o segundo campo de cada linha de texto para um valor em branco (é sempre um x, & n; 8221; x, ” portanto, não precisamos vê-lo).
  • Imprima a linha com o segundo campo modificado.
  • Incremente o contador.
  • Imprima o valor do contador.

Nosso script é mostrado abaixo.

A regra BEGIN executa as etapas preparatórias, enquanto a regra END exibe o valor do contador. A regra do meio (que não tem nome nem padrão para corresponder a todas as linhas) modifica o segundo campo, imprime a linha e incrementa o contador.

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

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

 #! / usr / bin / awk -f BEGIN {# defina os separadores de campo de entrada e saída FS = ":" OFS = ":" # zero as contas do contador de contas = 0} {# defina o campo 2 para nada $ 2 = "" # imprima a linha inteira imprima $ 0 # conte outras contas da conta ++} END {# imprima os resultados imprima contas "contas. \ n"} 

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

 chmod + x omit. awk 

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

 ./ omit. awk / etc / passwd 

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

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

awk não significa desajeitado

awk não significa estranho; significa elegância. Ele foi descrito como um filtro de processamento e um redator de relatórios. Mais precisamente, são os dois, ou melhor, uma ferramenta que você pode usar para essas duas tarefas. Em apenas algumas linhas, o awk alcança o que requer extensa codificação em um idioma tradicional.

Esse poder é aproveitado pelo conceito simples de regras que contêm padrões, que selecionam o texto a processar e ações que definem o processamento.

Via: How to Geek

Veja Também:

Nenhum comentário