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

51

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

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

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

grep "My term" -ir --exclude-dir="\.svn" --include=*.{cpp,h} ./
Нирадж Гупта
источник

Ответы:

58

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

Джеймс Хенстридж
источник
Более конкретно find . 2>/dev/null | grep 404.html, как будет выглядеть команда
csga5000
30

Более прямо, чем фильтрация предупреждений, вы можете отключить их, добавив -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.)

Себастьян Фом Меер
источник
Я только что установил 13.04, и я получаю ошибки, которые я не получал с 12.04. Может быть, что-то изменилось? Я подумал, что это здорово, что grep перестанет предупреждать о том, что файлы являются каталогами, так как в большинстве случаев мне все равно!
Алексис Уилке
К сожалению, я все еще на 12.10, поэтому я не могу подтвердить это.
Себастьян Фом Меер
5

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

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сообщений, но также подавит другие сообщения, которые могут быть более полезными. Например, если вы выполняете вложенный поиск, */*/*и такого файла с этим шаблоном не существует, он вам об этом не скажет.

andrewtweber
источник
хорошее объяснение
aldr
1

Альтернативный подход вместо использования 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

При выполнении рекурсивного поиска в определенных файлах вам гораздо лучше использовать 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

dargaud
источник