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?
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?
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?
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?
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
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?
Para passar argumentos para um script AWK, você pode usar dois métodos:
- O primeiro método é usar a
-v
com ovariável=valor
. Por exemplo, se quiser passar dois argumentos chamadosvar1
evar2
para ohello.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 ohello.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
ecount
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
emax
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.