Como usar grep quando o arquivo não contém a sequência

26

No meu script bash, estou tentando imprimir uma linha se uma determinada string não existir em um arquivo.

if grep -q "$user2" /etc/passwd; then
    echo "User does exist!!"

Foi assim que eu escrevi, se quisesse que a string existisse no arquivo, mas como posso alterar isso para torná-la impressa "o usuário não existe" se o usuário não for encontrado no arquivo / etc / passwd?

Chirag Vijay
fonte

Respostas:

49

grepretornará sucesso se encontrar pelo menos uma instância do padrão e falha se não encontrar. Portanto, você pode adicionar uma elsecláusula se desejar imprimir "não" e "não", ou apenas negar a ifcondição para obter apenas falhas. Um exemplo de cada um:

if grep -q "$user2" /etc/passwd; then
    echo "User does exist!!"
else
    echo "User does not exist!!"
fi

if ! grep -q "$user2" /etc/passwd; then
    echo "User does not exist!!"
fi
Eric Renouf
fonte
2

Uma alternativa é procurar o status de saída de grep. Por exemplo:

grep -q "$user2" /etc/passwd
if [[ $? != 0 ]]; then
    echo "User does not exist!!"

Se grepnão conseguir encontrar um jogo que vai sair 1, então $?será 1. grepsempre retornará 0se for bem-sucedido. Portanto, é mais seguro usar do $? != 0que $? == 1.

ssanch
fonte
esta é realmente apenas uma maneira mais longa de dizer o que Eric disse .
Jeff Schaller
Bem, para mim, a if ! grep ...afirmação negativa não funcionou. Então essa é uma alternativa.
ssanch
1

Eu resolvo isso com um liner simples:

for f in *.txt; do grep "tasks:" $f || echo $f; done

O comando verificará todos os arquivos no diretório com extensão txt e gravará a sequência de pesquisa (por exemplo, "task:") se for encontrada ou o nome do arquivo.

matrik
fonte
0

Você pode usar a opção grep "-L / --arquivos sem correspondência" , para verificar se o arquivo não contém uma sequência:

if [[ $(grep -L "$user2" /etc/passwd) ]]; then   
  echo "User does not exist!!"; 
fi
Noam Manos
fonte