Trilhas
/
AWK
AWK
/
Exercícios
/
Noções básicas
Noções básicas

Noções básicas

Exercício de aprendizagem

Introdução

Fundamentos

Vamos nos referir à linguagem como AWK e ao executável que interpreta programas AWK como awk ou gawk.

Padrões e ações

Um programa AWK é composto de pares padrão-ação

pattern1 { action1 }
pattern2 { action2 }
...

Um padrão pode ser uma expressão regular para corresponder à entrada. Também pode ser qualquer expressão que resulte em um valor verdadeiro ou falso.

Uma ação é um ou mais comandos AWK. As chaves ao redor são obrigatórias.

Se o resultado do padrão for verdadeiro, a ação correspondente é executada.

Registros e campos

O AWK analisa a entrada como uma série de registros. Cada registro é dividido em zero ou mais campos.

O comportamento padrão é:

  • dividir a entrada em registros usando a quebra de linha como "separador de registros", de modo que cada linha seja um registro.
  • dividir o registro em campos usando espaços em branco como "separador de campos", de modo que cada palavra seja um campo.

Padrões e ações, continuação

O padrão pode ser omitido, e nesse caso a ação é executada para cada registro de entrada.

A ação pode ser omitida, e nesse caso a ação padrão é imprimir o registro atual.

Padrões especiais

Há dois padrões especiais que são usados com frequência.

  • BEGIN executa a ação associada antes que qualquer entrada seja consumida.
  • END executa a ação associada depois que toda a entrada for consumida.

Variáveis de campo

Você se refere aos campos como $1, $2, $3 etc.

O registro atual é $0.

Aqui estão algumas outras variáveis internas usadas com frequência.

Variáveis internas que controlam a análise da entrada
  • RS é o separador de registros da entrada. Como mencionado, seu valor padrão é uma quebra de linha.
  • FS é o separador de campos da entrada.

Essas variáveis geralmente são definidas no bloco de ação BEGIN.

Variáveis internas que trazem informações

Essas variáveis são definidas automaticamente pelo AWK durante a execução do programa.

  • NF armazena o número de campos no registro atual.
    • Para obter o valor do último campo, use $NF.
  • NR armazena o número do registro atual.
    • Quando vários arquivos de entrada estão sendo processados, NR contém o número total de registros processados até o momento.
  • FNR armazena o número do registro atual no arquivo de entrada atual.
    • Para ilustrar a diferença entre NR e FNR, aqui está uma expressão idiomática comum do AWK.
      NR == FNR {action}
      
      Isso significa "se o número acumulado de registros for igual ao número de registros do arquivo atual". Isso só pode ser verdadeiro para registros do primeiro arquivo de entrada.

Veracidade

O AWK usa o mesmo conceito de veracidade que o C.

  • O número 0 é falso.
  • Qualquer outro número é verdadeiro.

Como o AWK é uma linguagem de processamento de texto, os valores de verdade se estendem às strings.

  • Uma string vazia "" é falsa.
  • Qualquer string não vazia é verdadeira.

Comentários

Os comentários começam com o caractere # e vão até o fim da linha.

Exemplos

Em sistemas do tipo Unix, /etc/passwd contém informações sobre usuários. Cada usuário é descrito em uma linha separada, com os campos separados por dois-pontos.

Para listar os nomes de usuário:

awk '
    BEGIN { FS = ":" }
    { print $1 }
' /etc/passwd

Repare que a ação {print $1} não tem padrão, então ela é executada para cada registro.

Se quisermos limitar a saída apenas aos usuários que usam o bash como shell de login, podemos fazer:

awk '
    BEGIN { FS = ":" }
    $7 == "/bin/bash" { print $1 }
' /etc/passwd

Instruções

Era uma vez uma cidade movimentada chamada Cyberspace. Cyberspace era uma metrópole digital, com milhões de habitantes entrando e saindo todos os dias. Para acompanhar todos esses usuários, Cyberspace tinha um arquivo especial chamado /etc/passwd.

O arquivo /etc/passwd era como uma lista telefônica da cidade. Ele listava todos os usuários que tinham uma conta no sistema, junto com algumas informações importantes sobre cada usuário:

n campo
1 nome de usuário
2 senha ("x" indica que a senha de verdade é armazenada em outro lugar, por segurança)
3 UID, um ID numérico único de usuário
4 GID, um ID numérico único de grupo (normalmente o mesmo que o UID)
5 informações do usuário (normalmente o nome completo da pessoa, mas pode incluir outras informações)
6 diretório home
7 shell de login

Os campos são separados por dois-pontos. Esta é uma entrada típica:

glennj:x:1010:1010:Glenn Jackman:/home/glennj:/usr/local/bin/fish

O arquivo era gerenciado por uma equipe de administradores de sistemas, responsáveis por criar novas contas, atualizar contas existentes e remover contas antigas. Os administradores de sistemas eram os guardiões do Cyberspace, garantindo que apenas usuários autorizados pudessem acessar o sistema.

Um dia, Alex, um novo administrador de sistemas, foi contratado para se juntar à equipe. Alex ficou empolgado com o trabalho e logo aprendeu todos os detalhes do arquivo /etc/passwd. Aprendeu a adicionar novos usuários ao sistema, a atualizar informações de usuários e a remover usuários antigos.

Enquanto trabalhava no arquivo /etc/passwd, Alex percebeu algo estranho. Alguns usuários tinham diretórios home estranhos ou incomuns. Alguns tinham o diretório home definido como /dev/null, enquanto outros tinham o diretório home definido como caminhos estranhos que nem existiam.

Alex percebeu que esses usuários não eram pessoas de verdade, mas contas falsas que tinham sido criadas por hackers. Os hackers tinham encontrado uma forma de explorar uma vulnerabilidade no sistema e criado essas contas falsas para conseguir acesso ao Cyberspace.

Alex sabia que precisava agir. Usou o awk para analisar o arquivo /etc/passwd e escreveu um script para identificar todas as contas falsas. Depois, trabalhou com o restante da equipe para remover essas contas e corrigir a vulnerabilidade que tinha permitido que os hackers as criassem.

Graças ao uso do awk por Alex, a equipe conseguiu identificar e remover as contas falsas e tornar o Cyberspace um lugar mais seguro para todo mundo. Os administradores de sistemas continuaram gerenciando o arquivo /etc/passwd, mantendo-o atualizado e seguro e garantindo que apenas usuários autorizados pudessem acessar o sistema.

Agora é a sua vez de ser um administrador de sistemas como Alex.

Note

Aqui está um pouco de sintaxe AWK adicional que você vai precisar para resolver este exercício.

  • Os operadores booleanos são parecidos com os de outras linguagens:

    operação exemplo
    AND expr1 && expr2
    OR expr1 || expr2
    NOT ! expr
  • Chamar uma função tem uma sintaxe familiar:

    function greet(name) {
        print "Hello", name
    }
    BEGIN {
        greet("Mary")   # prints "Hello Mary"
    }
    

1. Liste os nomes de usuário

Escreva um programa awk que imprima o primeiro campo separado por dois-pontos de cada linha do arquivo passwd.

2. Imprima os números das linhas

Escreva um comando awk que imprima o número da linha de cada registro no arquivo de entrada. Imprima apenas o número da linha, e nenhuma outra informação.

3. Imprima os registros com diretórios home inválidos.

No Cyberspace, um diretório home "válido" começa com /home ou /root. Imprima os registros do arquivo de entrada com diretórios home inválidos.

4. Imprima os usuários válidos que usam bash

Imprima os registros em que o diretório home é válido e o shell de login é bash.


Fonte

Conversa com o ChatGPT
Editar via GitHub O link abre em uma nova janela ou aba
AWK Exercism

Tudo pronto para começar Noções básicas?

Crie sua conta no Exercism para aprender e dominar AWK com 3 conceitos92 exercícios e mentoria humana de verdade, tudo de graça.