Usando o whoami para procurar arquivos que mencionam o usuário

6

Atualmente estou trabalhando em alguns exercícios para tentar melhorar meu script de shell. Os requisitos do script são os seguintes:

  1. It must get the user's name using the whoami command and store it in a variable called username.
  2. It must take a single parameter which is the name of the file to be searched.
  3. It must grep to search the specified file for occurrences of the user's name and print them.

Esta parte é relativamente simples e usei o seguinte para que funcione:

username=$(whoami)
echo 'Enter the name of the file you would like to search: '
read fileName
cat "fileName" | grep "$username"

No entanto, há uma captura, o exercício afirma o seguinte:

Note: for this task there's no need to worry about missing parameters of error checking. The script, apart from shebang and any comments you choose to add, should consist of two lines.

Como posso reduzir isso para apenas duas linhas?

    
por NigerianWizard 08.10.2018 / 12:53

2 respostas

8

O nome do caminho do arquivo é dado como um parâmetro . Isso significa que é dado na linha de comando do script. Isso significa que você não deve perguntar ao usuário de forma interativa.

#!/bin/sh
grep -wF -e "$LOGNAME" "$1"

Como alternativa, se você realmente quiser usar whoami :

#!/bin/sh
grep -wF -e "$(whoami)" "$1"

Ou, para o requisito "duas linhas":

#!/bin/sh
name=$(whoami)  # or:  name=$LOGNAME
grep -wF -e "$name" "$1"

Ou, se quisermos fazer algo útil nessa primeira linha:

#!/bin/sh
[ ! -f "$1" ] && { printf 'No such file: %s\n' "$1" >&2; exit 1; }
grep -wF -e "$(whoami)" "$1"

A opção -w para grep faz corresponder apenas palavras completas. grep -w 'AA' corresponderia a AA , mas não AAA .

A opção -F para grep faz o utilitário usar a expressão fornecida como uma string fixa e não como uma expressão regular.

A opção -e significa que a próxima cadeia na linha de comando é o padrão. Sem ele, um padrão começando com um traço pode ser interpretado erroneamente como um conjunto de opções de linha de comando.

A variável $LOGNAME (ou $USER em muitos sistemas) contém o nome de usuário atual.

O valor de $1 é o primeiro argumento de linha de comando fornecido ao script na linha de comando.

Observe também que podemos executar isso com /bin/sh em vez de bash , pois este script não usa extensões especiais de shell bash -specific. Ele obviamente funcionaria bem abaixo de bash ...

Note que o acima não pesquisa por arquivos mencionando um usuário em particular (como no título da pergunta), mas procura por linhas em um arquivo que menciona este usuário.

Para procurar por arquivos que mencionam o usuário atual em um diretório dado na linha de comando:

#!/bin/sh
find "$1" -type f -exec grep -q -wF -e "$LOGNAME" {} ';' -print

Relacionado a esta última parte:

por 08.10.2018 / 13:03
1

A solução mais simples:

#!/bin/bash
username=$(whoami)
grep $username $1

Você pode fornecer o grep com um nome de arquivo como parâmetro opcional (consulte man grep ). A variável $1 refere-se ao parâmetro posicional de início de um script.

Você o chama da seguinte forma:

name-finder.sh filename

Você pode torná-lo até mesmo um verso:

username=$(whoami); grep $username $1

Ou

grep $(whoami) $1
    
por 08.10.2018 / 13:08