Um administrador precisa criar um shell script bash (Bourne-...

Próximas questões
Com base no mesmo assunto
Q2383164 Programação
Um administrador precisa criar um shell script bash (Bourne-Again Shell) que recebe uma palavra de busca e lista a descrição dos usuários cadastrados no arquivo /etc/passwd que possuem a sequência de caracteres da palavra de busca em alguma parte da descrição, independentemente de caracteres maiúsculos ou minúsculos (ex: a palavra de busca Mail poderá casar com uma parte da descrição que contenha mail, mAiL ou Mailing). A listagem dos usuários que atendem à condição especificada deve ser impressa na tela. Depois de verificar com sucesso que a palavra de busca é fornecida como o primeiro argumento da linha de comando e verificar que o arquivo /etc/passwd está acessível, o administrador pode escrever uma pipeline no script para executar a busca.
Qual pipeline atende à especificação descrita?
Alternativas

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