Como dominar o comando AWK para processamento de textos no Linux?

O comando AWK é uma ferramenta poderosa e versátil para processar e transformar dados de texto no Linux. Seja para extrair informações, filtrar linhas, reformatar a saída ou realizar cálculos, o AWK pode simplificar seu trabalho com apenas algumas linhas de código. Neste artigo, você aprenderá como usar o comando AWK para manipulação de texto no Linux.

O que é o comando AWK?

A linguagem de programação AWK.svg

O comando AWK é uma linguagem de programação interpretada que roda no terminal Linux. Seu nome vem das iniciais de seus criadores: Alfred Aho, Peter Weinberger e Brian Kernighan. O AWK foi originalmente projetado para manipular arquivos estruturados com campos separados por delimitadores, como arquivos CSV ou arquivos /etc/passwd. No entanto, o AWK também pode manipular arquivos de texto mais complexos, como arquivos HTML ou XML. O AWK não é uma linguagem de programação orientada a objetos , mas permite a definição de funções e variáveis ​​locais e globais. Ele também possui estruturas de controle como loops e instruções condicionais.

A sintaxe geral do comando AWK é a seguinte:

awk [opções] 'programa' [arquivos]

O programa é uma sequência de instruções que definem padrões a serem procurados em cada linha do arquivo e ações a serem executadas quando um padrão for encontrado. As opções permitem modificar o comportamento do comando AWK, como escolher o delimitador de campo ou o formato de saída.

Como faço para imprimir texto usando o comando AWK?

Como usar o comando awk no Linux

O comando AWK pode ser usado para imprimir uma mensagem no terminal com base em um padrão no texto. Se você executar o comando AWK sem nenhum padrão, apenas com um comando de impressão, o AWK imprimirá a mensagem sempre que você pressionar Enter.

Por exemplo, se você digitar:

awk '{print "Olá"}'

E se você pressionar Enter várias vezes, obterá:

Olá, olá, olá

Para interromper o comando AWK, você pode pressionar Ctrl+C.

Se você deseja imprimir o conteúdo de um arquivo usando o comando AWK, pode usar o padrão especial `BEGIN` , que é executado antes da leitura do arquivo, e o padrão especial `END` , que é executado após a leitura do arquivo. Por exemplo, se você tiver um arquivo chamado `test.txt` que contenha:

Isto é um teste. AWK é uma ótima ferramenta. Linux é o melhor sistema operacional

Você pode imprimir o conteúdo do arquivo usando o seguinte comando:

awk 'BEGIN {print "Aqui está o conteúdo do arquivo test.txt:"} {print} END {print "Fim do arquivo"}' test.txt

O que resulta em:

Aqui está o conteúdo do arquivo test.txt: Isto é um teste. AWK é uma ótima ferramenta. Linux é o melhor sistema operacional. Fim do arquivo

comando {print} sem argumentos imprime a linha inteira. Você também pode imprimir um campo específico usando a variável $n , onde n é o número do campo. Por padrão, os campos são separados por espaços ou tabulações, mas você pode alterar o delimitador com a -F .

Por exemplo, se você quiser imprimir o primeiro e o terceiro campos do /etc/passwd , que são separados por dois pontos ( :) , você pode usar o seguinte comando:

awk -F: '{print $1 " " $3}' /etc/passwd

O que resulta em algo como:

root 0 daemon 1 bin 2 sys 3 sync 4 games 5 man 6 lp 7 mail 8 news 9 uucp 10 proxy 13 www-data 33 ...

Você também pode imprimir expressões aritméticas ou strings usando o comando AWK. Por exemplo, se você quiser imprimir o quadrado do segundo campo do arquivo test.txt , pode usar o seguinte comando:

awk '{print $2^2}' test.txt

O que resulta em:

é 16 é

Se você quiser imprimir o número de linhas do arquivo test.txt , pode usar a variável especial NR , que contém o número da linha atual. Por exemplo, você pode usar o seguinte comando:

awk 'END {print NR}' test.txt

O que resulta em:

3

Como filtrar texto usando o comando AWK?

dl.beatsnoop.com miniatura 1687289446

O comando AWK pode ser usado para filtrar texto com base em padrões ou condições. Se você especificar um padrão antes de uma ação, o AWK executará a ação somente se o padrão for encontrado na linha. O padrão pode ser uma expressão regular, uma comparação, uma operação lógica ou uma combinação destes.

Por exemplo, se você quiser imprimir as linhas do test.txt que contêm a palavra Linux , você pode usar o seguinte comando:

awk '/Linux/ {print}' test.txt

O que resulta em:

Linux é o melhor sistema operacional

Se você quiser imprimir as linhas do /etc/passwd que possuem um UID maior que 1000, você pode usar o seguinte comando:

awk -F: '$3 > 1000 {print}' /etc/passwd

O que resulta em algo como:

systemd-coredump:x:997:997:systemd Core Dumper:/:/usr/sbin/nologin tss:x:131:142:Pilha de software TPM,,,:/var/lib/tpm:/bin/false _rpc:x:132:65534::/run/rpcbind:/usr/sbin/nologin statd:x:133:65534::/var/lib/nfs:/usr/sbin/nologin libvirt-qemu:x:64055:139:Libvirt Qemu,,,:/var/lib/libvirt:/usr/sbin/nologin libvirt-dnsmasq:x:134:144:Libvirt Dnsmasq,,,:/var/lib/libvirt/dnsmasq:/usr/sbin/nologin snapd-range-524288-root:x:524288:524288::/nonexistent:/bin/false snap_daemon:x:584788:584788::/nonexistent:/bin/false ...

Você também pode usar os operadores lógicos && (e), || (ou) e ! (não) para combinar padrões. Por exemplo, se você quiser imprimir as linhas do /etc/passwd que possuem um UID maior que 1000 e um shell diferente de /usr/sbin/nologin , você pode usar o seguinte comando:

awk -F: '$3 > 1000 && $7 != "/usr/sbin/nologin" {print}' /etc/passwd

Cópia

O que resulta em algo como:

tss:x:131:142:Pilha de software TPM,,,:/var/lib/tpm:/bin/false _rpc:x:132:65534::/run/rpcbind:/usr/sbin/nologin statd:x:133:65534::/var/lib/nfs:/usr/sbin/nologin libvirt-qemu:x:64055:139:Libvirt Qemu,,,:/var/lib/libvirt:/usr/sbin/nologin libvirt-dnsmasq:x:134:144:Libvirt Dnsmasq,,,:/var/lib/libvirt/dnsmasq:/usr/sbin/nologin snapd-range-524288-root:x:524288:524288::/nonexistent:/bin/false snap_daemon:x:584788:584788::/nonexistent:/bin/false ...

Como editar texto usando o comando AWK?

dl.beatsnoop.com miniatura 1687289615

O comando AWK pode ser usado para modificar texto usando funções internas ou variáveis ​​especiais. Por exemplo, se você quiser substituir espaços por hífens no arquivo test.txt , pode usar a gsub , que substitui todas as ocorrências de uma string por outra. Você também pode usar a OFS , que define o separador de campos de saída. Por exemplo, você pode usar o seguinte comando:

awk '{print strftime("%d/%m/%Y %H:%M:%S",$1 " " $2)}' test.txt

O que resulta em:

30/10/2021 16:13:49
31/10/2021 17:14:50
01/11/2021 18:15:51

Você pode consultar o manual de comandos AWK para aprender sobre outras funções e variáveis ​​disponíveis.

Como usar o loop for com o comando AWK?

O comando AWK pode ser usado para executar loops `for` nos campos ou linhas de um arquivo. A sintaxe do loop `for` é a seguinte:

para (variável na matriz) ação

Onde `variable` é o nome da variável que sucessivamente recebe os valores da matriz , e `action` é a ação a ser executada em cada iteração.

Por exemplo, se você quiser imprimir os campos de um arquivo em ordem inversa, pode usar um laço `for` com a variável especial `NF` , que contém o número de campos na linha atual. Por exemplo, se você tiver um arquivo chamado `test.txt` que contém:

Isto é um teste. AWK é uma ótima ferramenta. Linux é o melhor sistema operacional

Você pode inverter a ordem dos campos com o seguinte comando:

awk '{for (i=NF; i>0; i--) print $i}' test.txt

O que resulta em:

Um dos testes é esta ferramenta formidável; outro é o AWK; o melhor sistema operacional é o Linux
dl.beatsnoop.com miniatura 1687289757

Você também pode usar o laço `for` para iterar pelas linhas de um arquivo com a variável especial `FNR` , que contém o número da linha do arquivo atual. Por exemplo, se você quiser imprimir as linhas pares do arquivo ` test.txt` , você pode usar o seguinte comando:

awk 'FNR%2==0 {print FNR}' test.txt

O que resulta em:

2
4

Como faço para executar um script AWK?

Para executar um script AWK, você pode colocá-lo em um arquivo com a .awk e dar a ele permissões de execução com o comando chmod +x . Em seguida, você pode executar o script com o comando ./nome_do_script.awk [arquivos] .

Por exemplo, se você tiver um script chamado hello.awk que contenha:

#!/usr/bin/awk -f INÍCIO {print "Olá"}

Você pode executar o script com o seguinte comando:

./hello.awk

O que resulta em:

Bom dia

Como faço para passar argumentos para um script AWK?

dl.beatsnoop.com miniatura 1687289922

Para passar argumentos para um script AWK, você pode usar dois métodos:

  • O primeiro método envolve o uso da -v com o formato variável=valor . Por exemplo, se você quiser passar dois argumentos chamados var1 e var2 para o seu hello.awk , você pode usar o seguinte comando:
awk -v var1=hello -v var2=world -f hello.awk 

E no seu hello.awk , você pode acessar os argumentos usando as variáveis ​​$var1 e $var2 . Por exemplo, se o seu script contiver:

#!/usr/bin/awk -f INÍCIO {print $var1 " " $var2}

Você recebe:

Olá mundo
  • O segundo método envolve o uso do array especial ARGV , que contém os argumentos passados ​​para o script. Por exemplo, se você quiser passar dois argumentos sem nome para o seu hello.awk , você pode usar o seguinte comando:
awk -f hello.awk olá mundo 

E no seu hello.awk , você pode acessar os argumentos usando os índices ARGV[1] e ARGV[2] . Por exemplo, se o seu script contiver:

#!/usr/bin/awk -f BEGIN {imprimir ARGV[1] " " ARGV[2]}

Você recebe:

Olá mundo

Perguntas frequentes

Qual a diferença entre AWK e GAWK?

GAWK é uma implementação GNU de AWK, que adiciona recursos extras à linguagem original, como suporte para expressões regulares estendidas, arrays multidimensionais e funções predefinidas.

Como faço para depurar um script AWK?

opção -W com o lint , que exibe mensagens de aviso sobre possíveis erros no script. Você também pode usar a -W com o dump-variables , que exibe os valores das variáveis ​​ao final da execução do script.

Como faço para usar o comando AWK para classificar dados?

Para usar o comando AWK para ordenar dados, você pode usar o `sort` em conjunto com o AWK. Por exemplo, se você quiser ordenar os usuários no `/etc/passwd` pelo seu UID, você pode usar o seguinte comando:

awk -F: '{print $1, $3}' /etc/passwd | sort -n -k2

Ao combinar o AWK com outros comandos (como o sort ), você pode facilmente ir muito além na exibição e organização de dados.

Como faço para imprimir o número de palavras em um arquivo usando o comando AWK?

Para imprimir o número de palavras em um arquivo usando o comando AWK, você pode usar a variável especial NF , que contém o número de campos na linha atual, e a variável especial NR , que contém o número da linha atual. Usando um laço for, você pode contar o número de palavras em cada linha e adicioná-las a uma variável chamada total . Usando o padrão especial END , você pode imprimir o resultado final. Por exemplo, se você tiver um arquivo chamado test.txt que contém:

Isto é um teste. AWK é uma ótima ferramenta. Linux é o melhor sistema operacional

Você pode imprimir o número de palavras no arquivo usando o seguinte comando:

awk '{for (i=1; i<=NF; i++) total++} END {print total}' test.txt

O que resulta em:

9

Como faço para usar o comando AWK para extrair dados de um arquivo CSV?

Para usar o comando AWK para extrair dados de um arquivo CSV (valores separados por vírgula), você pode usar a -F para definir o separador de campos como uma vírgula. Por exemplo, se você tiver um arquivo chamado test.csv que contenha:

Nome, primeiro nome, idade: Alice Dupont, 25; Bob Martin, 32; Charles Durand, 28

Você pode extrair o nome e a idade das pessoas usando o seguinte comando:

awk -F"," '{print $1 " " $3}' test.csv

O que resulta em:

Nome, idade: Alice 25, Bob 32, Charles 28

Como filtrar dados usando o comando AWK?

O comando AWK permite filtrar dados com base em padrões, que são expressões regulares ou condições lógicas. Os padrões são colocados antes das ações, separados por chaves. Por exemplo, se você quiser exibir as linhas do arquivo test.csv que contêm o nome Alice , você pode usar o seguinte padrão:

awk -F"," '/Alice/ {print}' test.csv

O que resulta em:

Alice, Dupont, 25

Se você deseja exibir as linhas do test.csv que têm mais de 30 anos, pode usar o seguinte padrão:

awk -F"," '$3 > 30 {print}' test.csv

O que resulta em:

Bob, Martin, 32

Você pode combinar vários padrões usando os operadores lógicos && (e), || (ou) e ! (não). Por exemplo, se você quiser exibir as linhas do arquivo test.csv que têm um nome começando com C ou uma idade menor que 10 anos, você pode usar o seguinte padrão:

awk -F"," '($1 ~ /^C/) || ($3 < 10) {print}' test.csv

O que resulta em:

CAMILLE,M,7 CLARA,F,11 CLEMENT,M,7

Como calcular estatísticas usando o comando AWK?

O comando AWK permite calcular estatísticas sobre os dados numéricos em um arquivo, como a soma, a média, o mínimo ou o máximo. Para isso, basta usar variáveis ​​para armazenar os valores intermediários e atualizá-las a cada linha. Utilizando o padrão especial END , você pode exibir o resultado final. Por exemplo, se você quiser calcular a soma e a média das idades no arquivo test.csv , você pode usar o seguinte programa:

awk -F"," 'NR>1 {sum+=$3; count++} END {print "Soma: " sum; print 'Média: 'sum/count}' test.csv

O que resulta em:

Total: 110 Média: 18,3333

Explicação:

  • opção -F"," para definir o separador de campos como uma vírgula.
  • Usamos a condição NR>1 para ignorar a primeira linha do arquivo, que contém os nomes das colunas.
  • Usamos as variáveis ​​soma e contagem para acumular a soma e o número de idades. Usamos o operador += para incrementar as variáveis ​​com o valor do terceiro campo ( $3 ).
  • padrão END operador / para calcular a média dividindo a soma pelo número.

Da mesma forma, se você quiser calcular as idades mínima e máxima no test.csv , pode usar o seguinte programa:

awk -F"," 'NR>1 {if (min=="") min=max=$3; if ($3<min) min=$3; if ($3> max) max=$3} FIM {print "Mínimo: " min; print 'Máximo: 'max}' test.csv

O que resulta em:

Mín.: 6 Máx.: 32

Explicação:

  • opção -F"," para definir o separador de campos como uma vírgula.
  • Usamos a condição NR>1 para ignorar a primeira linha do arquivo, que contém os nomes das colunas.
  • Usamos as variáveis ​​min e max para armazenar as idades mínima e máxima. Inicializamos essas variáveis ​​com o valor do terceiro campo ( $3 ) se estiverem vazias ( "" ). Usamos os operadores < e > para comparar os valores e atualizar as variáveis, se necessário.
  • O END para exibir o resultado final.

Conclusão

O comando AWK é uma ferramenta essencial para manipular texto no Linux. Ele permite realizar tarefas complexas com poucas linhas de código, como extrair, filtrar, modificar ou calcular dados. Oferece grande flexibilidade graças aos seus padrões, ações, funções e variáveis. Pode ser combinado com outros comandos do Linux para ampliar suas capacidades. Por exemplo, você pode usar o comando `echo` no Windows para exibir uma mensagem ou uma variável na tela. Se quiser aprender mais sobre o comando AWK, você pode consultar o manual ou os diversos tutoriais disponíveis online.

Artigo anterior: Como proteger suas transferências de arquivos com FTPS no Windows Server?
Próximo artigo: Como obter o YouTube Premium gratuitamente?
Olá! Sou o François :) Escritor nas horas vagas, apaixonado por tecnologia! 😍 Seja hardware, software, videogames, redes sociais ou muitas outras áreas, você encontra tudo aqui. Compartilho minhas análises, avaliações, tutoriais e minhas descobertas favoritas em diversas plataformas. Sou um entusiasta de tecnologia experiente e exigente, que não apenas segue tendências, mas se esforça para te guiar rumo às melhores soluções. Então, fique ligado!