Ищите и распечатайте строки от вывода, который может содержать строки с ошибками

У меня есть пример команды,

device list

который дает мне все устройства с их состоянием как хорошо или ошибка в следующем формате

[okay     ]:  you are listening on : 11
[error    ]:  not currently listening: 22
[error    ]:  not currently listening: 33
[okay     ]:  you are listening on : 111

Я хочу распечатать только устройства, который имеет состояние как хорошо.

Я пытался использовать команду grep как

device list | grep -r 'okay'
device list | grep -r '[okay     ]'
device list | grep -r '^okay'
device list | grep  'okay'

Но это не распечатало вывода. Как я могу распечатать устройства с состоянием как хорошо.

Заранее спасибо.

2
задан 24 March 2014 в 15:25

3 ответа

Вы не должны использовать -r опция с grep в этом случае, потому что (взгляд man grep):

-r, --recursive
              Read all files  under  each  directory,  recursively,  following
              symbolic  links  only  if they are on the command line.  This is
              equivalent to the -d recurse option.

также необходимо перенаправить и ошибки от стандартного вывода, который будет передан по каналу grep команда с помощью 2>&1 перенаправление:

device list 2>&1 | grep 'okay'

Или можно использовать |& :

device list |& grep 'okay'
4
ответ дан 8 October 2019 в 10:44

От вывода, данного нам, по крайней мере, версия grep должен был смочь работать. Если это не делает, единственная возможная причина - то, потому что эта команда не печатает свой вывод на STDOUT но на STDERR. Оба отображены на любом терминале/консоли по умолчанию, но командах как grep когда такин его вход через канал (|) сделайте это от STDOUT только.

Решение состоит в том, чтобы перенаправить вывод STDERR кому: STDOUT, это что 2>&1 или |& сделает:

$ device list 2>&1 | grep okay
$ device list |& grep okay

3 первых формы Вашей команды, с помощью grep -r никогда не будет работы, даже если Вы перенаправите вывод STDERR потому что -r опция используется для рекурсивного вызова в каталог и подкаталог. Таким образом, даже если используемый после канала, grep -r something будет искать что-то в файлах во всех каталогах от того, куда Вы выполняете команду.

2
ответ дан 8 October 2019 в 10:44

Удалите -r опция Вашей команды grep, и это будет работать:

device list | grep 'okay'

-r для рекурсивного поиска.

1
ответ дан 8 October 2019 в 10:44

Другие вопросы по тегам:

Похожие вопросы: