grep показать все строки, а не только совпадения, установить статус выхода - PullRequest
8 голосов
/ 27 мая 2011

Я передаю некоторые выходные данные команды egrep, которую я использую, чтобы убедиться, что конкретная строка ошибки не появляется.

Сама команда, к сожалению, не вернет ненулевой статус выхода при сбое, поэтому я делаю это.

command | egrep -i -v "badpattern"

Это работает так, что дает мне код выхода, который я хочу (1, если badpattern появляется в выходных данных, 0 в противном случае), НО, он будет выводить только строки, которые не соответствуют шаблону (как ключ -v был предназначен для этого). Для моих нужд эти строки - самые интересные.

Есть ли способ заставить grep просто вслепую проходить через все строк, которые он получает в качестве входных данных, и просто давать мне соответствующий код выхода?

Если нет, я подумал, что я мог бы просто использовать perl -ne "print; exit 1, если / badpattern /". Я использую -n, а не -p, потому что -p не будет печатать ошибочную строку (так как она печатает после запуска одной строки). Итак, я использую -n и сама вызываю print, что, по крайней мере, дает мне первую оскорбительную строку, но затем вывод (и выполнение) на этом останавливается, поэтому мне придется сделать что-то вроде

perl -e '$code = 0; while (<>) { print; $code = 1 if /badpattern/; } exit $code'

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

Ответы [ 3 ]

6 голосов
/ 27 мая 2011

На самом деле, ваша идея на Perl неплохая. Попробуйте:

perl -pe 'END { exit $status } $status=1 if /badpattern/;'

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

3 голосов
/ 27 мая 2011
$ tee /dev/tty < ~/.bashrc | grep -q spam && echo spam || echo no spam
1 голос
/ 27 мая 2011

Как насчет перенаправления в / dev / null, следовательно, удаления всех строк, но вы все равно получаете код выхода?

$ grep spam .bashrc > /dev/null

$ echo $?
1

$ grep alias .bashrc > /dev/null

$ echo $?
0

Или вы можете просто использовать переключатель -q

   -q, --quiet, --silent
          Quiet;   do   not  write  anything  to  standard  output.   Exit
          immediately with zero status if any match is found, even  if  an
          error  was  detected.   Also see the -s or --no-messages option.
          (-q is specified by POSIX.)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...