Como posso suprimir a saída do grep, para que ela retorne apenas o status de saída?

52

Eu tenho o comando grep . Estou procurando uma palavra-chave de um arquivo, mas não quero exibir a correspondência. Eu só quero saber o status de saída do grep .

    
por jackass27 11.12.2013 / 02:38

4 respostas

59

Qualquer versão compatível com POSIX de grep tem a opção -q para silêncio:

-q
     Quiet. Nothing shall be written to the standard output, regardless
     of matching lines. Exit with zero status if an input line is selected.

No GNU grep (e possivelmente em outros) você também pode usar sinônimos de opções longas:

-q, --quiet, --silent     suppress all normal output

Exemplo

A string existe:

$ echo "here" | grep -q "here"
$ echo $?
0

A string não existe:

$ echo "here" | grep -q "not here"
$ echo $?
1
    
por 11.12.2013 / 03:00
4

Apenas redirecione a saída de grep para /dev/null :

grep sample test.txt > /dev/null

echo $?
    
por 11.12.2013 / 02:45
2

Você simplesmente precisa combinar grep -q <pattern> com uma verificação imediata do código de saída do último processo a ser encerrado ( $? ).

Você pode usar isso para criar um comando como este, por exemplo:

uname -a | grep -qi 'linux' ; case "$?" in "0") echo "match" ;; "1") echo "no match" ;; *) echo "error" ;; esac

Você pode, opcionalmente, suprimir a saída de STDERR da seguinte forma:

grep -qi 'root' /etc/shadow &> /dev/null ; case "$?" in "0") echo "match" ;; "1") echo "no match" ;; *) echo "error: $?" ;; esac

Isso imprimirá error: 2 da instrução case (assumindo que não temos privilégios para ler /etc/shadow ou que o arquivo não existe), mas a mensagem de erro de grep será redirecionada para /dev/null então nunca vemos isso.

    
por 11.12.2013 / 08:09
0

Se você não quiser ver qualquer saída , você precisa redirecionar stderr e stdout para / dev / null. As outras respostas são boas, mas não suprimem erros, como tentar ler de um arquivo inexistente ou ilegível (por exemplo, permissões incorretas). Anexe &> /dev/null (funciona no bash e em alguns outros shells, mas não todos; >/dev/null 2>&1 pode ser mais portável) para que você não veja nenhuma saída.

$ ls thisfiledoesnotexist
ls: cannot access thisfiledoesnotexist: No such file or directory
$ grep foo thisfiledoesnotexist
grep: thisfiledoesnotexist: No such file or directory
$ grep -q foo thisfiledoesnotexist
grep: thisfiledoesnotexist: No such file or directory
$ grep foo thisfiledoesnotexist >/dev/null
grep: thisfiledoesnotexist: No such file or directory
$ grep foo thisfiledoesnotexist &>/dev/null
$ echo $?
2
$ touch nopermissions
$ chmod 000 nopermissions
$ grep -q foo nopermissions
grep: nopermissions: Permission denied
$ grep foo nopermissions > /dev/null
grep: nopermissions: Permission denied
$ grep foo nopermissions &> /dev/null
$ echo $?
2
$ 

Se você já verificou que o arquivo de destino existe e é um arquivo e tem permissões para lê-lo, isso não é tão importante, mas se você estiver sendo um pouco mais descuidado e usando recursivamente ou usando curingas, é mais provável que você veja a saída no stderr.

    
por 11.12.2013 / 07:21