Как я могу исключить все строки с "разрешенными отказами" из "grep"?

Это мой первый вопрос, поэтому я попытаюсь быть ясным и извините за свой английский.

Итак, дело в том, что я на linux-терминале, используя команду grep, и я хочу, чтобы результат был без всех строк, где он печатает в начале "grep:" или строки, начинающиеся с "./", потому что теперь я получить что-то вроде этого:

grep: ./users/blabla1: Permission denied
grep: ./users/blabla2: Permission denied
grep: ./users/blabla3: Permission denied
grep: ./users/blabla4: Permission denied
grep: ./users/blabla5: Permission denied
grep: ./users/blabla6: Permission denied
grep: ./users/blabla7: Permission denied
grep: ./users/blabla8: Permission denied
./foo/bar/log.log
./foo/bar/xml.xml

Я пробовал это:

grep -irl "foo" . | grep -v "Permission denied"

Я также пробовал это:

 grep -irl "foo" . | grep -v "^grep:"

И, наконец, этот:

 grep -irl "foo" . | grep "^./"

Но я получаю такие же результаты, как если бы я ничего не ставил после каких-либо идей? Что мне не хватает?

Огромное спасибо заранее! :)

Ответы

Ответ 1

Сообщения, которые вы получаете, вызваны отсутствием прав доступа к этим файлам, то есть это сообщения об ошибках.
Все, что вам нужно сделать, это перенаправить stderr (стандартный вывод ошибок) в /dev/null, например:

grep -irl "foo" 2> /dev/null

Чтобы узнать больше о перенаправлении (на bash), прочитайте эту статью: Справочное руководство Bash - Перенаправления

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

grep -irl "foo" 2>&-

Ответ 2

Я предпочитаю использовать -s флаг 'suppress':

grep -irls "foo"

Обратите внимание на "Замечание о переносимости" со страницы руководства grep:

-s, --no-messages

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