Вопрос или проблема
Мне нужно отобразить каждую очередь менеджера очередей IBM MQ вместе с её глубиной.
Я могу сделать это с помощью команды echo DISPLAY QLOCAL(QE*) WHERE(CURDEPTH GE 0) | runmqsc QMNAME
.
Вывод похож на этот:
5724-H72 (C) Copyright IBM Corp. 1994, 2023.
Запуск MQSC для менеджера очередей QMNAME.
1 : DISPLAY QLOCAL(QE*) WHERE(CURDEPTH GE 0)
AMQ8409I: Отображение деталей очереди.
QUEUE(QE.QUEUE.NAME1) TYPE(QLOCAL)
CURDEPTH(2)
AMQ8409I: Отображение деталей очереди.
QUEUE(QE.QUEUE.NAME2) TYPE(QLOCAL)
CURDEPTH(90)
AMQ8409I: Отображение деталей очереди.
QUEUE(QE.QUEUE.NAME.QUEUE.NAME.QUEUE.NAME3)
TYPE(QLOCAL) CURDEPTH(1)
AMQ8409I: Отображение деталей очереди.
QUEUE(QE.QUEUE.NAME.QUEUE.NAME.QUEUE.NAME4)
TYPE(QLOCAL) CURDEPTH(0)
AMQ8409I: Отображение деталей очереди.
QUEUE(QE.QUEUE.NAME5) TYPE(QLOCAL)
CURDEPTH(0)
AMQ8409I: Отображение деталей очереди.
QUEUE(QE.QUEUE.NAME.QUEUE.NAME6)
TYPE(QLOCAL) CURDEPTH(0)
AMQ8409I: Отображение деталей очереди.
QUEUE(QE.QUEUE.NAME7) TYPE(QLOCAL)
CURDEPTH(0)
Команда MQSC прочитана.
Нет команд с ошибками синтаксиса.
Все действительные команды MQSC были обработаны.
Обратите внимание, что у некоторых очередей длинные имена, и вывод сдвигает поля “
TYPE
” и “CURDEPTH
” вниз и вправо.
Моя цель – отобразить эти очереди как [TYPE] - [QUEUE.NAME] - [DEPTH]
:
QLOCAL - QE.QUEUE.NAME.QUEUE.NAME.QUEUE.NAME3 - 1
Я пытаюсь использовать либо sed
, либо awk
для достижения этой цели, и это некоторые из моих попыток:
С помощью awk
awk -F'(QUEUE|TYPE|CURDEPTH)' '/QUEUE\(.*\)/{printf "%s - %s - ", $2, $3}/CURDEPTH/{printf "%s\n", $2}'
$ echo DISPLAY QLOCAL(QE*) WHERE(CURDEPTH GE 0) | runmqsc QMNAME | cat teste | awk -F'(QUEUE|TYPE|CURDEPTH)' '/QUEUE\(.*\)/{printf "%s - %s - ", $2, $3}/CURDEPTH/{printf "%s\n", $2}'
GE 0)
(QE.QUEUE.NAME1) - (QLOCAL) - (0)
(QE.QUEUE.NAME2) - (QLOCAL) - (0)
(QE.QUEUE.NAME.QUEUE.NAME.QUEUE.NAME3) - - (QLOCAL)
(QE.QUEUE.NAME.QUEUE.NAME.QUEUE.NAME4) - - (QLOCAL)
(QE.QUEUE.NAME5) - (QLOCAL) - (0)
(QE.QUEUE.NAME.QUEUE.NAME6) - - (QLOCAL)
(QE.QUEUE.NAME7) - (QLOCAL) - (0)
Основная проблема заключается в том, что вывод не отображает глубину очереди правильно, когда её имя длинное.
С помощью sed
sed -rn 's|QUEUE\((.*)\)\s+TYPE\((.*)\)\s+CURDEPTH\((\d+)\)|\2 - \1 - \3|p'
$ echo DISPLAY QLOCAL(QE*) WHERE(CURDEPTH GE 0) | runmqsc QMNAME | sed -rn 's|QUEUE\((.*)\)\s+TYPE\((.*)\)\s+CURDEPTH\((\d+)\)|\2 - \1 - \3|p'
$ echo DISPLAY QLOCAL(QE*) WHERE(CURDEPTH GE 0) | runmqsc QMNAME | sed -rn 's|QUEUE\((.*)\)\s+TYPE\((.*)\)|\2 - \1|p'
QLOCAL - QUEUE.NAME1
QLOCAL - QUEUE.NAME2
QLOCAL - QE.QUEUE.NAME.QUEUE.NAME.QUEUE.NAME3
QLOCAL - QE.QUEUE.NAME.QUEUE.NAME.QUEUE.NAME4
QLOCAL - QE.QUEUE.NAME5
QLOCAL - QE.QUEUE.NAME.QUEUE.NAME6
QLOCAL - QE.QUEUE.NAME7
sed
ничего не показывает, когда я добавляю выражение \s+CURDEPTH
. Только когда я удаляю его, он показывает очереди, но тогда я теряю значение глубины.
Можете ли вы дать мне какие-то рекомендации по этому поводу?
Ответ или решение
Форматирование и фильтрация очередей IBM MQ
Современные системы управления сообщениями, такие как IBM MQ, обеспечивают надежный обмен данными между различными приложениями. Ваша задача — корректно отобразить информацию о локальных очередях (QLocal) и их текущей глубине. Давайте рассмотрим, как можно эффективно обработать вывод команды runmqsc
для получения нужного вам формата.
Проблема
Вы используете команду:
echo DISPLAY QLOCAL(QE*) WHERE(CURDEPTH GE 0) | runmqsc QMNAME
В результате которой получаете вывод, требующий дополнительной обработки для формирования желаемого вида:
[TYPE] - [QUEUE.NAME] - [DEPTH]
Однако у вас возникают трудности с форматированием длинных имен очередей, что приводит к смещению полей TYPE
и CURDEPTH
.
Решение через awk
Давайте использовать инструмент awk
, который позволит вам оптимально организовать обработку строк. Вы можете попробовать следующий подход:
echo DISPLAY QLOCAL(QE*) WHERE(CURDEPTH GE 0) | runmqsc QMNAME | awk '
/QUEUE\((.*)\)/ {
queue = $2;
type = "";
}
/TYPE\((.*)\)/ {
type = $2;
}
/CURDEPTH\((\d+)\)/ {
depth = $2;
if (type != "") {
printf "%s - %s - %s\n", type, queue, depth;
}
}'
Решение через sed
Если вы предпочитаете использовать sed
, есть возможность задать регулярное выражение, которое подстроится под ваш случай. Попробуйте следующий вариант:
echo DISPLAY QLOCAL(QE*) WHERE(CURDEPTH GE 0) | runmqsc QMNAME | sed -rn '
s|QUEUE\((.*?)\).*TYPE\((.*?)\).*CURDEPTH\((\d+)\)|\2 - \1 - \3|p
'
Объяснение подхода
-
awk
вариант:- Использование условных конструкций позволяет вам собирать значения для имени очереди, типа и глубины.
- Ваша цель заключается в том, чтобы избежать смещения полей, и этот подход гарантирует, что каждая строка будет выведена в правильном формате.
-
sed
вариант:- Регулярное выражение разбирает строку на части и собирает их в нужном порядке.
- Использование
.*
вместо\s+
позволяет обрабатывать пробелы, независимо от их количества.
Заключение
Оба приведенных выше подхода позволят вам получить нужный формат вывода для локальных очередей IBM MQ. Не забудьте протестировать выбранный вами метод в вашем окружении, чтобы удостовериться в его корректности. Если у вас возникнут дополнительные вопросы или потребуются более сложные операции, не стесняйтесь задавать вопросы.