Grep, ignorar avisos

50

Estou tentando encontrar o diretório de instalação de um pacote específico. Eu tenho uma determinada palavra-chave usando a qual estou tentando encontrar um arquivo específico.

Durante o grep, quero incluir apenas o tipo de arquivo cpp ou h . Eu não quero que o grep mostre avisos como Permissão Negada ou Não foi possível encontrar o Diretório . Eu só quero que ele exiba arquivos correspondentes, nada mais. Por favor, sugira como posso fazer isso?

No momento estou usando

grep "My term" -ir --exclude-dir="\.svn" --include=*.{cpp,h} ./
Neeraj Gupta
fonte

Respostas:

56

Esses avisos são direcionados ao stderrfluxo, em oposição ao descritor de arquivo de saída padrão. Você pode silenciar a saída stderr adicionando 2>/dev/nullao final do seu comando.

James Henstridge
fonte
Te ser mais específico find . 2>/dev/null | grep 404.htmlé o que um comando seria
#
30

Mais diretamente do que filtrar os avisos, você pode desativá-los adicionando -s:

grep "My term" -sir --exclude-dir="\.svn" --include=*.{cpp,h} ./

Existem alguns problemas de compatibilidade com esta opção. No entanto, isso não deve ser um problema para uso pessoal.

-s, --no-messages: suprime mensagens de erro sobre arquivos inexistentes ou ilegíveis. Nota sobre portabilidade: diferente do GNU grep, o 7th Edition Unix grep não estava em conformidade com o POSIX, porque faltava -q e sua opção -s se comportava como a opção -q do GNU grep. O grep no estilo USG também não possuía -q, mas sua opção -s se comportava como o GNU grep. Os scripts de shell portáteis devem evitar -q e -s e redirecionar a saída padrão e de erro para / dev / null. (-s é especificado pelo POSIX.)

Sebastian vom Meer
fonte
Acabei de instalar o 13.04 e estou recebendo os erros que não estava recebendo no 12.04. Será que algo mudou? Eu achei legal que o grep parasse de alertar sobre arquivos serem diretórios, já que na maioria dos casos eu simplesmente não ligo!
Alexis Wilke
Desculpe, ainda estou em 12.10, então não posso confirmar isso.
Sebastian vom Meer
5

Eu costumava receber uma tonelada de mensagens irritantes como esta:

grep: commands: Is a directory
grep: events: Is a directory
grep: views: Is a directory

O motivo é que o --directoriessinalizador é o padrão read. Eu mudei para recurse; se você não quiser que ele faça automaticamente uma pesquisa recursiva, use-o skip.

A maneira mais fácil de lidar com isso o tempo todo é configurá-lo em uma variável de ambiente. Em ~/.bash_profileou ~/.bashrcdependendo da sua distribuição:

export GREP_OPTIONS='--directories=recurse'

Agora, suprime automaticamente essas mensagens sempre que eu uso grep.

Outra opção é a --no-messagesbandeira, taquigrafia -s. Isso também livra as Is a directorymensagens, mas também suprime outras mensagens que podem ser mais úteis. Por exemplo, se você estiver fazendo uma pesquisa aninhada */*/*e não existir esse arquivo desse padrão, ele não informará isso.

andrewtweber
fonte
boa explicação
aldr 16/10
1

Uma abordagem alternativa, em vez de greprecursivamente, -ir seria permitir que o findcomando (que é recursivo por padrão) manipule as permissões com -readablesinalizador e caminho para excluir com -not -path "*.svn*"sinalizadores e depois passe o arquivo para grep. A exclusão de diretórios é feita via -type fpara encontrar apenas arquivos regulares.

$ find . -not -path "*.svn*" -type f -name "*.cpp" -or -name "*.h"  -readable -exec grep "my terms" "{}" \; 
Sergiy Kolodyazhnyy
fonte
0

Ao fazer pesquisas recursivas em arquivos específicos, é muito melhor usá-lo ack-grep. A sintaxe aqui seria:

ack-grep -i "My term" --cpp --h

Para remover as mensagens de erro de permissão, convém executar o mesmo comando com sudo:

ack-grep -i "My term" --cpp --h

Mas, eventualmente, se você deseja pesquisar pacotes instalados, consulte as várias opções: https://www.google.com/search?q=ubuntu%20search%20inside%20installed%20packages

dargaud
fonte