Grep, игнорируй предупреждения

Я пытаюсь найти каталог установки определенного пакета. У меня есть определенное ключевое слово, с помощью которого я пытаюсь найти определенный файл.

Во время grep я хочу включить только тип файла cpp или h . Я не хочу, чтобы grep отображал предупреждений , таких как Разрешение отклонено или Не удалось найти каталог . Я просто хочу, чтобы он отображал совпадающие файлы, больше ничего. Пожалуйста, предложите, как я могу это сделать?

В настоящее время я использую

grep "My term" -ir --exclude-dir="\.svn" --include=*.{cpp,h} ./
51
задан 27 March 2011 в 14:37

5 ответов

Более прямо, чем фильтрация предупреждений, вы можете отключить их, добавив -s:

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

Есть некоторые проблемы совместимости с этой опцией. Тем не менее, это не должно быть проблемой для личного использования.

-s, --no-messages: Подавлять сообщения об ошибках несуществующих или нечитаемых файлов. Примечание по переносимости: в отличие от GNU grep, 7-й выпуск Unix grep не соответствовал POSIX, поскольку в нем отсутствовал параметр -q, а его параметр -s вел себя так же, как и параметр GNU-grep -q. В grep в стиле USG также не хватает -q, но его опция -s ведет себя как GNU grep. Переносимые сценарии оболочки должны избегать как -q, так и -s и вместо этого перенаправлять стандартный вывод и вывод ошибок в / dev / null. (-s определяется POSIX.)

0
ответ дан 27 March 2011 в 14:37

Раньше я получал массу раздражающих сообщений, подобных этому:

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

Причина в том, что флаг --directories по умолчанию установлен на read. Я изменил его на recurse; если вы не хотите, чтобы он автоматически выполнял рекурсивный поиск, вы можете использовать вместо него skip.

Самый простой способ справиться с этим постоянно - это установить его в переменной окружения. В ~/.bash_profile или ~/.bashrc в зависимости от вашего дистрибутива:

export GREP_OPTIONS='--directories=recurse'

Теперь он автоматически подавляет эти сообщения каждый раз, когда я использую grep.

Другим вариантом является флаг --no-messages, сокращение -s. Это также избавит от сообщений Is a directory, но также подавит другие сообщения, которые могут быть более полезными. Например, если вы выполняете вложенный поиск в */*/*, и такого файла этого шаблона не существует, он вам об этом не скажет.

0
ответ дан 27 March 2011 в 14:37

При выполнении рекурсивного поиска в определенных файлах вам гораздо лучше использовать ack-grep. Синтаксис здесь будет следующим:

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

Чтобы удалить сообщения об ошибках разрешения, вы можете запустить ту же команду с sudo:

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

Но в конце концов, если вы хотите для поиска установленных пакетов просмотрите следующие варианты: https://www.google.com/search?q=ubuntu%20search%20inside%20installed%20packages

0
ответ дан 27 March 2011 в 14:37

Альтернативный подход вместо выполнения grep рекурсивно с -ir состоял бы в том, чтобы позволить команде find (которая является рекурсивной по умолчанию) обрабатывать разрешения с флагом -readable и пути для исключения с флагами -not -path "*.svn*", и затем передайте файл в grep. Исключение каталогов выполняется через -type f для поиска только обычных файлов.

$ find . -not -path "*.svn*" -type f -name "*.cpp" -or -name "*.h"  -readable -exec grep "my terms" "{}" \; 
0
ответ дан 27 March 2011 в 14:37

Эти предупреждения направлены на поток stderr, в отличие от стандартного дескриптора файла. Вы можете отключить вывод stderr, добавив 2>/dev/null в конец вашей команды.

0
ответ дан 27 March 2011 в 14:37

Другие вопросы по тегам:

Похожие вопросы: