O comando awk pode ser usado como um substítuto do comando cut, mas ele permite uma flexibilidade muito maior, e também permite um pouco de prgramação dentro do próprio comando. Nessa aula, vamos aprender como usar este comando e formatar a saída do comando.
O comando awk nos permite formatar o conteúdo da saída, além de criar condições para fazer o print das colunas desejadas. Com isso, podemos criar saídas customizadas, facilitando o envio para outro comando, ou para gerar relatórios.
Para realizar cortes simples, o comando cut acaba sendo mais fácil de compreender, mas saber utilizar o poder do awk, nos garante um poder maior ao criar comandos. Vamos analizar os dois comandos executando a mesma tarefa:
Este exemplo deve buscar os nomes de usuários e qual shell ele executa por padrão
cut -d':' -f1,7
awk -F':' '{print $1,$7}' /etc/passwd
Os resultados serão, respectivamente:
No exemplo acima, a sintaxe do cut ficou mais enxuta e, para estes casos mais simples, talvez o cut seja melhor. Entretanto, quando o problema a ser solucionado é mais complexo, o comando cut se mostra muito superior.
Analize este segundo problema:
Desejamos mostrar o nome,diretório raiz, e shell de cada usuário no seguinte formato:
|User:<usuario>|Home:<raiz>|Shell:<shell>|
Para resolver este problema usando cut, seria necessário montar um script, armazenando as variáveis, e depois montando a string final para mostrar na tela. Outra forma de resolver seria usando o comando sed, seria algo próximo a:
sed -r "s/([\w\-]*)\:([a-Z0-9\,\-\/ ]*\:){4}([\w\-\/]*)\:([\w\-\/]*)/|User:\1|Home:\3|Shell:\4|/g" /etc/passwd
Já em awk:
awk -F':' '{print "|User:" $1 "|Home:" $6 "|Shell:" $7 "|"}' /etc/passwd
O comando awk acima deixa muito claro o que está sendo mostrado na tela, diferente do comando sed.
Se quisermos Dificultar ainda mais o problema, podemos mostrar os dados apenas para usuários com UID maior ou igual a 1000 (no ubuntu, geralmente os usuários do sistema começam no 1000, deixando os UIDs menores para serviços do sistema.). O UID é a terceira coluna do /etc/passwd!
Como fazer com AWK/SED ? Bom, Você pode tentar montar um no seu ambiente, se desejar.
Em awk, o comando fica bem simples:
awk -F':' '$3 >= 1000 {print "|User:" $1 "|Home:" $6 "|Shell:" $7 "|"}' /etc/passwd
ou, usando uma segunda forma:
awk -F':' '{if ($3 >= 1000 ) print "|User:" $1 "|Home:" $6 "|Shell:" $7 "|"}' /etc/passwd
Esta segunda opção pode ser melhor explorada em scripts, que veremos nas próximas aulas.
Awk é uma linguagem dentro do shell, e permite que você use condicionais para expressar a melhor forma de filtrar os dados.
De uma forma geral, iremos chamar o comando, seguido de um parâmtero que identifica o caracter delimitador, seguido das linhas de código que farão a busca e corte dos dados.
Caso o parâmetro -F não seja passado, o programa entenderá que o caracter delimitador é o tab (\t).
Os três primeiros exercícios são os mesmos da aula 02 - cut, então você precisará dos mesmo arquivos que estão naquela aula.
- Utilize o comando awk no arquivo cadastro.csv para mostrar na tela apenas o nome e endereço dos usuários
- Mostre o nome dos usuários do arquivo cadastro.csv para mostrar os nomes na ordem inversas do que está no arquivo.
- carregue o nome e documento dos usuários que possuem telefone no Brasil (iniciam com +55)
- Carregue as informações do seu usuário do sistema, a partir do arquivo passwd:
- Nome
- Grupo (quarta coluna)
- Diretório home
- Informações adicionais, se existirem
- O seu programa deve aceitar colocar ou não colocar as informações adicionais.
- Carregue todos os dados do passwd, mas na ordem inversa das colunas (do home ao nome de usuário)
- Elabora um comando que retorne os dados de cada usuário no seguinte formato:
[<usuario>]
+-----------------------------------------------+
| UID/GID : <UID><GID> |
| Diretorio home : <home> |
| Caminho shell : <shell> |
+-----------------------------------------------+
- Elabore um programa que faça um relatório, formatado, contendo as seguintes informações:
- IP interno da máquina
- IP externo da rede
- Mês/dia e horário dos últimos 5 logins do sistema (qualquer usuário)
- Plataforma (x86, x86_64, etc...)
O segundo desafio possui uma complexidade alta, e portanto valerá uma pontuação bônus para a segunda metade do curso. Se você optar por não fazer o desafio, não haverá penalidades. O desafio tem valor 0.5, e cada item tem peso 0.1, somado com a formatação de peso 0.1
Boa aula, e Boa sorte aos que forem realizar os desafios !