сценарий bash: выполнить команду и передать ее вывод в awk

У меня проблемы со скриптом bash. По сути, в моем сценарии я запускаю команду

bjobs -u $1

$1 — это аргумент сценария, и это идентификатор пользователя в моем кластере. Если у пользователя $1 нет запущенных/ожидающих заданий в кластере, bjobs печатает

 No unfinished jobs found

в стандартный вывод. Кроме того, статус выхода — 255. Если у пользователя $1 есть задания, bjobs печатает:

JOBID   USER    STAT  QUEUE      FROM_HOST   EXEC_HOST   JOB_NAME   SUBMIT_TIME
45823   .......
45824   .......
.
.

и статус выхода равен 0. Я хотел бы, чтобы awk анализировал вывод bjobs. Я попытался

bjobs -u $1 | awk '...'

где '...' - моя программа синтаксического анализа awk. Это работает не очень хорошо, потому что, по-видимому, когда у пользователя $1 нет запущенных/ожидающих выполнения заданий, строка «Незавершенные задания не найдены» не передается в awk. То же самое происходит с

bjobs -u $1 > foo
awk '...' foo 

Какие-либо предложения?


person DeltaIV    schedule 17.10.2012    source источник
comment
Действительно ли bjobs отправляет сообщение на стандартный вывод? На stderr не идет?   -  person choroba    schedule 17.10.2012
comment
Привет, @choroba, да, похоже, что bjobs отправляет сообщение Незавершенные задания не найдены в stderr, а когда находит задания, пишет в stdout. Таким образом, перенаправление stderr на stdout решило проблему.   -  person DeltaIV    schedule 17.10.2012


Ответы (2)


Возможно, это сообщение (я думаю, что это своего рода ошибка) поступает в STDERR, а не в STDOUT.

Вы можете перенаправить потоки ввода-вывода в bash с > на файловые дескрипторы, а 2 — это STDERR.

Пытаться:

bjobs -u $1 2>&1 | awk '...'

И посмотрите, решит ли это это для вас. Часть 2>&1 означает перенаправление STDERR (2) в STDOUT (1), а STDOUT — это то, что передается в awk.

Дополнительная информация: http://www.tldp.org/LDP/abs/html/io-redirection.html

person sync    schedule 17.10.2012

Возможно, bjobs печатает «Незавершенные задания не найдены» в stderr.

Добавьте 2>&1 для передачи stderr в stdout.

Подробнее о перенаправлении ввода-вывода в bash

person bbaja42    schedule 17.10.2012