Como dominar o comando AWK para processar textos no Linux?

O comando AWK é uma ferramenta poderosa e versátil para processar e transformar dados de texto no Linux. Seja extraindo informações, filtrando linhas, reformatando resultados ou realizando cálculos, o AWK pode facilitar sua vida com apenas algumas linhas de código. Neste artigo, você aprenderá como usar o comando AWK para manipulação de texto no Linux.

Qual é o comando AWK?

A linguagem de programação AWK.svg

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

A sintaxe geral do comando AWK é a seguinte:

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

O programa é uma série de instruções que definem padrões a serem pesquisados ​​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 a escolha do delimitador de campo ou o formato de saída.

Como imprimir texto com 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 qualquer motivo e apenas um comando de impressão, o AWK imprimirá a mensagem toda vez que você pressionar Enter.

Por exemplo, se você digitar:

awk '{imprimir "Olá"}'

E você pressiona Enter várias vezes, você obtém:

Bom dia, bom dia, bom dia

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

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

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

Você pode imprimir o conteúdo do arquivo com 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 dá:

Aqui está o conteúdo do arquivo test.txt: Este é 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 $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ê deseja 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 dá algo como:

root 0 daemon 1 bin 2 sys 3 sincronização 4 jogos 5 man 6 lp 7 mail 8 notícias 9 uucp 10 proxy 13 www-data 33 ...

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

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

O que dá:

é 16 é

Se quiser imprimir o número de linhas do test.txt , você 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 dá:

3

Como filtrar texto com o comando AWK?

dl.beatsnoop.com polegar 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 só executará a ação 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 quiser imprimir linhas do test.txt que contém a palavra Linux , você pode usar o seguinte comando:

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

O que dá:

Linux é o melhor sistema operacional

Se quiser imprimir 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 dá 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ê deseja imprimir 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

Copiar

O que dá 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::/inexistente:/bin/false snap_daemon:x:584788:584788::/inexistente:/bin/false ...

Como editar texto com o comando AWK?

dl.beatsnoop.com polegar 1687289615

O comando AWK pode ser usado para modificar texto usando funções integradas ou variáveis ​​especiais. Por exemplo, se quiser substituir espaços por hífens no test.txt , você pode usar a gsub , que substitui todas as ocorrências de uma string por outra. Você também pode usar a variável especial OFS , que define o separador do campo 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 dá:

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

Você pode consultar o manual do comando AWK para 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 em campos ou linhas em um arquivo. A sintaxe do loop for é a seguinte:

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

Onde variável é o nome da variável que pega sucessivamente os valores do array , e ação é a ação a ser executada em cada iteração.

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

Este é 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--) imprimir $i}' test.txt

O que dá:

o primeiro teste é esta ótima ferramenta, o sistema operacional AWK, o melhor é o Linux
dl.beatsnoop.com polegar 1687289757

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

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

O que dá:

2
4

Como executar um script AWK?

extensão .awk e conceder-lhe direitos de execução com o chmod +x . Então você pode executar o script com o comando ./script_name.awk [files] .

Por exemplo, se você tiver um script chamado hello.awk que contém:

#!/usr/bin/awk -f BEGIN {imprimir "Olá"}

Você pode executar o script com o seguinte comando:

./hello.awk

O que dá:

Bom dia

Como passar argumentos para um script AWK?

dl.beatsnoop.com polegar 1687289922

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

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

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

#!/usr/bin/awk -f BEGIN {imprimir $var1 " " $var2}

Você obtém:

Bom Dia Mundo
  • O segundo método é usar o ARGV , que contém os argumentos passados ​​ao script. Por exemplo, se quiser passar dois argumentos sem nome para o hello.awk , você pode usar o seguinte comando:
awk -f olá.awk olá mundo 

E no seu hello.awk índices ARGV[1] e ARGV[2] . Por exemplo, se o seu script contiver:

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

Você obtém:

Bom Dia Mundo

Perguntas frequentes

Qual é a diferença entre AWK e GAWK?

GAWK é uma implementação GNU do AWK, que adiciona recursos adicionais à linguagem original, como suporte para expressões regulares estendidas, matrizes multidimensionais ou funções predefinidas.

Como depurar um script AWK?

Para depurar um script AWK, você pode usar a -W parâmetro 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 ​​no final da execução do script.

Como usar o comando AWK para classificar dados?

Para usar o comando AWK para classificar dados, você pode usar o sort em combinação com o AWK. Por exemplo, se quiser classificar os usuários no /etc/passwd por seus UIDs, você pode usar o seguinte comando:

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

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

Como imprimir a contagem de palavras de um arquivo com o comando AWK?

Para imprimir o número de palavras em um arquivo com 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 loop for, você pode contar o número de palavras em cada linha e adicioná-las a uma 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:

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

Você pode imprimir a contagem de palavras do arquivo com o seguinte comando:

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

O que dá:

9

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

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

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

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

awk -F"," '{imprimir $1 " " $3}' teste.csv

O que dá:

nome idade Alice 25 Bob 32 Charles 28

Como filtrar dados com 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 desejar exibir linhas no test.csv que contenham o nome Alice , você poderá usar o seguinte padrão:

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

O que dá:

Alice,Dupont,25

Se quiser exibir linhas no test.csv com mais de 30 anos, você pode usar o seguinte padrão:

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

O que dá:

Bob, Martin, 32

Você pode combinar vários padrões com os operadores lógicos && (e), || (ou) e ! (Não). Por exemplo, se desejar exibir linhas no test.csv que tenham um nome começando com C ou uma idade inferior a 10 anos, você poderá usar o seguinte padrão:

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

O que dá:

CAMILLE,M,7 CLARA,F,11 CLEMENTE,M,7

Como calcular estatísticas com o comando AWK?

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

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

O que dá:

Soma: 110 Média: 18,3333

Explicações:

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

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

awk -F"," 'NR>1 {if (min=="") min=max=$3; se ($3 max) max=$3} END {print "Min: " min; imprimir 'Máx.: 'máx.}' teste.csv 

O que dá:

Mínimo: 6 Máx.: 32

Explicações:

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

Conclusão

O comando AWK é uma ferramenta essencial para manipulação de textos no Linux. Ele permite realizar tarefas complexas em 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 expandir suas possibilidades. Por exemplo, você pode usar o comando Echo no Windows para exibir uma mensagem ou variável na tela. Se quiser saber mais sobre o comando AWK, você pode consultar o manual ou os diversos tutoriais disponíveis na Internet.

Artigo anterior Como proteger suas transferências de arquivos com FTPS no Windows Server?
Próximo artigo Como obter o YouTube Premium grátis?
Olá, sou o François :) Editor nas horas vagas que adora compartilhar sua paixão: TT High tech! 😍 Seja hardware, software, videogames, redes sociais e muitas outras áreas do site. Compartilho com vocês minhas análises, meus testes, tutoriais e meus favoritos em diversas mídias. Sou um tecnófilo conhecedor e exigente, que não segue apenas a moda, mas que procura orientá-lo para as melhores soluções. Então fique ligado!