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?

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

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.


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.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.