Um guia prático para aprender awk
Obtenha um controle melhor do comando awk baixando nosso e-book gratuito.
De todos os comandos do Linux existentes (e há muitos), os três mais essenciais parecem ser sed
, awk
e grep
. Talvez seja o som misterioso de seus nomes, ou a amplitude de seu uso potencial, ou apenas sua idade, mas quando alguém dá um exemplo de comando “Linuxy”, geralmente é um desses três. E embora sed
e grep
tenham vários padrões simples de uma linha, o menos prestigioso awk
permanece persistentemente proeminente por ser particularmente intrigante.
É provável que você use sed
para uma substituição rápida de string ou grep
para filtrar um padrão diariamente. É muito menos provável que você componha um comando awk
. Muitas vezes me pergunto por que isso acontece e atribuo isso a algumas coisas. Primeiro de tudo, muitos de nós quase não usamos sed
e grep
para qualquer coisa, exceto alguma variação desses dois comandos:
$ sed -e 's/foo/bar/g' file.txt
$ grep foo file.txt
Portanto, mesmo que você se sinta mais confortável com sed
e grep
, você pode não usar todo o seu potencial. Claro, não há obrigação de aprender mais sobre sed
ou grep
, mas às vezes me pergunto como eu "aprendo" comandos. Em vez de aprender como um comando funciona, muitas vezes aprendo um encantamento específico que inclui um comando. Como resultado, muitas vezes sinto uma falsa familiaridade com o comando. Acho que conheço um comando porque posso nomear três ou quatro opções de cabeça, mesmo que não saiba o que as opções fazem e não consiga definir a sintaxe.
E acredito que esse seja o problema que muitas pessoas enfrentam quando confrontadas com o poder e a flexibilidade do awk
.
Aprendendo a usar o awk
Os princípios básicos do awk
são surpreendentemente simples. É frequentemente observado que awk
é uma linguagem de programação e, embora seja relativamente básica, é verdade. Isso significa que você pode aprender awk
da mesma forma que aprende uma nova linguagem de codificação: aprender sua sintaxe usando alguns comandos básicos, aprender seu vocabulário para poder desenvolver ações complexas e depois praticar, praticar, praticar .
Como o awk analisa a entrada
Awk
vê a entrada, essencialmente, como um array. Quando o awk
varre um arquivo de texto, ele trata cada linha, individualmente e em sucessão, como um registro. Cada registro é dividido em campos. É claro que o awk
deve acompanhar essas informações, e você pode ver esses dados usando o NR
(número de registros) e o NF
(número de campos) variáveis integradas. Por exemplo, isso fornece a contagem de linhas de um arquivo:
$ awk 'END { print NR;}' example.txt
36
Isso também revela algo sobre a sintaxe awk
. Esteja você escrevendo awk
como um script de uma linha ou como um script independente, a estrutura de uma instrução awk
é:
pattern or keyword { actions }
Neste exemplo, a palavra END
é uma palavra-chave especial reservada em vez de um padrão. Uma palavra-chave semelhante é BEGIN
. Com ambas as palavras-chave, awk
apenas executa a ação entre colchetes no início ou no final da análise dos dados.
Você pode usar um pattern como filtro ou qualificador para que o awk
só execute uma determinada ação quando for capaz de corresponder seu padrão ao registro atual. Por exemplo, suponha que você queira usar awk
, da mesma forma que usaria grep
, para encontrar a palavra Linux em um arquivo de texto:
$ awk '/Linux/ { print $0; }' os.txt
OS: CentOS Linux (10.1.1.8)
OS: CentOS Linux (10.1.1.9)
OS: Red Hat Enterprise Linux (RHEL) (10.1.1.11)
OS: Elementary Linux (10.1.2.4)
OS: Elementary Linux (10.1.2.5)
OS: Elementary Linux (10.1.2.6)
Para awk
, cada linha no arquivo é um registro e cada palavra em um registro é um campo. Por padrão, os campos são separados por um espaço. Você pode mudar isso com a opção --field-separator
, que define a variável FS
(separador de campo) como você quiser:
$ awk --field-separator ':' '/Linux/ { print $2; }' os.txt
CentOS Linux (10.1.1.8)
CentOS Linux (10.1.1.9)
Red Hat Enterprise Linux (RHEL) (10.1.1.11)
Elementary Linux (10.1.2.4)
Elementary Linux (10.1.2.5)
Elementary Linux (10.1.2.6)
Neste exemplo, há um espaço vazio antes de cada listagem porque há um espaço em branco após cada dois pontos (:
) no texto fonte. Porém, isso não é cut
, então o separador de campos não precisa ser limitado a um caractere:
$ awk --field-separator ': ' '/Linux/ { print $2; }' os.txt
CentOS Linux (10.1.1.8)
CentOS Linux (10.1.1.9)
Red Hat Enterprise Linux (RHEL) (10.1.1.11)
Elementary Linux (10.1.2.4)
Elementary Linux (10.1.2.5)
Elementary Linux (10.1.2.6)
Funções no awk
Você pode construir suas próprias funções em awk
usando esta sintaxe:
name(parameters) { actions }
As funções são importantes porque permitem escrever código uma vez e reutilizá-lo ao longo do trabalho. Ao construir one-liners, funções personalizadas são um pouco menos úteis do que em scripts, mas awk
já define muitas funções para você. Eles funcionam basicamente da mesma forma que qualquer função em qualquer outra linguagem ou planilha: você aprende a ordem em que a função precisa das informações e pode alimentá-la com o que quiser para obter os resultados.
Existem funções para realizar operações matemáticas e processamento de strings. Os de matemática costumam ser bastante diretos. Você fornece um número e ele o analisa:
$ awk 'BEGIN { print sqrt(1764); }'
42
Funções de string podem ser mais complexas, mas estão bem documentadas no manual GNU awk. Por exemplo, a função split
pega uma entidade que awk
vê como um único campo e a divide em diferentes partes. Requer um campo, uma variável para usar como um array contendo cada parte da divisão e o caractere que você deseja usar como delimitador.
Usando a saída dos exemplos anteriores, sei que existe um endereço IP no final de cada registro. Neste caso, posso enviar apenas o último campo de um registro para a função split
referenciando a variável NF
porque ela contém o número de campos (e o campo final deve será o número mais alto):
$ awk --field-separator ': ' '/Linux/ { split($NF, IP, "."); print "subnet: " IP[3]; }' os.txt
subnet: 1
subnet: 1
subnet: 1
subnet: 2
subnet: 2
subnet: 2
Existem muito mais funções e não há razão para limitar-se a uma por bloco de código awk
. Você pode construir pipelines complexos com awk
em seu terminal ou pode escrever scripts awk
para definir e utilizar suas próprias funções.
Baixe o e-book
Aprender awk
é principalmente uma questão de usar awk
. Use-o mesmo que isso signifique duplicar a funcionalidade que você já possui com sed
ou grep
ou cut
ou tr
ou qualquer outro comandos perfeitamente válidos. Depois de se sentir confortável com isso, você pode escrever funções Bash que invocam seus comandos awk
personalizados para facilitar o uso. E, eventualmente, você poderá escrever scripts para analisar conjuntos de dados complexos.
Baixe nosso e-book para aprender tudo o que você precisa saber sobre o awk
, e comece a usá-lo hoje.