Vamos nos referir à linguagem como AWK e ao executável que interpreta programas AWK como awk ou gawk.
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.
O AWK analisa a entrada como uma série de registros. Cada registro é dividido em zero ou mais campos.
O comportamento padrã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.
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.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.
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.
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.
$NF.NR armazena o número do registro atual.
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.
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.O AWK usa o mesmo conceito de veracidade que o C.
0 é falso.Como o AWK é uma linguagem de processamento de texto, os valores de verdade se estendem às strings.
"" é falsa.Os comentários começam com o caractere # e vão até o fim da linha.
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
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.
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"
}
Escreva um programa awk que imprima o primeiro campo separado por dois-pontos de cada linha do arquivo passwd.
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.
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.
Imprima os registros em que o diretório home é válido e o shell de login é bash.
Crie sua conta no Exercism para aprender e dominar AWK com 3 conceitos92 exercícios e mentoria humana de verdade, tudo de graça.