Um administrador precisa criar um shell script bash (Bourne-...
Qual pipeline atende à especificação descrita?
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
Vamos analisar a questão que trata sobre a criação de um shell script bash para buscar e listar descrições de usuários no arquivo /etc/passwd
com base em uma palavra de busca, ignorando diferenças de maiúsculas e minúsculas.
A alternativa correta é a B - cat /etc/passwd | cut -d: -f5 | grep -i ${1}
Vamos entender por quê:
1. Alternativa B:
"cat /etc/passwd | cut -d: -f5 | grep -i ${1}"
Esta pipeline está correta por diversas razões:
- cat /etc/passwd: Este comando lê o conteúdo do arquivo
/etc/passwd
. - cut -d: -f5: Utiliza o comando
cut
com delimitador ":" para separar os campos e seleciona o quinto campo (-f5), que é a descrição do usuário (campo GECOS). - grep -i ${1}: O comando
grep
com a opção-i
faz uma busca case-insensitive pela palavra de busca fornecida no primeiro argumento da linha de comando (${1}).
Portanto, esta alternativa atende perfeitamente às especificações da questão.
2. Alternativa A:
"cat /etc/passwd | cut -d: -f5 | grep -i ${0}"
Apesar de estar quase correta, esta alternativa usa ${0}
, que em scripts bash, refere-se ao nome do script, e não ao primeiro argumento. Isso torna a busca incorreta.
3. Alternativa C:
"cat /etc/passwd | cut -d: -f6 | grep ${0}"
Esta alternativa erra de duas maneiras: primeiro, cut -d: -f6
seleciona o sexto campo, que é o diretório home do usuário, e não a descrição. Além disso, usa ${0}
ao invés de ${1}.
4. Alternativa D:
"cat /etc/passwd | cut -d: -f6 | grep ^${1}"
Novamente, cut -d: -f6
está incorreto por selecionar o campo errado. Além disso, o uso de grep ^${1}
procura pela palavra de busca somente no início da linha, o que não é apropriado para esta questão.
5. Alternativa E:
"cat /etc/passwd | cut -d: -f6 | grep -i ^${0}"
Esta alternativa combina os erros das anteriores: seleciona o campo errado com -f6
e usa ${0}
em vez de ${1}, além de limitar a busca ao início da linha com ^
.
Para resolver essa questão, é necessário ter um bom entendimento de:
- Comandos básicos do Linux (
cat
,cut
,grep
). - Manipulação e extração de campos em arquivos delimitados.
- Uso de variáveis de posição em scripts bash.
- Opções de case-insensitive no
grep
(-i
).
Se precisar de mais alguma coisa ou tiver dúvidas, estou à disposição. Continue praticando e bons estudos!
Clique para visualizar este gabarito
Visualize o gabarito desta questão clicando no botão abaixo
Comentários
Veja os comentários dos nossos alunos
B - cat /etc/passwd | cut -d: -f5 | grep -i ${1}
Vamos lá.
Precisamos entender como funciona o arquivo /etc/passwd e a função de cada parâmetro.
O arquivo /etc/passwd contém uma linha para cada usuário, com vários campos separados por dois pontos :.
Os campos relevantes para esta questão são:
O 5º campo contém a descrição do usuário.
O comando cut -d: -f5 extrai exatamente esse campo de descrição.
O comando grep -i é utilizado para buscar uma string dentro do texto, ignorando a diferença entre maiúsculas e minúsculas.
O ${1} representa o primeiro argumento passado para o script, que é a palavra de busca neste caso.
Agora vamos destrinchar os comandos, explicando cada um e seus argumentos
cat /etc/passwd
cat: Este comando é usado para ler o conteúdo de um arquivo e exibi-lo na tela.
/etc/passwd: Este é o arquivo no sistema Linux/Unix que contém informações sobre os usuários do sistema. Cada linha do arquivo descreve um usuário diferente.
| (pipe)
O símbolo de pipe | é usado para enviar a saída de um comando como entrada para o próximo comando na pipeline.
cut -d: -f5
cut: Este comando é usado para extrair seções de cada linha de um arquivo.
-d:: Este argumento diz ao cut para usar o caractere dois pontos : como delimitador para separar os campos em cada linha.
-f5: Este argumento especifica que queremos apenas o quinto campo de cada linha. No arquivo /etc/passwd, o quinto campo é geralmente usado para a descrição do usuário (também conhecido como campo GECOS).
grep -i ${1}
grep: Este comando é usado para procurar linhas que contenham um padrão específico.
-i: Este argumento torna a busca por padrões insensível a maiúsculas e minúsculas.
${1}: Este é um parâmetro posicional em scripts bash. ${1} refere-se ao primeiro argumento passado para o script na linha de comando. Se o seu script for chamado search.sh e você o executar como ./search.sh Mail, então ${1} será substituído por Mail na execução do grep.
b-
padrao do arquivo shadow:
username1:x:1001:1001:User One:/home/username1:/bin/bash
username: login
x: placeholder para senha
1001: UID (user id)
1001: GID - group ID
User One -> descrição do usuario
/home/username1 -> path para o diretorio home do usuario
/bin/bash -> shell padrao ao fazer login
obs.:
1- o delimitador padrao para separar campos em /etc/passwd é o 2 pontos ( : ). por isso ao utilizar o comando cut para extrair algum campo no arquivo passwd, usa-se cut -d: para definir o separador. e.g.: cat /etc/passwd | cut -d:
2- para definir o campo a ser extraído, indica-se sua posição com a flag f. e.g.: cat /etc/passwd | cut -d: f5 para extrair o 5° campo, que contém informações acerca do usuario.
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
grep -> busca
grep -i -> case insensitive search
como esta na questao, ${1} é somente um placeholder para uma regex no grep ex.: [a-Z], ^[abs] etc. usado em conjunto com uma string À frente do comando, e o executando como arquivo, tem como resultado o retorno do output consoante a string especificada. logo, é necessario salvar o cmd: cat /etc/passwd | cut -d: -f5 | grep -i ${1} como .sh (executando chmod +x para torná-lo executavel e o rodando com ./ ) e executando com arquivo.sh String_a_ser_pesquisada
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo