Как я могу исключить все строки с "разрешенными отказами" из "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.)