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

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

15.03.2016 07:05:40 Просмотров 25 Источник

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

Итак, дело в том, что я нахожусь на терминале 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 "^./"

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

Заранее большое вам спасибо! :)

У вопроса есть решение - Посмотреть?

Ответы - Как я могу исключить все строки результатов "отказано в разрешении”из "grep"? / How can I exclude all “permission denied” result lines from “grep”?

Luana Pimentel

15.03.2016 07:41:26

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

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

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

Редактировать: вы также можете просто подавить сообщения об ошибках с помощью:

grep -irl "foo" 2>&-
https://stackoverflow.com/questions/36016413/how-can-i-exclude-all-permission-denied-result-lines-from-grep/36017161#comment59999549_36017161
Кстати, я не совсем ясно объяснился, спасибо Вам большое. Я знаю, что у меня нет разрешения, и я не могу его получить. Дело в том, что я не знаю результатов grep, не все они есть ./foo, они могут быть где угодно, я могу достать ./fooили ./bar, я просто хочу отбросить все результаты, которые показывают, что у меня нет разрешения.
https://stackoverflow.com/questions/36016413/how-can-i-exclude-all-permission-denied-result-lines-from-grep/36017161#comment60004706_36017161
@gleba, это то, что перенаправление должно делать. Будут показаны все результаты (stdout), за исключением Permission denied). Вы можете повторно протестировать свою команду, просто добавив stderrв конце
https://stackoverflow.com/questions/36016413/how-can-i-exclude-all-permission-denied-result-lines-from-grep/36017161#comment98275975_36017161
И таким образом с этим совершенно ясным ответом я, наконец, понял, что 2>в терминале (трудно искать)
mhck

21.10.2019 06:36:41

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

grep -irls "foo"

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

- s, - нет-сообщений

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

Закрыть X